我们有一个托管在 Azure 中的 Web 应用程序,用于从 KeyVault 加载证书,以用于与其他服务进行加密和身份验证。从 KeyVault 读取值后,我们将创建如下所示的证书:
return new X509Certificate2(Convert.FromBase64String(secret.Value), string.Empty,
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable);
我们看到了很多关于"密钥集不存在"和"请求已中止:无法创建 SSL/TLS 安全通道"的错误。
我怀疑这是因为它将私钥保存到磁盘(C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys(,这在尝试再次读取它时会导致问题,因为它是一个共享托管环境,我们并不完全拥有这台机器。
有没有正确的方法可以做到这一点?我已经看到了使用证书存储的引用,但我不太确定这与从 KeyVault 获取证书有何关系。
我认为更好的解决方案是使用托管服务身份(MSI((如果适用(。MSI 功能将在 Azure AD 中创建一个服务主体来表示服务/VM 的标识。并在密钥保管库中分配此服务主体属性角色或权限,这可以通过在密钥保管库的"设置 ->访问策略"部分中创建新的访问策略来完成。服务主体应与服务名称相同。如果通过Powershell创建,则此名称可能会有所不同。
进行 MSI 设置后,可以将证书或机密上传到密钥保管库并在服务中访问。
有没有正确的方法可以做到这一点?我已经看到了使用证书存储的引用,但我不太确定这与从 KeyVault 获取证书有何关系。
在你的情况下,似乎只是从密钥保管库加载证书,但证书未部署到 Azure Web 应用。有关如何通过密钥保管库部署 Azure Web 应用证书,可以从此博客获取详细步骤。
在 Azure Web App中使用证书的最简单方法是,可以从 Azure 门户将 pfx 文件上传到 Azure Web App,并添加名为 WEBSITE_LOAD_CERTIFICATES 的应用设置,并将其值设置为证书的指纹。但与KeyVault没有任何关系。