ssl - Jenkins 在调用其他端点时使用客户端证书
问题描述
我有一个 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
有时可以看到)将 Jenkins 配置为使用 https 本身不适用于客户端身份验证。我没有进一步调查,但我假设OpenId Connect Authentication Plugin
我使用的插件不支持这个变量并使用基本的 java 功能。