為Jenkins增加ssl(https)的訪問支持(Windows/Linux)


前言:

增加ssl(https)的訪問可以為部署在公網下的jenkins提供更安全的問題,最明顯的好處應該是登錄和jenkins-ci.jar的調用。

比如jenkins-ci.jar的調用,一般在windows下通過明文賬號密碼的傳輸請求是非常不安全的;有關windows配置和實踐參考以下文章:

http://www.cnblogs.com/EasonJim/p/6086018.html(這篇是關於windows的配置方法)

http://www.cnblogs.com/EasonJim/p/6086168.html(這個是對jenkins-ci.jar的用法實踐)

關於自簽名證書的不安全性探討:

參考:http://www.cnblogs.com/EasonJim/p/6640426.html

個人看法,如果要真正安全,可以考慮購買由權威機構頒發的證書;雖然自簽名證書不安全,但是我覺得在一定程度上加密的傳輸流程上會增加破解的難度。

還有什么方法可以代替jenkins在ssl(https)的安全:

我覺得如果在公開的外網訪問web上,應該沒有比部署ssl更安全的方案。但是可以通過以下技巧使安全得到進一步增強:

1、對於部署到外網的jenkins使用vpn的登錄機制,只有公司內部的人員才能有權限登錄vpn連接和操作jenkins。

2、全程內網進行管理,不接觸外網。

3、如果要調用jenkins-ci.jar功能,在linux下推薦使用ssh的key進行登錄去操作。

以下為具體的部署步驟:

原理:使用了java自帶的keytool工具來操作。keytool可以走只生成請求證書,然后提供到正規權威機構獲取正規證書,也可以生成自簽名證書。

1、正規流程申請權威機構正規證書:

keytool放置在jdk的jre/bin文件夾下,如果是windows使用msi安裝的jenkins,放置在:C:\Program Files (x86)\Jenkins\jre\bin

參考:https://wiki.jenkins-ci.org/display/JENKINS/Starting+and+Accessing+Jenkins

以下以windows安裝版為講解步驟

①在服務器上創建一個新的密鑰庫。這將在當前目錄中放置一個“keystore”文件。

C:\Program Files (x86)\Jenkins\jre\bin>keytool -genkeypair -keysize 2048 -keyalg RSA -alias jenkins -keystore keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: server-name.your.company.com
What is the name of your organizational unit?
[Unknown]: Your City
What is the name of your organization?
[Unknown]: Your company name
What is the name of your City or Locality?
[Unknown]: Your city
What is the name of your State or Province?
[Unknown]: Your State
What is the two-letter country code for this unit?
[Unknown]: US
Is CN=server-name.your.company.com, OU=Your City, O=Your company name, L=Your City, ST=Your State, C=US correct?
[no]: yes

Enter key password for <jenkins>
(RETURN if same as keystore password):

②驗證密鑰庫是否已創建(您的指紋會有所不同)

C:\Program Files (x86)\Jenkins\jre\bin>keytool -list -keystore keystore
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

jenkins, May 6, 2015, PrivateKeyEntry,
Certificate fingerprint (SHA1): AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA

③創建證書請求。這將在當前目錄中創建一個“certreq.csr”文件。

C:\Program Files (x86)\Jenkins\jre\bin>keytool -certreq -alias jenkins -keyalg RSA -file certreq.csr -keystore keystore
Enter keystore password:

④使用'certreq.csr'文件的內容從證書提供者生成證書。請求SHA-1證書(SHA-2未經測試,但可能會工作)。如果使用DigiCert,請將生成的證書下載為其他格式“.p7b文件中的所有證書的.p7b軟件包”(這一步就是向正規機構購買證書然后導出p7b的過程)

⑤將生成的.p7b添加到您上面創建的密鑰庫中。

C:\Program Files (x86)\Jenkins\jre\bin>keytool -import -alias jenkins -trustcacerts -file response_from_digicert.p7b -keystore keystore
Enter keystore password:
Certificate reply was installed in keystore

⑥將'keystore'文件復制到您的Jenkins secrets目錄。在股票安裝中,這將在

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

