从 Azure 密钥保管库存储和检索 JKS

Posted

技术标签:

【中文标题】从 Azure 密钥保管库存储和检索 JKS【英文标题】:Storing and retriveing a JKS from Azure key vault 【发布时间】:2018-07-31 05:24:18 【问题描述】:

我想引用 Azure Key vault 中的 Java 密钥存储,而不是将其与作为 Docker 映像部署到 Kubernetes 集群中的 Spring Boot 应用程序一起打包。

根据 Azure 文档,仅允许将 .PFX 文件导入 Key Vault。目前,我成功地从 Spring Boot 中打包和检索 JKS,但我正在寻找更安全的方法并希望在代码库之外拥有我的证书。

任何指针和代码 sn-ps 都会有所帮助。

【问题讨论】:

【参考方案1】:

我知道这很旧,但回答这个问题是因为我遇到了完全相同的问题,并且必须阅读很多内容才能弄清楚。

Tutorial from Microsoft

这篇文章会给你一个很好的概述。

总而言之,如果您想使用存储在 azure 密钥库中的自签名证书为您的应用程序启用 SSL,以下是步骤

    在你的 pom 中添加 azure-spring-boot-starter-keyvault-certificates 依赖项。

    如下添加ssl配置和keyvault配置

    server:
      port: 8443
      ssl:
        key-alias: <keystore name>
        key-store-password: <password>
        keyStoreType: AzureKeyVault
        key-store-type: AzureKeyVault
    
    azure:
      keyvault:
        uri: <keystore uri>
        client-id: <client-id>
        client-secret: <secret>
        enabled: true
        tenant-id: <tenant-id>
    
    

这将在您的应用程序上启用 ssl 并使用来自 azure 的密钥存储用于 https。

如果您只需要为出站 TLS 加载信任库,事情会简单一些。您只需要如下配置密钥保管库。


    azure:
      keyvault:
        uri: <keystore uri>
        client-id: <client-id>
        client-secret: <secret>
        enabled: true
        tenant-id: <tenant-id>

然后,使用密钥库初始化您的 SSLContext。


    KeyStore azureKeyVaultKeyStore = KeyStore.getInstance("AzureKeyVault");
            KeyVaultLoadStoreParameter parameter = new KeyVaultLoadStoreParameter(
                    System.getProperty("azure.keyvault.uri"),
                    System.getProperty("azure.keyvault.tenant-id"),
                    System.getProperty("azure.keyvault.client-id"),
                    System.getProperty("azure.keyvault.client-secret"));
            azureKeyVaultKeyStore.load(parameter);
            SSLContext sslContext = SSLContexts.custom()
                    .loadTrustMaterial(azureKeyVaultKeyStore, null)
                    .build();

这会将密钥保管库中可用的所有证书加载到信任存储区。如果您只需要出站 TLS 的证书,我不确定是否需要这样做,因为 Azure 密钥保管库只能存储包含私钥和公钥对的证书。

【讨论】:

感谢您的详细解释。但我想通过 Spring Boot 应用程序中的 Azure Key vault 证书对 kafka 消费者验证执行类似的步骤。任何帮助将不胜感激。【参考方案2】:

一种解决方案是将密钥作为 base64 编码字符串作为键/值对存储在 Azure 密钥保管库中,将其设置为环境变量,然后在构建中将其解码为服务器上的文件。

编码:openssl base64 -A -in keystore.jks

从 Azure Key Vault 设置为环境变量

解码:echo $KEYSTORE_BASE64 | base64 --decode &gt; keystore.jks

【讨论】:

@Riddle 之类的。我最终将密钥作为环境变量保存在我的 CI 管道中,但我已将 base64 加密字符串存储在 Azure 密钥库以及备份中。

以上是关于从 Azure 密钥保管库存储和检索 JKS的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 azure JavaScript 函数和 Key Vault 机密检索 cosmosDB 数据

如何读取存储在 Azure 密钥保管库中的值/秘密

是否可以使用密钥保管库加密文件并使用“Azure 存储数据移动库”将其存储在存储帐户中

Azure 函数 - 从 Azure 密钥保管库获取服务总线连接字符串

从密钥保险库将证书上载到App Service

如何使用托管在本地 IIS 上的 Web 应用从 Azure 密钥保管库访问 web.config 中的应用设置和连接字符串等机密