2

对于我正在开发的应用程序,我需要先创建一个签名文件,然后才能上传文件。它的文档解释了如何使用 openssl 执行此操作:

首先你需要准备好你的密钥:

$ openssl pkcs12 -in certificate.pfx -passin pass:xxxxxxxxxx -out pem -clcerts -nokeys
$ openssl pkcs12 -in certificate.pfx -passin pass:xxxxxxxxxx -passout pass:xxxxxx -out key

之后,您可以使用以下语法签署任何文件:

$ openssl smime -sign -in inputfile -signer pem -inkey key -passin pass:xxxxxx -outform PEM -out signaturefile

这行得通,但如果可以使用本机 .NET 代码来创建签名文件,我宁愿避免运行外部程序来创建签名文件。

我试图在 vb.net 中对此进行编码并得到以下信息:

Public Shared Sub SignFile(ByVal theFilename As String, ByVal theCertFile As String, ByVal thePassword As String, ByVal theDestination As String)
    Dim aCertificate = New X509Certificates.X509Certificate2(theCertFile, thePassword)
    Dim aByteArray = IO.File.ReadAllBytes(theFilename)
    Dim anOid = New System.Security.Cryptography.Oid("1.2.840.113549.1.7.2")
    Dim aContentInfo = New Pkcs.ContentInfo(anOid, aByteArray)
    Dim aSignedCms = New Pkcs.SignedCms(aContentInfo, True)
    Dim aCmsSigner = New Pkcs.CmsSigner(Pkcs.SubjectIdentifierType.IssuerAndSerialNumber, aCertificate)

    aSignedCms.ComputeSignature(aCmsSigner)
    Dim aSignature = Convert.ToBase64String(aSignedCms.Encode())
    IO.File.WriteAllText(theDestination, Convert.ToBase64String(anOutput.ToArray()))
End Sub

它制作的文件并不完全符合 openssl 的预期:我仍然需要插入-----BEGIN PKCS7-----and-----END PKCS7-----并添加换行符,以便行不超过 65 个字符。但是,即使这样做了,我以这种方式制作的签名也是无效的,当我使用 openssl 检查时,我收到以下错误:

5768:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest failure:.\crypto\pkcs7\pk7_doit.c:1051:
5768:error:21075069:PKCS7 routines:PKCS7_verify:signature failure:.\crypto\pkcs7\pk7_smime.c:410:

我想我在某个地方忘记了一个小细节,但我无法弄清楚是什么。

任何人都可以帮助我使该代码正常工作吗?如果没有,请指向具有此类功能的 .NET 库,并可能提供如何执行此操作的示例?

4

1 回答 1

1

您添加了哪些确切的换行符?CRLF 还是只是 LF?

我在验证 smime 消息时遇到了类似的问题。我找到了原因。OpenSSL 将换行符更改为 CRLF(我的消息仅使用 LF),因此内容与原始内容不同并且摘要检查失败。可能是你的情况吗?不幸的是我找不到解决方案。

于 2010-10-19T12:30:03.470 回答