给Jenkins加https证书

本文详细介绍了如何为Jenkins添加HTTPS证书的步骤,包括生成CA私钥、服务器证书请求文件,以及解决在转换和导入过程中遇到的问题,如pkcs12转jks报错、证书链建立、Subject Alternative Name缺失等。

一、步骤详解

1. 生成CA私钥

openssl genrsa -out CA/cakey.pem 2048

2. 使用CA私钥生成CA证书

openssl req -new -x509 -key CA/cakey.pem -out cacert.pem (需指定一个密码)

3. 生成服务器私钥

openssl genrsa -out CA/private/server.key 2048

4. 生成服务器证书请求文件

openssl req -new -key CA/private/server.key -out CA/certs/server.csr (需指定一个密码) (需指定一个challenge password)

5. 使用CA私钥生成服务器证书(openssl ca,此处的ca引用的是openssl.cnf配置文件里private_key指向的私钥文件)

openssl ca -in CA/certs/server.csr -out CA/certs/server.crt

6. 将服务器私钥文件和证书文件转成pkcs12格式(p12格式封装包含私钥和证书)

openssl pkcs12 -export -in CA/certs/server.crt -inkey CA/private/server.key -out CA/server.p12 (需指定一个密码)

7. 将pkcs12格式转换为jks格式

keytool -importkeystore -v -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass 第6步给p12设置的密码 -destkeystore keystore -deststoretype jks -deststorepass 给keystore设置的新密码

8. 将keystore文件复制到Jenkins secrets目录

C:\Program Files (x86)\Jenkins\secrets

9. 修改jenkins.xml配置文件,以启用https访问

原:<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>

新:<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=-1 --httpsPort=443 --httpsKeyStore="%BASE%\secrets\keystore" --httpsKeyStorePassword=1234abcd --webroot="%BASE%\war"</arguments>

10. 重启jenkins

11. CA证书pem格式转换成crt格式

openssl x509 -outform der -in cacert.pem -out ca.crt

12. 用户浏览器安装ca.crt证书,使用https://xxx访问jenkins

二、遇到的问题

1. pkcs12在转换为jks格式时候报错(未找到原因):

错误信息:

keytool error: java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)

java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)

        at sun.security.pkcs12.PKCS12KeyStore.parseAlgParameters(Unknown Source)

        at sun.security.pkcs12.PKCS12KeyStore.engineLoad(Unknown Source)

        at java.security.KeyStore.load(Unknown Source)

        at sun.security.tools.keytool.Main.loadSourceKeyStore(Unknown Source)

        at sun.security.tools.keytool.Main.doImportKeyStore(Unknown Source)

        at sun.security.tools.keytool.Main.doCommands(Unknown Source)

        at sun.security.tools.keytool.Main.run(Unknown Source)

        at sun.security.tools.keytool.Main.main(Unknown Source)

Caused by: java.io.IOException: ObjectIdentifier() -- data isn't an object ID (tag = 48)

        at sun.security.util.ObjectIdentifier.<init>(Unknown Source)

        at sun.security.util.DerInputStream.getOID(Unknown Source)

        at com.sun.crypto.provider.PBES2Parameters.engineInit(PBES2Parameters.java:267)

        at java.security.AlgorithmParameters.init(Unknown Source)

        ... 8 more

原因:未找到

解决办法:使用keytool生成服务器私钥和证书请求文件

上面步骤里的3-7步改为:

③生成一个名为jenkins的私钥和证书对,存在keystore里

>keytool -genkeypair -keysize 2048 -keyalg RSA -alias jenkins -keystore keystore (需为keystore指定一个密码)

④生成服务器证书请求文件

>keytool" -certreq -alias jenkins -keyalg RSA -file jenkins.csr -keystore keystore

⑤生成服务器证书

>openssl ca -in jenkins.csr -out jenkins.crt

⑥将CA证书导入keystore

>keytool -import -alias root -file CA/cacert.pem -keystore keystore

⑦将生成的服务器证书导入keystore,替换原有的证书(此步骤前必须先导入CA证书,keystore需要证书链)

>keytool -import -alias jenkins -trustcacerts -file jenkins.crt -keystore keystore

2. 使用keytool生成的服务器证书请求文件,生成服务器证书时失败(The stateOrProvinceName field is different between)

>openssl ca -in jenkins.csr -out jenkins.crt

Using configuration from C:\Program Files\Common Files\SSL/openssl.cnf

Check that the request matches the signature

Signature ok

The stateOrProvinceName field is different between

CA certificate (SH) and the request (SH)

原因:CA证书和证书请求文件jenkins.csr里的stateOrProvinceName信息不匹配,虽然都是SH,但编码可能不一样;

解决办法:将openssl.cnf文件里的policy = policy_match改为policy = policy_anything,重新运行上面的命令;

[ policy_match ]

countryName = match

stateOrProvinceName = match

organizationName = match

organizationalUnitName = optional

commonName = supplied

emailAddress = optional

[ policy_anything ]

countryName = optional

stateOrProvinceName = optional

localityName = optional

organizationName = optional

organizationalUnitName = optional

commonName = supplied

emailAddress = optional

3. 将服务器证书导入keystore时失败

>keytool -import -alias jenkins -trustcacerts -file jenkins.crt -keystore keystore

Enter keystore password:

keytool error: java.lang.Exception: Failed to establish chain from reply

原因:jenkins证书在导入时没有形成证书链;

解决办法:在执行上面命令前先执行

>keytool -import -alias root -file CA/cacert.pem -keystore keystore

形成证书链;

4. 浏览器安装CA证书后访问https://xxx,证书仍然显示invalid

在chrome里F12,选择Security,可看到错误信息如下:

Certificate - Subject Alternative Name missing

原因:给Jenkins服务器颁发的证书中缺少“Subject Alternative Name(使用者可选名称)”项;

解决办法:在生成证书请求文件的时候带上Subject Alternative Name作为扩展信息:

keytool -certreq -alias jenkins -keyalg RSA -file jenkins.csr -keystore keystore -ext san=dns:spam,ip:10.180.131.25

5. 生成的Jenkins服务器证书请求文件jenkins.csr包含了san信息 ,但生成的jenkins.crt文件仍然没有Subject Alternative Name项

keytool -certreq -alias jenkins -keyalg RSA -file jenkins.csr -keystore keystore -ext san=dns:spam,ip:10.180.131.25

原因:openssl.cnf文件里copy_extensions = copy项没有打开,生成crt证书的时候忽略了证书请求文件里的扩展信息;

解决办法:将openssl.cnf文件里#copy_extensions = copy前的注释去掉,重新运行证书生成命令;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值