CloudFoundry中从Spring Cloud Connectors迁移至java-cfenv致RabbitMQ TLS连接失败
解决Spring Cloud Services 3.5.5连接CloudFoundry RabbitMQ的TLS验证错误
问题根源
升级至Spring Cloud Services 3.5.5后,自动配置组件解析RabbitMQ服务绑定时,默认采用VCAP变量中credentials.hostname对应的IP地址建立SSL连接,但RabbitMQ服务的TLS证书是颁发给域名pivotal-rabbitmq.mydomain.com的,IP地址未包含在证书的**主题备用名称(SAN)**中,触发TLS验证失败,抛出异常:
c.r.client.impl.SocketFrameHandler : TLS connection failed: No subject alternative names matching IP address XXX found
2.4.1版本的Spring Cloud Connectors自动配置逻辑会优先使用域名或处理证书与IP的匹配,因此未出现该问题。
解决方案
方案1:强制使用域名建立SSL连接
直接配置Spring RabbitMQ使用RabbitMQ服务的域名(从VCAP的dashboard_url或http_api_uri提取的pivotal-rabbitmq.mydomain.com)替代IP地址:
在application.yml中添加配置:
spring: rabbitmq: host: pivotal-rabbitmq.mydomain.com port: 5671 username: ${vcap.services.rabbit-service-poc.credentials.username} password: ${vcap.services.rabbit-service-poc.credentials.password} virtual-host: ${vcap.services.rabbit-service-poc.credentials.vhost} ssl: enabled: true
方案2:覆盖CloudFoundry服务绑定的主机名配置
利用Spring Cloud CloudFoundry扩展配置,指定RabbitMQ服务绑定的主机名:
spring: cloud: cloudfoundry: rabbitmq: hostname: pivotal-rabbitmq.mydomain.com
方案3:临时关闭主机名验证(不推荐生产环境)
若无法使用域名连接,可临时关闭TLS主机名验证绕过错误,但此方式会降低安全性,仅用于测试场景:
spring: rabbitmq: ssl: enabled: true verify-hostname: false
方案4:自定义ConnectionFactory(灵活控制SSL配置)
通过自定义RabbitMQ ConnectionFactory,手动指定域名并配置SSL上下文:
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @Configuration public class RabbitMQConfig { @Bean public ConnectionFactory connectionFactory(Environment env) { CachingConnectionFactory factory = new CachingConnectionFactory(); // 使用RabbitMQ服务域名 factory.setHost("pivotal-rabbitmq.mydomain.com"); factory.setPort(5671); factory.setUsername(env.getProperty("vcap.services.rabbit-service-poc.credentials.username")); factory.setPassword(env.getProperty("vcap.services.rabbit-service-poc.credentials.password")); factory.setVirtualHost(env.getProperty("vcap.services.rabbit-service-poc.credentials.vhost")); // 启用SSL factory.setUseSSL(true); // 可选:若需自定义SSL信任配置,可设置SslContext // factory.setSslContext(sslContext); return factory; } }
内容的提问来源于stack exchange,提问作者Aravind1986
相关产品推荐
相关产品推荐

