对于我正在开发的应用程序,我需要先创建一个签名文件,然后才能上传文件。它的文档解释了如何使用 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 库,并可能提供如何执行此操作的示例?