前言:
增加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生成自簽名證書
