X509Certificate2构造函数中的“指定的网络密码不正确”异常

时间:2013-06-18 18:18:11

标签: c# exception certificate

我有一个控制台应用程序,它从字节数组加载X509证书,如下所示:

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

certificateContent是表示pfx文件内容的byte[]。此代码适用于我测试过的许多证书。但是,我正在测试的一个证书会导致此行抛出CryptographicException,并显示消息“指定的网络密码不正确。”,即使提供的密码是正确的。

奇怪的是,我可以在LinqPad中使用相同的代码,使用相同的密码从相同的pfx文件创建证书,并且它可以正常工作。

我在调试器中检查了控制台应用程序中的调用站点,并验证了正在传入的值。

什么可能导致此构造函数在控制台应用程序中抛出此异常,但在LinqPad中不使用相同的数据,并且在其他证书的两个位置都可以正常工作?

更多详情

证书存储在Base64的数据库中。 Console应用程序从DB读取证书,将其从Base64转换为byte [],然后尝试按上述方式创建X509Certificate2对象。

我一直在测试三种证书:

  1. 我的雇主CA提供的个人客户身份验证证书。
  2. 由同事使用自己的自签名CA创建的测试证书。
  3. 我自己使用自签名CA创建的测试证书。
  4. 证书1和2在控制台应用程序和LinqPad中都按预期工作。

    证书3在LinqPad中加载正常,但如果我尝试在控制台应用程序中使用它,则会产生上述错误。

    证书2和版本之间存在两个显着差异。 3。

    1. Cert2于2016年到期,Cert3于2039年到期
    2. 与cert2关联的私钥是2048位。 Cert3是1024位。
    3. 这些差异中的任何一个都会导致“指定的网络密码不正确”错误吗?为什么所有3个证书在LinqPad中都能正常工作,但只有1个在控制台应用程序中抛出错误?

5 个答案:

答案 0 :(得分:1)

希望这会对某人有所帮助:

User "S C"指出了Windows XP和Windows Server 2003上的证书密码的以下要求。

0 < password.Length < 32

我看到有关32是否被允许的相互矛盾的报道。我可以确认我使用的是32个字符的密码(MD5哈希),并将其截断为30个字符来解决问题。

答案 1 :(得分:1)

在我的情况下,我有一个自签名证书,该证书是通过MMC(Microsoft管理控制台)通过密码导出的。在我自己的计算机(win10)上可以正常加载此证书,但是在服务器计算机(不是win10)上出现了消息“指定的网络密码不正确”的异常。

在我的情况下,什么解决了?导出证书时,我使用AES256-SHA256设置了密码,但是服务器计算机不支持此证书加密(在阅读此dotnet runtime issue之后)。当我将其更改为TripleDES-SHA1时,它在本地和服务器上都可以正常工作。

引用dotnet runtime issue

WindowsCryptographicException:发生内部错误可能意味着PFXImportCertStore失败,返回null并使用NTE_FAIL调用SetLastError。

我推测的事情可能会导致它:

  • PFX是使用不同的加密密码创建的,并且 完整性密码,而完整性密码就是所提供的 给构造函数。但是,如果相同的PFX不会是这种情况 文件可在任何Windows计算机上使用。
  • PFX是使用 PKCS12_PROTECT_TO_DOMAIN_SIDS并且存在某种问题 与另一边的广告交谈。我不认为我们会支持 PFX。 PFX是使用来自 https://tools.ietf.org/html/rfc7292#appendix-B,即使用 PBES2 + PBKDF2用于加密私钥而不是 pbeWithSHAAnd3-KeyTripleDES-CBC在这种情况下,PFX将在 Windows 10,但不是早期版本。 (至少,我认为那是 我记得碰到这种情况的行为)。 IIRC,它也不会打开 在macOS上。
  • PKCS#12 v1.1还讨论了加密和/或签名 使用非对称密码而不是基于密码的PFX 方案。但是我不知道Win10是否支持,因为我不 请参阅PFXExportCertStoreEx中的任何控件。所以唯一的事情 我可以很快想到的是,您有一个“新的” PFX 您的测试环境是Windows 10,但是您的生产环境 环境是Win2012R2。

答案 2 :(得分:0)

根据此处的uGeeen's answer,在Windows Server 2003或Windows XP上创建的证书应该有密码,否则会抛出此异常。

答案 3 :(得分: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

答案 4 :(得分:0)

以下代码对我有用。

var fileName = Path.Combine(rootPath, "cert.pfx");

if(!File.Exists(fileName)) {
    throw new FileNotFoundException("Signing Certificate is missing!");
}

var cert = new X509Certificate2(fileName,"123456789");

其中“ 123456789”是我的密码