6

次のように、バイト配列から X509 証明書をロードするコンソール アプリケーションがあります。

var cert = new X509Certificate2(certificateContent,      // byte[]
                                password,                // string
                                X509KeyStorageFlags.PersistKeySet);

certificateContentpfx ファイルの内容をbyte[]表す です。このコードは、私がテストした多くの証明書で問題なく動作します。ただし、私がテストしている証明書が 1 つあります。これにより、CryptographicException指定されたパスワードが正しい場合でも、この行で「指定されたネットワーク パスワードが正しくありません。」というメッセージがスローされます。

奇妙な部分は、LinqPad で同じコードを使用して、同じパスワードで同じ pfx ファイルから証明書を作成できることです。

デバッガーのコンソール アプリケーションで呼び出しサイトを確認し、正しい値が渡されていることを確認しました。

このコンストラクターが、同じデータを使用する LinqPad ではなく、コンソール アプリでこの例外をスローし、他の証明書の両方の場所で正常に動作する原因は何ですか?

詳細

証明書は Base64 のデータベースに保存されます。コンソール アプリは DB から証明書を読み取り、それを Base64 から byte[] に変換してから、X509Certificate2上記のようにオブジェクトを作成しようとします。

私がテストした3つの証明書があります:

  1. 私の雇用主の CA から提供された私の個人的なクライアント認証証明書。
  2. 同僚が独自の自己署名 CA を使用して作成したテスト証明書。
  3. 自己署名 CA を使用して自分で作成した独自のテスト証明書。

証明書 1 と 2 は、コンソール アプリと LinqPad の両方で期待どおりに機能します。

証明書 3 は LinqPad では正常に読み込まれますが、コンソール アプリで使用しようとすると上記のエラーが発生します。

証明書 2 と 3 の間には 2 つの大きな違いがあります。

  1. Cert2 は 2016 年に期限切れになり、Cert3 は 2039 年に期限切れになります
  2. cert2 に関連付けられた秘密鍵は 2048 ビットです。Cert3 は 1024 ビットです。

これらの違いのいずれかにより、「指定されたネットワーク パスワードが正しくありません」というエラーが発生する可能性はありますか? また、LinqPad では 3 つの証明書すべてが正常に機能するのに、コンソール アプリでは 1 つだけがエラーをスローするのはなぜですか?

4

5 に答える 5

2

うまくいけば、これは誰かを助けるでしょう:

ユーザー「S C」は、Windows XP および Windows Server 2003 での証明書パスワードに関する次の要件を指摘しています。

0 < password.Length < 32

32 が許可されているかどうかについて、矛盾するレポートを見てきました。32 文字のパスワード (MD5 ハッシュ) を使用していたことを確認でき、それを 30 文字に切り詰めることで問題が解決しました。

于 2014-10-24T19:35:48.963 に答える
0
Public Function sign(keystore As String, level As Integer, src As String, name As String,dest As String, sig As String, pass As String)

        'Dim store As System.Security.Cryptography.X509Certificates.X509Store = New System.Security.Cryptography.X509Certificates.X509Store
        'store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly)
        'Dim sel As System.Security.Cryptography.X509Certificates.X509Certificate2Collection

        ' If sig <> "" And pass <> "" Then
        Try


            Dim y As Int16 = 200
            ' For i As Integer = 0 To sel.Count - 1
            Dim pdfReader As PdfReader = New PdfReader(src)
            Dim signedPdf = New FileStream(dest, FileMode.Create)
            Try
                Dim cert As X509Certificate2 = New X509Certificate2(sig, pass)

                Dim cp As Org.BouncyCastle.X509.X509CertificateParser = New Org.BouncyCastle.X509.X509CertificateParser()
                Dim chain As Org.BouncyCastle.X509.X509Certificate() = New Org.BouncyCastle.X509.X509Certificate() {cp.ReadCertificate(cert.RawData)}




                Dim stamper As PdfStamper
                stamper = PdfStamper.CreateSignature(pdfReader, signedPdf, "0"c, Nothing, True)
                Dim signatureAppearance As PdfSignatureAppearance = stamper.SignatureAppearance
                'signatureAppearance.SignatureGraphic = Image.GetInstance(pathToSignatureImage)
                signatureAppearance.SetVisibleSignature(name)

                signatureAppearance.CertificationLevel = level
                Dim externalSignature As IExternalSignature = New X509Certificate2Signature(cert, "SHA-1")
                ' Dim digest As IExternalSignature = New BouncyCastleDigest
                ' signatureAppearance.s 
                'signatureAppearance.SetVisibleSignature(New Rectangle(50,50,50,
                signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION
                MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, Nothing, Nothing, Nothing, 0, CryptoStandard.CADES)
                ' MakeSignature. 



            Catch ex As Exception

                MsgBox("Signature File Password is not correct for the user Id :" & error_userid)
                'Exit Function
            End Try
        Catch ex As Exception
            'MsgBox(ex.Message)
        End Try
        ' End If
        Return 0
    End Function
于 2014-07-24T07:53:01.510 に答える