当前位置: 首页 > 知识库问答 >
问题:

Azure:通过证书从cloud worker连接到密钥库

郜彬
2023-03-14

我有一个工作进程作为Azure中的经典云服务运行。这个过程需要从Azure密钥存储库中检索一个值,并且我需要在源树之外对存储库身份验证保密。

托管身份似乎不适用于传统的云工作人员,所以我转而考虑证书。通过创建一个证书,然后在Azure Active Directory中上传应用程序注册,我已经通过证书获得了本地工作的身份验证:

New-SelfSignedCertificate -Subject "CN=MyFineCertificate" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature
private static KeyVaultClient GetClient()
{
    var certificate = GetCertificate();
    var assertion = new ClientAssertionCertificate(clientId, certificate);
    var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback((a, r, s) => GetAccessTokenUsingCert(a, r, s, assertion)));
    return client;
}

private static X509Certificate2 GetCertificate()
{
    var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    certStore.Open(OpenFlags.ReadOnly);
    var results = certStore.Certificates.Find(/* criteria */);
    return results[0];
}

private static async Task<string> GetAccessToken(string authority, string resource, string scope, ClientAssertionCertificate cert)
{
    var authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);
    var result = await authContext.AcquireTokenAsync(resource, cert);
    return result.AccessToken;
}

不幸的是,我的云工作人员找不到它。如果我在Azure上运行这个,在上传证书后,它不会出现:

foreach (StoreName name in Enum.GetValues(typeof(StoreName)))
{
    foreach (StoreLocation location in Enum.GetValues(typeof(StoreLocation)))
    {
        var certStore = new X509Store(name, location);
        certStore.Open(OpenFlags.ReadOnly);
        foreach (var res in certStore.Certificates)
        {
            /* log certificate */
        }
    }
}

为什么不出现?我是在正确的轨道上,还是完全误解了这是如何工作的?

共有1个答案

东郭俊楠
2023-03-14

你的问题有两个部分:

>

  • 方法-由于托管服务标识不能用于云服务,如何使用Azure密钥库进行工作/身份验证?

    你在正确的轨道上。我已经描述了在Azure Cloud Service配置中处理密钥存储库的类似问题的方法

     <Certificates>
         <Certificate name="MyFineCertificate" thumbprint="<my_thumbprint>" thumbprintAlgorithm="<my_thumbprint_algo e.g. sha1>" />
     </Certificates>
    
     <Certificates>
          <Certificate name="MyFineCertificate" storeLocation="LocalMachine" storeName="My" />
     </Certificates> 
    

    注意,我提到的存储位置是localmachine。现在,您应该能够通过指定正确的位置从代码访问证书。

    var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    

  •  类似资料:
    • 我正在尝试对现有API启用Azure密钥库证书。我们已经在Azure Key Vault帐户中拥有秘密和Azure Key Vault证书。下面是配置证书的代码: 在我的本地计算机上,我正确地导入了证书,其中包括下载pfx格式。

    • 我们目前使用Azure Key vault来存储某些秘密,但是现在我们要进入现场,我们需要能够使用Azure管道来更改连接的密钥vault。我无法确定一个整洁的方式通过管道做到这一点,有人有任何建议吗? 谢谢

    • 嘿,我想使用Azure密钥库加密/解密我的数据库中的数据。我看到自己和其他人都在纠结的一个主要问题是如何保护程序中的访问id和密钥。我看到有人说,如果你没有一个原生的微软应用程序(我没有,我的应用程序运行在第三方linux服务器上),你可以获得一个证书来访问密钥库。在我掏出200美元购买之前,我想知道拥有该证书意味着即使证书被盗,攻击者也不能用它来访问密钥库,对吧?我的理解是证书只能在我的域上工作

    • 我试图在Azure数据工厂中构建一个非常基本的数据流,从blob存储中提取JSON文件,对一些列执行转换,并存储在SQL数据库中。我最初使用托管标识验证存储帐户,但在尝试测试到源的连接时,我得到了以下错误: 通用域名格式。微软数据流。经纪人MissingRequiredPropertyException:account是[myStorageAccountName]的必需属性。通用域名格式。微软数据

    • 我无法访问托管密钥库中的存储帐户密钥。下面是我的代码: 似乎$secret.secretValueText为空/null。如何正确检索存储帐户密钥?这就是出现的错误。

    • 但是,这将错误地表示它无法加载证书。