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端点:用
KeyVault权限配置检查
- 确认个人Azure账号在KeyVault的**访问控制(IAM)**中拥有
Key Vault Secrets User或更高权限(如Key Vault Contributor)。 - 若KeyVault使用Vault访问策略而非IAM,需确保该账号拥有Secrets的
Get权限。
- 确认个人Azure账号在KeyVault的**访问控制(IAM)**中拥有
代码配置修正
- 配置类中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。
- 配置类中vaultUrl存在换行符:
SSL证书问题排查
- 检查本地JVM信任库是否包含Azure SSL证书,若公司代理替换了证书,需将对应证书导入JVM cacerts;测试环境可临时禁用SSL验证(生产环境禁止)。
内容的提问来源于stack exchange,提问作者hell_storm2004
相关产品推荐
相关产品推荐

