Service Fabric本地群集无法获取证书私钥

时间:2019-01-22 22:12:36

标签: x509certificate azure-service-fabric

对于我尝试运行的每个使用一个或多个SecretsCertificate实例的Service Fabric应用程序,该应用程序无法在本地Service Fabric群集中启动,并且在SF Explorer中的Node> Application上出现以下错误:< / p>

  • Error event: SourceId='System.Hosting', Property='Activation:1.0'. There was an error during activation.Failed to configure certificate permissions. Error E_FAIL.

Service Fabric还将一些相关项目记录到“事件查看器”>“应用程序和服务日志”>“ Microsoft-Service Fabric”>“管理”部分:

  • CryptAcquireCertificatePrivateKey failed. Error:0x8009200b
  • Can't get private key filename for certificate. Error: 0x8009200b
  • All tries to get private key filename failed.
  • Failed to get the Certificate's private key.
  • Thumbprint:4XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC. Error: E_FAIL
  • Failed to get private key file. x509FindValue: 4XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC, x509StoreName: My, findType: FindByThumbprint, Error E_FAIL
  • ACLing private key filename for thumbprint 4XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC. ErrorCode=E_FAIL
  • ConfigureCertificateACLs: error=E_FAIL

我已删除并重新安装了证书(已确认可在其他多个开发人员的本地Service Fabric群集开发环境中使用),并将私钥设置为对我的NETWORK SERVICE用户具有明确的完全控制权限电脑,但无济于事。

我遵循this answer中的说明,尽管SF本地群集无法访问它,但实际上可以正确打印出私钥详细信息。

我已经重新安装了Microsoft Service Fabric SDK和Microsoft Visual Studio 2017,它们也都无法解决此问题。

在C#和PowerShell中重新创建此错误的所有尝试均无济于事,但是Service Fabric服务似乎无法从我的证书存储区访问私钥。

编辑:进一步的进展,没有解决方案。

我能够使用PowerShell Invoke-ServiceFabricDecryptText cmdlet成功解密数据,但是SF Local Cluster仍然存在相同的错误。

我确定在证书的元数据(来自previously referenced SO answerPrivateKey.CspKeyContainerInfo.UniqueKeyContainerName中指定的文件在磁盘上的路径C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\或任何相邻路径中都不存在。有人看过吗?

2 个答案:

答案 0 :(得分:3)

如评论中所述,问题与创建(自签名)证书的方式有关。使用Powershell创建证书时,请确保使用:

  

因此,当我指定 -Provider“ Microsoft增强密码   提供程序v1.0“    New-SelfsignedCertificate 命令来创建证书,它可以正常工作。

来源:https://github.com/Azure/service-fabric-issues/issues/235#issuecomment-292667379

答案 1 :(得分:0)

在您无法或不想使用自签名证书的情况下,另一种方法是“删除”私钥的CNG存储(这是Service Fabric尚无法处理的部分) )。

本文概述的步骤显示了如何将CNG证书转换为非CNG证书: https://blog.davidchristiansen.com/2016/05/521/

  1. 从PFX文件中提取公共密钥和完整证书链
openssl pkcs12 -in "yourcertificate.pfx" -nokeys -out "yourcertificate.cer" 
    -passin "pass:password"
  1. 提取CNG私钥
openssl pkcs12 -in "yourcertificate.pfx" -nocerts –out “yourcertificate.pem"
    -passin "pass:password" -passout "pass:password"
  1. 将私钥转换为RSA格式
openssl rsa -inform PEM -in "yourcertificate.pem" -out "yourcertificate.rsa"
    -passin "pass:password" -passout "pass:password"
  1. 将公钥和RSA私钥合并到新的PFX文件中
openssl pkcs12 -export -in "yourcertificate.cer" -inkey "yourcertificate.rsa" 
    -out "yourcertificate-converted.pfx" 
    -passin "pass:password" -passout "pass:password"