我有一个Jenkins实例,我需要从该实例调用位于负载均衡器后面的其他服务/端点。此负载平衡器需要并执行SSL客户端证书验证。
是否可以让Jenkins使用SSL客户端证书进行其对驻留在该负载均衡器后面的那些端点的调用?如下所示:
Jenkins呼叫--- present_SSL_client_cert ---> LB(验证客户端证书)--->端点
谢谢您!
[要让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测试了此设置,它们都使用客户端证书身份验证在nginx反向代理后面。
使用诸如JENKINS_HTTPS_KEYSTORE
之类的env变量有时可以看到,用于配置Jenkins使用https本身,对客户端身份验证有效[[NOT
OpenId Connect Authentication Plugin
不支持此变量,而是使用了基本的Java功能。