我们有一个Azure函数。NET 4.7.2)运行一年,使用客户端证书向web服务发送消息。这个证书必须更新,但现在我们已经完成了,我们在发送消息时收到这个异常;
System.Security.Cryptography.CryptographicException: Invalid provider type specified.
Azure读取私钥有问题,问题似乎是从我的本地机器导出的。这个问题是源于原来的企业社会责任吗?以前的证书仍然可以正常工作,只要它是有效的。请注意,我可以使用本地计算机上的新证书发送消息。我尝试过的事;
- 使用MMC设置的所有组合导出。pfx文件
- 使用https://stackoverflow.com/a/34103154/6033193中的答案将证书密钥转换为RSA格式并上传新的结果。pfx
- 使用
CertUtil.exe -store -user my
比较新旧证书。它们都有提供者Microsoft Enhanced Cryptographic Provider v1.0
,除了哈希和名称之外,它们看起来是一样的。 - 从设置中删除Azure密钥库并将pfx直接上传到应用程序服务
- 从本地文件夹读取。pfx并像这样使用它:
new X509Certificate2(certByes, "password", X509KeyStorageFlags.PersistKeySet);
。这是有效的,所以当上传。pfx文件到Azure门户时,似乎有些问题。
还有什么我可以尝试的吗?
为前一个证书工作的提供程序不再为新证书工作。我有一种预感,加密出了问题,因为袋子属性不包含LocalKeyID信息,但我不能肯定地说。
无论如何,将提供商更改为"Microsoft Platform Crypto provider";使私钥在Azure中可访问。使用OpenSSL:
首先从。pfx文件中导出。key和公开的。pem部分;
openssl pkcs12 -in cert.pfx -out cert_publicpart.pem -nokeys
openssl pkcs12 -in cert.pfx -out cert_privatekey.key -nocerts
如果它是加密的,它会在每个命令后询问您的密码。
然后,将其转换回指定提供者的.pfx;
openssl pkcs12 -export -in cert_publicpart.pem -inkey cert_privatekey.key -out cert_newCSP.pfx -CSP "Microsoft Platform Crypto Provider"
,指定一个密码,新的.pfx应该走好!
可选,如果您想要验证CSP:
openssl pkcs12 -in "cert_newCSP.pfx" -out "cert_newCSP.pem"
打开.pem文件,找到-----BEGIN ENCRYPTED PRIVATE KEY-----
,并在其上方寻找Microsoft CSP Name: Microsoft Platform Crypto Provider
。