如何在 .net 中对 HTTPS 请求进行数字签名?

Posted

技术标签:

【中文标题】如何在 .net 中对 HTTPS 请求进行数字签名?【英文标题】:How do I digitally sign an HTTPS request in .net? 【发布时间】:2011-01-14 04:44:39 【问题描述】:

.net 中是否有使用客户端 SSL 私钥对 HTTPS 请求进行数字签名的内置程序?此外,是否有内置程序可以根据 SSL 证书验证数字签名?还是我必须自己动手?还是有第三方库?

我要签名的数据是普通的 HTTP 表单请求。例如,我提供此地址以扣除卡的余额:

https://myserver/deduction

客户端将向该地址发布一个 HTTP 表单,其中包含 card=1234567890123456、currency=1、amount=1000 等数据。这些数据是我希望我的客户端签署的数据。

我需要对请求进行数字签名,因为客户操纵金钱,所以我想确保请求确实来自客户,并且没有人篡改请求的内容。

我也在考虑使用SSL客户端证书,但它只能提供机密性和身份验证,不能提供数据完整性。

【问题讨论】:

使用 X509Certificate2 和 RSACryptoServiceProvider 应该可以解决问题。您能否解释一下您要加密的数据类型。 @Lars 我为我的问题添加了更多解释 为什么不让您的网络服务器 IIS 来处理 ssl 加密? @Pauli 实际上我的问题是关于数字签名,而不是加密 啊,现在我明白了...有点像使用证书签名进行身份验证? 【参考方案1】:

这里似乎有一个完整的示例,其中包含如何在 C# 中进行基本数字签名实现的代码http://tutorial.visualstudioteamsystem.com/details.aspx?item=134

var MySigner = new DSACryptoServiceProvider();
string publicKey;

using (var file = new FileStream(args[0], FileMode.Open, FileAccess.Read))

    using (var reader = new BinaryReader(file))
    
        var data = reader.ReadBytes((int)file.Length);

        var signature = MySigner.SignData(data);

        publicKey = MySigner.ToXmlString(false);
        Console.WriteLine("Signature: " + Convert.ToBase64String(signature));
    


var verifier = new DSACryptoServiceProvider();
verifier.FromXmlString(publicKey);

using (var file = new FileStream(args[0], FileMode.Open, FileAccess.Read))

    using (var reader = new BinaryReader(file)) 
     
        byte[] data = reader.ReadBytes((int)file .Length);

        if (verifier.VerifyData(data, signature))
            Console.WriteLine("Signature");
        else
            Console.WriteLine("Signature is not verified");
    

【讨论】:

感谢您的链接。所以就我而言,首先我必须序列化我的 HTTP 表单数据,然后对序列化的字符串进行签名(IOW 滚动我自己的签名程序)

以上是关于如何在 .net 中对 HTTPS 请求进行数字签名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Web 应用程序中对 PDF 文档进行数字签名?

防止在 asp.net 5 (vNext) 中对预检 OPTIONS 请求进行基于令牌的授权

在Javascript中对地址数组进行排序[重复]

Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序

python中对cookie进行添加更新和删除

如果您可以在 7 次比较中对 5 个数字进行排序,那么如何在 10 次比较中对 6 个数字进行排序?