配置Vertx WebClient SSL上下文:自定义JCA Provider配置问题
问题:如何在Vert.x中配置底层Netty以使用自定义Java Security Provider?
我使用一款安全功能库,可创建自定义java.security.Provider、KeyManagerFactory、TrustManagerFactory,用于指定特定的TLS密码套件、算法、密钥及信任存储格式。通常我会通过以下Netty代码配置SslContext:
val nettyProvider = SslProvider.JDK val (keyManagerFactory, trustManagerFactory) = loadKeyCertStuff() val customJcaProvider: java.security.Provider = CustomTlsProvider() return SslContextBuilder.forClient() .sslProvider(nettyProvider) .keyManager(keyManagerFactory.keyManagers[0]) .trustManager(trustManagerFactory.trustManagers[0]) .sslContextProvider(customJcaProvider) .ciphers(listOf("TLS_CIPHER_2012")) .build()
但Vert.x库的API仅支持设置自定义KeyManagerFactory和TrustManagerFactory,无法直接设置java.security.Provider,请问是否有办法配置Vert.x底层使用的Netty来实现这一需求?
解决方案
1. 直接构建Netty SslContext传入Vert.x
Vert.x的io.vertx.core.net.SslContextBuilder支持直接传入预先构建好的Netty SslContext。你可以先用Netty的API创建包含自定义java.security.Provider的SslContext,再将其注入Vert.x的配置中:
// 用Netty API构建带自定义Provider的SslContext val nettySslContext = io.netty.handler.ssl.SslContextBuilder.forClient() .sslProvider(SslProvider.JDK) .keyManager(keyManagerFactory.keyManagers[0]) .trustManager(trustManagerFactory.trustManagers[0]) .sslContextProvider(customJcaProvider) .ciphers(listOf("TLS_CIPHER_2012")) .build() // 把Netty的SslContext传给Vert.x的SslContextBuilder val vertxSslContext = io.vertx.core.net.SslContextBuilder.forClient() .sslContext(nettySslContext) .build() // 将配置好的Vert.x SslContext用于HTTP客户端 val httpClient = vertx.createHttpClient(HttpClientOptions() .setSsl(true) .setSslContext(vertxSslContext))
2. 全局注册自定义Security Provider
如果你的自定义Provider需要在整个JVM范围内生效,可直接将其注册到全局安全Provider列表:
val customProvider = CustomTlsProvider() // 注册到全局Provider,数字越小优先级越高 Security.insertProviderAt(customProvider, 1)
注册后,Vert.x底层的Netty在使用JDK SSL实现时会自动优先使用该自定义Provider,无需额外修改Vert.x的API配置。
内容的提问来源于stack exchange,提问作者Roman Churganov
相关产品推荐
相关产品推荐

