一、步骤详解
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前的注释去掉,重新运行证书生成命令;
配置Jenkins HTTPS证书全攻略

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

被折叠的 条评论
为什么被折叠?



