6

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

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

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

奇怪的是,我可以在 LinqPad 中使用相同的代码,使用相同的密码从相同的 pfx 文件创建证书,而且效果很好。

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

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

更多细节

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

我一直在测试三个证书:

  1. 我的雇主的 CA 提供的我的个人客户身份验证证书。
  2. 同事使用自己的自签名 CA 创建的测试证书。
  3. 我自己使用自签名 CA 创建的测试证书。

证书 1 和 2 在控制台应用程序和 LinqPad 中都按预期工作。

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

证书 2 和 3 之间有两个显着差异。

  1. Cert2 于 2016 年到期,Cert3 于 2039 年到期
  2. 与 cert2 关联的私钥是 2048 位。Cert3 是 1024 位。

这些差异中的任何一个是否会导致“指定的网络密码不正确”错误?为什么所有 3 个证书在 LinqPad 中都能正常工作,但只有 1 个在控制台应用程序中抛出错误?

4

5 回答 5

3

就我而言,我有一个自签名证书,我通过 MMC(微软管理控制台)使用密码导出了该证书。在我自己的机器(win10)上加载此证书很好,但在服务器机器(不是 win10)上出现异常消息“指定的网络密码不正确”。

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

引用dotnet 运行时问题

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

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

  • PFX 是使用不同的加密密码和完整性密码创建的,而完整性密码是提供给构造函数的密码。但如果相同的 PFX 文件适用于任何 Windows 机器,情况就不会如此。
  • PFX 是使用 PKCS12_PROTECT_TO_DOMAIN_SIDS 创建的,在另一端与 AD 交谈时存在某种问题。我认为我们不支持这种 PFX。PFX 是使用 https://www.rfc-editor.org/rfc/rfc7292#appendix-B的指导生成的,即使用 PBES2+PBKDF2 来加密私钥而不是 pbeWithSHAAnd3-KeyTripleDES-CBC 在这种情况下,PFX 将在 Windows 10 上打开,但不是以前的版本。(至少,我认为这是我记得在这个案例中遇到的行为)。IIRC 也无法在 macOS 上打开。
  • PKCS#12 v1.1 还谈到了使用非对称加密而不是基于密码的方案来加密和/或签署 PFX。但我不知道 Win10 是否支持它,因为我在 PFXExportCertStoreEx 中没有看到任何控件。所以我能很快想到的唯一有意义的事情是你有一个“新的”PFX,你的测试环境是 Windows 10,但你的生产环境是 Win2012R2。
于 2020-08-05T07:58:40.797 回答
2

希望这会帮助某人:

用户“SC”指出了 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 回答
0

根据uGeeen在这里的回答,在 Windows Server 2003 或 Windows XP 上创建的证书应该有密码,否则会抛出这个异常。

于 2013-09-27T17:48:18.387 回答
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”是我的密码

于 2019-11-26T15:01:41.333 回答