首页 > 解决方案 > Jenkins 在调用其他端点时使用客户端证书

问题描述

我有一个 Jenkins 实例,我需要从中调用位于负载均衡器后面的其他服务/端点。此负载平衡器需要并执行 SSL 客户端证书验证。

是否可以让 Jenkins 使用 SSL 客户端证书来调用位于负载均衡器后面的端点?如下所示:

Jenkins 调用 ---present_SSL_client_cert---> LB(验证客户端证书) ---> 端点

先感谢您!

标签: ssljenkinsclient-certificates

解决方案


要让 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 功能。


推荐阅读