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 が期待するものとまったく同じではありません。行が 65 文字を超えないように、 -----BEGIN PKCS7-----andを挿入して-----END PKCS7-----改行を追加する必要があります。しかし、それを行った後でも、この方法で作成した署名は有効ではありません。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 に答える