我有一个Jenkins实例,我需要从中调用驻留在负载均衡器后面的其他服务/端点。此负载均衡器需要并执行SSL客户端证书验证。
是否有可能让Jenkins使用SSL客户端证书来对这些负载均衡器后面的端点进行调用? 如下所示:
詹金斯打电话--- present_SSL_client_cert ---> LB(验证客户证书)--->端点提前谢谢!
答案 0 :(得分:0)
要让Jenkins将客户端证书用于其他端点,请使用
来启动Jenkins。 JAVA_OPTS="-Djavax.net.ssl.keyStorePassword=changeme -Djavax.net.ssl.keyStoreType=pkcs12 -Djavax.net.ssl.keyStore=/cert/jenkins.p12"
我使用了普通的客户端证书:
openssl req -nodes -newkey rsa:4096 -days 365 -keyout cert/jenkins.key -out cert/jenkins.csr -subj "/C=DE/ST=somewhere/L=inCity/O=someOrg/OU=someBla/CN=jenkins"
签名:
openssl x509 -req -days 365 -in ../jenkins/cert/jenkins.csr -CA ca/ca.crt -CAkey ca/ca.key -out ../jenkins/cert/jenkins.crt -passin env:CA_KEY
并将其转换为PKCS12:
openssl pkcs12 -nodes -export -in cert/jenkins.crt -inkey cert/jenkins.key -out cert/jenkins.p12 -certfile ../nginx/ca/ca.crt -passout pass:changeme
使用非空的keyStorePassword非常重要,否则Jenkins抛出异常java.security.UnrecoverableKeyException: Get Key failed: null
此外,我已将服务器证书添加到Java密钥库中:
keytool -import -alias server.domain.de -keystore /usr/local/openjdk-8/jre/lib/security/cacerts -file /root/server.crt -noprompt -storepass changeit
我已经使用jenkins:lts docker容器和keycloak测试了此设置,它们都使用客户端证书auth在nginx反向代理后面。
使用JENKINS_HTTPS_KEYSTORE
之类的env变量有时可以看到配置Jenkins使用https本身, NOT 对于客户端身份验证没有作用。我没有做进一步的调查,但是我假设我使用的插件OpenId Connect Authentication Plugin
不支持该变量,而是使用了基本的Java功能。