OpenSSL 和 C# 之间的不同 S/MIME 签名
Posted
技术标签:
【中文标题】OpenSSL 和 C# 之间的不同 S/MIME 签名【英文标题】:Different S/MIME signature between OpenSSL and C# 【发布时间】:2012-07-16 14:45:25 【问题描述】:我正在尝试在我的 .Net 程序中使用 OpenSSL 代码。代码如下:
openssl pkcs12 -in "My PassKit Cert.p12" -clcerts -nokeys -out certificate.pem
openssl pkcs12 -in "My PassKit Cert.p12" -nocerts -out key.pem
smime -binary -sign -signer certificate.pem -inkey key.pem -in manifest.json -out signature -outform DER
我尝试使用 .Net OpenSSL,但我完全不知道如何使用它,而且我找不到合适的文档。我决定使用 .Net 来执行相同的签名过程,代码如下:
var dataToSign = System.IO.File.ReadAllBytes(filePathToSign);
ContentInfo contentInfo = new ContentInfo(dataToSign);
X509Certificate2 signerCert = new X509Certificate2(System.IO.File.ReadAllBytes(signerPfxCertPath), signerPfxCertPassword);
var signedCms = new SignedCms(contentInfo, true);
var signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, signerCert);
signer.IncludeOption = X509IncludeOption.EndCertOnly;
signedCms.ComputeSignature(signer);
var myCmsMessage = signedCms.Encode();
var buf = Encoding.Convert(Encoding.UTF7, Encoding.UTF8, myCmsMessage);
return Encoding.UTF8.GetString(buf, 0, buf.Length);
但是 C# 和 OpenSSL 之间的结果是不一样的。有人可以帮帮我吗?
提前致谢!
【问题讨论】:
我遇到了同样的问题。我可以轻松地计算出清单计算,但这一点也不适合我。我怀疑你需要用完整的证书签名,而不仅仅是你回来的那一点,但我不确定(还) 【参考方案1】:我终于搞定了!
首先,你必须到这里,安装苹果ROOT证书:
http://www.apple.com/certificateauthority/
(这是第一个)。将其安装到您信任的根权限中。 Mac 已经有这个了。
其次,将开发者证书安装为受信任的根权限,它位于开发者门户中,您可以在其中添加设备、制作 passkit 密钥等等
https://developer.apple.com/ios/manage/certificates/team/index.action
(您需要登录)
然后您需要在开发门户中生成您的 passkit 密钥,下载它,将其安装在您的 Mac 上,然后将其与私钥一起导出为 .p12 文件。
然后您可以将此文件移动到 Windows 机器上并使用它。在生成清单后,我使用了这段代码:
var cert = new X509Certificate2(@"path-to-your.p12", "password");
var buffer = File.ReadAllBytes(Path.Combine(basePath, "manifest.json"));
ContentInfo cont = new ContentInfo(buffer);
var cms = new SignedCms(cont, true);
var signer = new CmsSigner(SubjectIdentifierType.SubjectKeyIdentifier, cert);
signer.IncludeOption = X509IncludeOption.ExcludeRoot;
cms.ComputeSignature(signer);
var myCmsMessage = cms.Encode();
File.WriteAllBytes(Path.Combine(basePath, "signature"), myCmsMessage);
对不起,这是相当混乱的代码,但它可以工作:)
别忘了设置
"passTypeIdentifier" : "pass.com.yourcompany.NameOfYourPass", "teamIdentifier" : "你的团队 ID",
在 pass.json 中!
【讨论】:
我还必须安装全球开发者关系证书,才能将 passkit 链正确地放到根目录 您对我们如何包含此 WWDR 中级证书有任何想法吗? 是的,我还必须添加 WWDR 证书才能正常工作,但其他一切都很好。以上是关于OpenSSL 和 C# 之间的不同 S/MIME 签名的主要内容,如果未能解决你的问题,请参考以下文章