ssl協議
SSL(Secure Sockets Layer 安全套接字協議),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層與應用層之間對網絡連接進行加密。
https = http + ssl ,https 的安全基礎即是ssl協議。
ssl證書
SSL 證書就是遵守 SSL協議,由受信任的數字證書頒發機構CA,在驗證服務器身份后頒發,具有服務器身份驗證和數據傳輸加密功能。
申請與安裝ssl證書
1.制作CSR文件
CSR就是Certificate Signing Request證書請求文件。這個文件是由申請人制作,在制作的同時,系統會產生2個密鑰,一個是公鑰就是這個CSR文件,另外一個是私鑰,存放在服務器上。
一般來說,主流的Web服務軟件,通常都基於OpenSSL和Java兩種基礎密碼庫。
所以要制作CSR文件,一般APACHE、Nginx等,使用OPENSSL命令行來生成KEY+CSR2個文件;Tomcat,JBoss,Weblogic等使用Java Development Kit (JDK)工具包中的Keytool工具來生成JKS和CSR文件。
2.CA認證
將CSR提交給CA,CA一般有2種認證方式:
- 域名認證,一般通過對管理員郵箱認證的方式,這種方式認證速度快,但是簽發的證書中沒有企業的名稱;
- 企業文檔認證,需要提供企業的營業執照。一般需要3-5個工作日。 也有需要同時認證以上2種方式的證書,叫EV證書,這種證書可以使IE7以上的瀏覽器地址欄變成綠色,所以認證也最嚴格。
3.證書的安裝
在收到CA的證書后,可以將證書部署上服務器,一般nginx將KEY+CER文件復制到服務器上,然后修改nginx配置文件;TOMCAT等,需要將CA簽發的證書CER文件導入JKS文件后,復制上服務器,然后修改SERVER.XML。
ssl身份認證
具體過程如下:
客戶端是如何檢查服務端證書
先確定一點,所有訪問https的資源都是需要ssl證書的;但實際上我們會發現,大多數https網站可以直接訪問,而一些網站需要通過在瀏覽器的設置中導入證書,把該證書加入到信任列表中。
所以,客戶端認證ssl證書的方式,就是基於客戶端的各種證書信任列表。
1.操作系統:都有自己的證書管理器,操作系統已經自動添加了這些https網站訪問時需要的證書到證書管理器中。
在windows機器上,命令行輸入certmgr.msc,就打開了證書管理器:
在linux機器上(以centos6為例),/etc/pki/tls/certs下有兩個文件,ca-bundle.crt和ca-bundle.trust.crt,即linux的證書庫。
2.瀏覽器:安裝在操作系統中的瀏覽器默認的導入證書是操作系統證書管理器的證書列表+特定瀏覽器自己添加的少許證書。
以谷歌瀏覽器為例:
舉一個例子,我們訪問Atlassian的網站,則可以看到 * .atlassian.com 證書已由中間證書DigiCert High Assurance EV Root CA 和 DigiCert High Assurance CA-3簽署,這些中間證書已由根證書Entrust.net簽名:
這三個證書組合在一起稱為證書鏈,雖然我們並沒有手動導入* .atlassian.com的證書,但是在操作系統和瀏覽器的證書信任列表中都能找到這三本證書:
windows操作系統的:
瀏覽器的:
因此客戶端將信任由它們簽名的任何證書,本例中即 * .atlassian.com
反之,如果某網站的ssl證書,或其根證書與中間證書,均不在客戶端的證書信任列表中,那么必須手動添加該證書后,客服端才會信任該站點。
JAVA中信任證書的交互問題
問題背景:
使用 ssl 連接時,遇到不信任的證書,java應用程序一般都會拒絕連接。
瀏覽網站時,我們可以通過在瀏覽器的設置中導入證書,把證書加入到信任列表中。
而在 java 直接進行 SSL 連接應用時,默認沒有一個界面來導入證書。JAVA 進行不信任的 ssl 連接時,會報如下異常:
診斷方式:
以上鏈接中提供了一種方式,用於診斷你的 Java 環境中是否包含了相應的信任證書。
1.下載 https://confluence.atlassian.com/kb/files/779355358/779355357/1/1441897666313/SSLPoke.class
2.將SSLPoke.class文件上傳至服務器,運行如下命令診斷連接
[localadmin@11111 nick]$ java SSLPoke www.google.cn 443 Successfully connected
測試成功,說明當前java環境包含了谷歌的ssl信任證書。
解決方式:
若測試不成功,如下support.adyen.com的證書不被信任
[localadmin@111111 nick]$ java SSLPoke support.adyen.com 443 sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) at sun.security.validator.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1488) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747) at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138) at SSLPoke.main(SSLPoke.java:31) Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) ... 15 more
這時候,就要找到一種方式,在 JAVA 的運行環境中導入信任證書。
同樣Java也有一個統一管理信任證書的地方, 是一個叫 keystore 的文件 (默認是位於 $JAVA_HOME/lib/security/cacerts ) 。
該文件使用 keytool
工具去管理 (該工具默認位於 $JAVA_HOME/bin/keytool )。
導入證書:
keytool -import -alias <證書別名> -keystore $JAVA_HOME/jre/lib/security/cacerts -file your.crt -storepass changeit 參數說明: -keystore 執行后添加證書的位置 -file 要跑的證書的位置 -alias 證書的名字
兩個注意事項:
1.keystore文件都受密碼保護,訪問一個已有的 keystore 文件時,會要求你驗證密碼,默認密碼為 changeit,所以keytool命令要加上-storepass changeit
2.需用root用戶執行。
查看證書:
導入證書后可以通過以下命令查看證書是否已導入:
keytool -list -keystore "/usr/java/jdk1.8.0_60/jre/lib/security/cacerts" -storepass changeit |grep "證書的別名"
刪除證書:
將證書從keystore移除:
keytool -delete -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts -alias "證書的別名"
參考:https://blog.csdn.net/ljskr/article/details/84570573
https://yq.aliyun.com/articles/427197