Apache Camel HTTPS4组件如何配置自签名SSL证书?
问题描述
我尝试与拥有自签名SSL证书的服务器进行通信,我的Apache Camel路由配置如下:
.setHeader(Exchange.HTTP_METHOD, constant("GET")) .to("https4://192.168.3.15:3000/getFile") .marshal(xmlJsonFormat) .process("camelProcessor") .to("mongodb:mongoBean?database=eicas&collection=sales&operation=insert") .to("log:Ok:Se guardo un registro Venta fija") .doCatch(IllegalArgumentException.class) .to("log:org.apache.camel.example?level=DEBUG") .to("log:error?showCaughtException=true&showStackTrace=true");
但我不知道该如何配置自签名SSL,请问有解决思路吗?
解决方案
针对你用Camel https4组件对接自签名证书服务器的需求,我整理了几种实用的配置方案,你可以根据自己的场景选择:
方案1:临时跳过证书验证(仅测试环境)
如果只是做测试,不想折腾证书导入,可以直接给https4组件添加参数关闭证书校验——注意:绝对不要在生产环境用这个方法,会带来严重的安全风险。修改你的路由URL即可:
.to("https4://192.168.3.15:3000/getFile?disableSslCertificateValidation=true")
添加disableSslCertificateValidation=true后,Camel会忽略所有证书相关的校验。
方案2:将证书导入JVM全局信任库
这种方式会让整个JVM环境信任该自签名证书,适合所有基于这个JVM运行的应用都需要对接该服务器的场景:
- 先导出服务器的自签名证书,用
openssl命令执行:
openssl s_client -connect 192.168.3.15:3000 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > server.crt
- 用
keytool把证书导入JVM默认信任库(路径一般是$JAVA_HOME/jre/lib/security/cacerts):
keytool -import -alias my-server-cert -file server.crt -keystore $JAVA_HOME/jre/lib/security/cacerts
默认信任库的密码是changeit,输入密码确认导入后,你的Camel路由不需要做任何修改就能正常通信了。
方案3:自定义SSLContextParameters(生产环境推荐)
这是最灵活安全的方式,只在当前Camel上下文生效,不会影响其他应用:
- 先创建一个
SSLContextParameters类型的Bean,用来加载你的自签名证书:
@Bean("mySslContextParams") public SSLContextParameters createSslContextParams() throws Exception { SSLContextParameters sslParams = new SSLContextParameters(); // 配置信任库,这里假设证书放在项目的resources目录下 KeyStoreParameters trustStoreParams = new KeyStoreParameters(); trustStoreParams.setResource("classpath:server.crt"); // 如果你的证书是放在带密码的JKS信任库里,需要设置密码 // trustStoreParams.setPassword("your-truststore-password"); TrustManagersParameters trustManagerParams = new TrustManagersParameters(); trustManagerParams.setKeyStore(trustStoreParams); sslParams.setTrustManagers(trustManagerParams); return sslParams; }
- 在路由的
https4端点中引用这个Bean:
.to("https4://192.168.3.15:3000/getFile?sslContextParameters=#mySslContextParams")
这样Camel就会使用你自定义的信任规则来验证服务器的自签名证书了。
额外提示
如果服务器需要双向认证(即客户端也要给服务器提供证书),你还需要在SSLContextParameters中配置keyManagers参数,加载客户端的密钥库。另外,确保你的项目已经引入了camel-http4和camel-ssl的相关依赖哦。
内容的提问来源于stack exchange,提问作者Katty Chiale
相关产品推荐
相关产品推荐

