You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot 2.7访问Azure KeyVault时遇SslHandshakeTimeoutException

问题:SpringBoot连接Azure KeyVault出现SSL握手超时错误

正在学习从Azure KeyVault获取密钥,已使用个人账号创建了KeyVault,但在SpringBoot应用中尝试连接时出现SSL握手超时错误,怀疑问题出在KeyVault的访问控制等配置上,希望得到排查建议。

错误日志

2023-06-14 19:45:27.239 INFO 7360 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-06-14 19:45:27.255 INFO 7360 --- [  restartedMain] c.example.demo.KeyvaultDemoApplication   : Started KeyvaultDemoApplication in 2.898 seconds (JVM running for 3.904)
2023-06-14 19:45:38.765 ERROR 7360 --- [  restartedMain] c.a.c.http.netty.NettyAsyncHttpClient    : io.netty.handler.ssl.SslHandshakeTimeoutException: handshake timed out after 10000ms
2023-06-14 19:45:38.775 WARN 7360 --- [ctor-http-nio-1] r.netty.http.client.HttpClientConnect    : [379c4b95, L:/MY_IP:57095 - R:my_key_vault.vault.azure.net/SOME_IP:443] The connection observed an error

io.netty.handler.ssl.SslHandshakeTimeoutException: handshake timed out after 10000ms
    at io.netty.handler.ssl.SslHandler$7.run(SslHandler.java:2125) ~[netty-handler-4.1.92.Final.jar:4.1.92.Final]
    at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:153) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]

application.properties配置

spring.cloud.azure.keyvault.secret.endpoint=https://my_key_vault.vault.azure.net/

SpringBoot主类代码

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.azure.security.keyvault.secrets.SecretClient;

@SpringBootApplication
public class KeyvaultDemoApplication implements CommandLineRunner {


    // Spring Cloud Azure will automatically inject SecretClient in your ApplicationContext.
    @Autowired
    private final SecretClient secretClient;


    public KeyvaultDemoApplication(SecretClient secretClient) {
        this.secretClient = secretClient;
    }


    @Override
    public void run(String... arg0) throws Exception {
        System.out.println("h2url: " + secretClient.getSecret("dbPassword").getValue());
    }


    public static void main(String[] args) {
        SpringApplication.run(KeyvaultDemoApplication.class, args);
    }
}

自定义配置类代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;


@Configuration
public class SecretClientConfiguration {

    @Bean
    public SecretClient createSecretClient() {
        return new SecretClientBuilder().vaultUrl("https://my_key_vault.vault.azure.net/
").credential(new DefaultAzureCredentialBuilder().build()).buildClient();
        }
    }

排查建议

  • 网络连通性检查

    • 验证本地网络可访问KeyVault端点:用curl https://my_key_vault.vault.azure.net/或浏览器访问,若返回401/登录页面则网络正常;若超时则需排查代理、防火墙或公司网络限制。
    • 若使用代理,需在配置中添加代理信息:可在application.properties设置spring.cloud.azure.proxy.host、spring.cloud.azure.proxy.port,或为Azure SDK配置代理环境变量。
  • KeyVault权限配置检查

    • 确认个人Azure账号在KeyVault的**访问控制(IAM)**中拥有Key Vault Secrets User或更高权限(如Key Vault Contributor)。
    • 若KeyVault使用Vault访问策略而非IAM,需确保该账号拥有Secrets的Get权限。
  • 代码配置修正

    • 配置类中vaultUrl存在换行符:"https://my_key_vault.vault.azure.net/\n"会导致URL无效,需删除换行,改为"https://my_key_vault.vault.azure.net/"。
    • 自动配置与自定义Bean冲突:同时使用Spring Cloud Azure自动配置(application.properties中的端点配置)和自定义SecretClient Bean会导致冲突,建议二选一:要么删除自定义配置类,依赖自动注入;要么保留配置类,移除application.properties中的相关配置。
    • 本地身份验证:确保DefaultAzureCredential能正确获取身份,可通过az login登录Azure CLI(DefaultAzureCredential会自动读取CLI身份),或设置环境变量AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_TENANT_ID。
  • SSL证书问题排查

    • 检查本地JVM信任库是否包含Azure SSL证书,若公司代理替换了证书,需将对应证书导入JVM cacerts;测试环境可临时禁用SSL验证(生产环境禁止)。

内容的提问来源于stack exchange,提问作者hell_storm2004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:00:33