这是我尝试启用的方案:
我希望通过客户端证书从我的网络服务应用程序(天蓝色服务架构)验证azure keyvault。
这些是我正在遵循的步骤:
一切看起来都不错。当我启动我的服务(本地服务结构集群),并尝试连接到keyvault以检索我存储在其中的密钥+值时,我收到错误:
CryptographicException:“KeySet不存在”
当我尝试在运行时检查X509Certificate2对象的PrivateKey属性值时,它会抛出相同的异常。
找到证书,并且存在私钥(我通过MMC以及一些命令行工具验证了这一点。)
我能错过什么?只有我能想到这个失败的原因是服务架构用户上下文(网络服务,我认为)没有权限查看私钥?它存储在“LocalMachine”证书商店下 个人“文件夹(也称为”我的“)。据我所知,应用程序应该能够从没有特殊权限的LocalMachine商店读取?
答案 0 :(得分:5)
在证书私钥上授予NETWORK SERVICE
用户权限的另一种更简单的方法(比我的其他答案更容易):
WIN
+ R
- >键入mmc
- >档案 - >添加/删除管理单元 - >添加证书(计算机帐户)。 Read
用户NETWORK SERVICE
权限
醇>
答案 1 :(得分:0)
好的,我的怀疑是正确的。我明确授予Network Service
用户(运行本地服务结构集群的用户上下文)访问私钥文件的权限。现在我可以使用keyvault进行身份验证。
cacls.exe "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\{private-key-filename}" /e /g "Network Service":R
我通过工具程序“FindPrivateKey.exe”找到了私钥位置
findprivatekey.exe My LocalMachine -t "{thumbprint}" -a
可以从https://www.microsoft.com/en-us/download/confirmation.aspx?id=21459
获取工具(这是位于目录\WCF\Setup\FindPrivateKey\CS\FindPrivateKey.sln
中的源代码示例,您需要自己构建它)
答案 2 :(得分:0)
我遇到了同样的问题,并且授予Network Service
读取权限对我来说很有效。还有另一种以本地系统用户身份运行运行高特权服务的方法,如下所示:
https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-run-script-at-service-startup
您可以将Service Fabric ApplicationManifest.xml修改为
最终的ApplicationManifest.xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
<ServiceManifestImport>
...
<Policies>
<RunAsPolicy CodePackageRef="Code" UserRef="LocalSystemUser" /> <!-- 2. run service fabric as defined principal -->
</Policies>
</ServiceManifestImport>
<Principals>
<Users>
<User Name="LocalSystemUser" AccountType="LocalSystem" /> <!-- 1. define principal -->
</Users>
</Principals>
</ApplicationManifest>