我有一个控制台应用程序,它从字节数组加载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和2在控制台应用程序和LinqPad中都按预期工作。
证书3在LinqPad中加载正常,但如果我尝试在控制台应用程序中使用它,则会产生上述错误。
证书2和版本之间存在两个显着差异。 3。
这些差异中的任何一个都会导致“指定的网络密码不正确”错误吗?为什么所有3个证书在LinqPad中都能正常工作,但只有1个在控制台应用程序中抛出错误?
答案 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时,它在本地和服务器上都可以正常工作。
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”是我的密码