使用 X509 证书进行消息签名
Posted
技术标签:
【中文标题】使用 X509 证书进行消息签名【英文标题】:Message Signing using X509 certificate 【发布时间】:2014-01-06 16:44:35 【问题描述】:我正在使用以下代码在 asp.net 网络服务中使用数字证书签署消息。 签名工作正常,预计 signedMessage.ComputeSignature 行最多需要 30 到 40 秒,因为我面临超时异常。当我在 Windows 窗体应用程序下运行时,相同的代码会在几分之一秒内产生结果。任何线索或帮助。
public static string Encrypt(string fullMessage, string certificateName, bool deAttch)
X509Certificate2 signer = GetCertificate(certificateName);
byte[] contentBytes = Encoding.ASCII.GetBytes(fullMessage);
Oid contentOid = new Oid("1.2.840.113549.1.7.1", "PKCS 7 Data");
SignedCms signedMessage = new SignedCms(new ContentInfo(contentOid, contentBytes), deAttch);
signedMessage.ComputeSignature(new CmsSigner(signer));
byte[] signedBytes = signedMessage.Encode();
return Convert.ToBase64String(signedBytes).Trim();
【问题讨论】:
【参考方案1】:我不确定这是否应该是一个答案(我不知道它会造成什么影响,但我会找出答案)。只是设置一个属性
cert.IncludeOption = X509IncludeOption.EndCertOnly;
的
CmsSigner cert = new CmsSigner(signer);
以前我使用构造函数创建对象并直接传递给方法。现在它工作正常,不需要花费太多时间。
public static string Encrypt(string fullMessage, string certificateName, bool deAttch)
X509Certificate2 signer = GetCertificate(certificateName);
byte[] contentBytes = Encoding.ASCII.GetBytes(fullMessage);
Oid contentOid = new Oid("1.2.840.113549.1.7.1", "PKCS 7 Data");
SignedCms signedMessage = new SignedCms(new ContentInfo(contentOid, contentBytes), deAttch);
CmsSigner cert = new CmsSigner(signer);
cert.IncludeOption = X509IncludeOption.EndCertOnly;
signedMessage.ComputeSignature(cert);
byte[] signedBytes = signedMessage.Encode();
return Convert.ToBase64String(signedBytes).Trim();
private static X509Certificate2 GetCertificate(string certificateName)
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2 certificate = store.Certificates.Cast<X509Certificate2>().Where(cert => cert.Subject.IndexOf(certificateName) >= 0).FirstOrDefault();
if (certificate == null)
throw new Exception("Certificate " + certificateName + " not found.");
return certificate;
【讨论】:
我彻底检查了 X509IncludeOption.EndCertOnly 它减少了签名的长度,这意味着签名中只包含个人证书。 与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?. @JohnSaunders ok 下次会考虑这个 它也对我有用,你可以标记这个答案! :)以上是关于使用 X509 证书进行消息签名的主要内容,如果未能解决你的问题,请参考以下文章
iOS适配HTTPS,创建一个自签名的SSL证书(x509)具体步骤