⑦修改C:\ Program Files(x86)\ Jenkins \ jenkins.xml文件的<arguments>部分以反映新的證書。注意:此示例通過httpPort = -1禁用http,並通過httpsPort = 8443將服務器放置在8443上

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=-1 --httpsPort=8443 --httpsKeyStore="%BASE%\secrets\keystore" --httpsKeyStorePassword=your.password.here</arguments>

⑧重新啟動jenkins服務以初始化新配置。

net stop jenkins
net start jenkins

⑨30-60秒后,Jenkins將完成啟動過程,您應該可以訪問該網站https://server-name.your.company.com:8443; 通過瀏覽器的工具驗證證書看起來不錯。如果服務立即終止,您的配置中會出現錯誤。有用的錯誤信息可以在以下位置找到:

C:\Program Files (x86)\Jenkins\jenkins.err.log
C:\Program Files (x86)\Jenkins\jenkins.out.log

注意:以上過程為windows安裝版的生成過程,如果使用jdk的keytool去操作,步驟不變,只是路徑變了。

2、證書在其它啟動方式上的配置:

如果使用war包安裝的方式,則將使用如下命令進行啟動:

java -jar jenkins.war --httpPort=-1 --httpsPort=443 --httpsKeyStore=path/to/keystore --httpsKeyStorePassword=keystorePassword

可以看出,只要指定https的文件和密碼即可。和上面的原理不變。

如果使用tomcat這樣的第三方容器,那么原理也是一樣的,都是配置容器的https證書的位置。比如tomcat的配置如下:

//修改server.xml文件
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100"  maxThreads="200" SSLEnabled="true" 
scheme="https" secure="true"
keystoreFile="path/to/keystore" keystorePass="keystorePassword"
clientAuth="false" sslProtocol="TLS"/>

同樣是修改https證書的位置和密碼。

3、使用keytool生成自簽名證書

參考:http://www.voidcn.com/blog/taohuagege1/article/p-6488794.html

提示:以下步驟是生成自簽名的過程,生成后配置啟動參考上面的。

①生成根證書

keytool -genkeypair -alias ROOTCERT -keyalg RSA -keystore rootlib.jks
命令解釋:生成一對RSA非對稱密鑰和一個自簽名證書,以別名ROOTCERT存儲在rootlib中。
注意:enter后,會提示輸入密鑰庫的使用口令,和填寫相關OU,CN等信息。之后會在你的當前工作目錄下生成一個rootlib.jks的文件。

②生成證書請求

1)keytool -genkeypair -alias SERVERCERT -keyalg RSA -keystore serverlib.jks (跟①步驟一樣)。
注意:此時”您的名字與姓氏是什么” ,需要輸入localhost(就是證書請求者的域名)2)keytool -certreq -file server.csr -alias SERVERCERT -keystore serverlib.jks
命令解釋:在serverlib文件中從別名為SERVERCERT中取出公鑰和用戶信息生 成證書請求,並寫入到server.csr文件中。之后會在你的當前工作目錄下生成一個server.csr的文件。

③用根證書對證書請求簽名,生成應用證書

keytool -gencert -infile server.csr -outfile servercert.cer -alias ROOTCERT -keystore rootlib.jks
命令解釋:使用別名為ROOTCERT的私鑰對server.csr證書請求進行簽發證書,並導入到servercert.cer 文件中。

④導出根證書,添加為客戶端受信任的根證書頒發機構中

keytool -exportcert -alias ROOTCERT -file root.cer -keystore rootlib.jks
命令解釋:從rootlib.jks將別名ROOTCERT的證書導出到root.cer文件中

⑤導入證書到jks文件中

1)我們先要更新serverlib.jks中的證書(用根證書簽發好的應用證書--servercert.cer)
keytool -importcert -alias SERVERCERT -file servercert.cer -keystore serverlib.jks
此時會報:無法從回復中建立鏈(這是因為更新的證書無法信任)。我們先要將根證書導入到serverlib.jks中,使之信任
2)keytool -importcert -alias TRUSTCERT -file root.cer -keystore serverlib.jks
3)這時在執行1)中的命令,即可更新。

注意:更新證書時的別名不能寫錯,否則keytool工具會認為添加。

⑥配置啟動

最后得到serverlib.jks文件就是我們需要的,通過上面的步驟配置啟動即可。

 

線索參考:

http://stackoverflow.com/questions/40126736/enable-https-in-jenkins

關鍵字:keytool生成自簽名證書

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM