【问题标题】:Get certificates from Azure KeyVault to Keystore in Kotlin/SpringBoot for outgoing requests将证书从 Azure KeyVault 获取到 Kotlin/SpringBoot 中的密钥库以用于传出请求
【发布时间】:2023-01-22 22:46:58
【问题描述】:

对于某些 API 请求,我的后端需要一个证书。目前 .p12 在存储库中进行版本控制,并在初始化时加载到 WebClient 中,如下所示:

private fun getWebClient(): WebClient {
        val ks: KeyStore = KeyStore.getInstance("PKCS12")
        ks.load(ClassPathResource("keystore.p12").inputStream, config.trustStorePassword.toCharArray())
        val kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())
        kmf.init(ks, config.trustStorePassword.toCharArray())

        val sslContext = SslContextBuilder
            .forClient()
            .keyManager(kmf)
            .build()

        val httpClient: HttpClient = HttpClient.create().secure { sslSpec -> sslSpec.sslContext(sslContext) }

        return WebClient
            .builder()
            .baseUrl(config.BaseUrl)
            .clientConnector(ReactorClientHttpConnector(httpClient))
            .build()
    }

我想更改它,因为后端已部署到 Azure App Service。我已经创建了一个 KeyVault 并导入了证书,并通过托管身份授予了对应用服务的访问权限。

我目前正在努力从 KeyVault 加载 Spring Boot 中的密钥库。作为参考,我正在尝试关注https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault-certificates

它使用显然已弃用的 azure.keyvault.uri 属性,因此我使用 spring.cloud.azure.keyvault.certificate.endpoint

文档还指出:

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

但是,我无法解析 KeyVautLoadStoreParameter 类。

我正在使用 spring boot 2.7.7 和

implementation("com.azure.spring:spring-cloud-azure-starter:4.5.0")
implementation("com.azure.spring:spring-cloud-azure-starter-keyvault:4.5.0")

对于加载证书和配置 WebClient 的任何帮助,我们将不胜感激。

【问题讨论】:

    标签: spring-boot azure ssl-certificate webclient azure-keyvault


    【解决方案1】:
    • 您可以做的是在 azure AD 中创建应用程序注册,然后通过 azure keyvault 中的访问策略授予对此应用程序注册的访问权限。

    • 现在从应用程序注册中收集 clientId 、Tenant Id 和 client Secret

    • certificates&secret 选项卡中创建密钥,然后单击新注册。

    • 现在按照以下格式创建application.yaml文件

      
    server:  
      ssl:  
        key-alias: TestCertificate  
        key-store-type: AzureKeyVault  
        trust-store-type: AzureKeyVault  
      port: 8443  
    azure:  
      keyvault:  
        uri: <KEYVAULT URL> 
        client-id: <CLIENT_ID FROM APP REGISTRATIOM>  
        client-secret: <CLIENT_SECRET FROM APP REGISTRATIOM> 
        enabled: true  
        tenant-id: <TENANT_ID FROM APP REGISTRATIOM> 
    
    • 现在您可以使用以下程序从 Azure Key Vault 导入所有凭据。
    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();
    
    // Here I am cross check wether we have imported the certificate name " TestCertificate"
    
    if(azureKeyVaultKeyStore.containsAlias("TestCertificate"))  
    {  
       System.out.println("The Certificate Exists ");  
    }  
    else {  
       System.out.println("Error Has Occured");  
    }
    
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多