HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),簡單來說就是加了安全驗證的 HTTP,即HTTP + SSL
;咱們知道 HTTP 通信時,若是客戶端C 請求服務器S,那麼能夠經過網絡抓包的形式來獲取信息,甚至能夠模擬服務器 S 端,來騙取與 C 端的通信信息;這對互聯網應用在安全領域的推廣很是不利;HTTPS解決了這個問題。java
1)HTTPS 的服務器須要到 CA 申請證書,以證實本身服務器的用途;linux
2)HTTP 信息是明文傳輸,HTTPS 信息是密文傳輸;web
3)HTTP 與 HTTPS 的默認端口不一樣,前者是 80 端口,後者是 443 端口;算法
能夠說 HTTP 與 HTTPS 是徹底不一樣的鏈接方式,HTTPS 集合了加密傳輸,身份認證,更加的安全。shell
client 向 server 發送實際的業務 HTTPS 請求以前,會先與 server 進行幾回握手,互相證實身份:apache
握手的流程圖:windows
一種解釋:瀏覽器
1)客戶端請求服務器,發送握手消息tomcat
2)服務器返回客戶端本身的加密算法、數字證書和公鑰;
3)客戶端驗證服務器端發送來的數字證書是否與本地受信任的證書相關信息一致;若是不一致則客戶端瀏覽器提示證書不安全。若是驗證經過,則瀏覽器會採用自身的隨機數算法產生一個隨機數,並用服務器發送來的公鑰加密;發送給服務器;這裏若是有人經過攻擊獲取了這個消息,那也沒用,由於他沒有解密此段消息所須要私鑰;驗證經過的網站在瀏覽器地址欄的右邊會有一安全鎖的標識;
3)服務器解密獲得此隨機數,並用此隨機數做爲密鑰採用對稱加密算法加密一段握手消息發送給瀏覽器;
4)瀏覽器收到消息後解密成功,則握手結束,後續的信息都經過此隨機密鑰加密傳輸。
以上是服務端認證的狀況,若是服務端對訪問的客戶端也有認證需求,則客戶端也須要將本身的證書發送給服務器,服務器認證不經過,通信結束;原理同上;
另外,通常在傳輸過程當中爲了防止消息竄改,還會採用消息摘要後再加密的方式,以此保證消息傳遞的正確性。
另外一種解釋說明:
客戶端發起一個 https 的請求,把自身支持的一系列 Cipher Suite(密鑰算法套件,簡稱Cipher)發送給服務端。
服務端,接收到客戶端全部的 Cipher 後與自身支持的對比,若是不支持則鏈接斷開,反之則會從中選出一種加密算法和HASH算法,以證書的形式返回給客戶端 證書中還包含了:公鑰、頒證機構、網址、失效日期等等。
客戶端收到服務端響應後會作如下幾件事:
3.1 驗證證書的合法性
頒發證書的機構是否合法與是否過時,證書中包含的網站地址是否與正在訪問的地址一致等
證書驗證經過後,在瀏覽器的地址欄會加上一把小鎖(每家瀏覽器驗證經過後的提示不同 不作討論)
3.2 生成隨機密碼
若是證書驗證經過,或者用戶接受了不授信的證書,此時瀏覽器會生成一串隨機數,而後用證書中的公鑰加密。
3.3 HASH握手信息
用一開始約定好的 HASH 方式,把握手消息取 HASH 值, 而後用隨機數加密 「握手消息 + 握手消息 HASH 值(簽名)」
並一塊兒發送給服務端。
在這裏之因此要取握手消息的 HASH 值,主要是把握手消息作一個簽名,用於驗證握手消息在傳輸過程當中沒有被篡改過。
而後用隨機密碼加密一段握手消息(握手消息+握手消息的HASH值 )給客戶端
要麼找 CA 授信機構頒發證書,要麼本身給本身頒證書(不受信任的HTTPS)
下面咱們在 windows 上配置 tomcat 的HTTPS 訪問
首先使用 JDK 的 keytool
命令,生成 keystore,在 cmd 命令行模式下執行:
keytool -genkey -alias uzipi.com -keyalg RSA -keystore 1024 -validity 365 -keystore d:/server.keystore -keypass Cs123456 -storepass Cs123456
-genkey 表示要生成密鑰 -keyalg 指定密鑰算法,這裏指定爲 RSA 算法。 -keysize 指定密鑰長度,默認 1024 bit,這裏指定爲 2048 bit。 -sigalg 指定數字簽名算法,這裏指定爲 SHA1withRSA 算法。 -validity 指定證書有效期,這裏指定爲 365 天。 -alias 指定生成的密鑰庫的別名,這裏是 uzipi.com -keystore 指定密鑰庫存儲位置,這裏設定的是 d:/server.keystore -keypass 密鑰口令 -storepass 密鑰庫口令
爲何要移動到 Tomcat 根目錄下呢?由於 Tomcat 啓動時優先掃描當前根目錄。
進入 ${TOMCAT_BASE}/conf
,編輯 server.xml
文件,按照 Tomcat 官網的提示,咱們能夠找到 port="8443"
的 <Connector>
標籤註釋,解開註釋修改內容, 也能夠直接複製以下內容(本身改密碼),加入到 server.xml
文件:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="server.keystore" keystorePass="Cs123456" clientAuth="false" sslProtocol="TLS" />
keystoreFile
屬性值,填寫咱們剛剛建立的 server.keystore
的文件(若是放在了其餘目錄下,須要指定路徑)keystorePass
屬性值,填寫以前建立的密鑰庫密碼配置 webapps 目錄中的項目,找到 WEB-INF/web.xml
文件,添加以下內容:
<security-constraint> <web-resource-collection> <web-resource-name>SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
用 https + 8443 端口方式訪問項目,會發現與以前普通 http + 8080 端口方式訪問的區別:瀏覽器地址欄前面多了不安全的警告。由於是咱們本身頒發的證書,因此是不被其餘機構信任的。
linux 上的配置與 windows 環境的配置是相同的。
(1)cd 轉向到 tomcat 主目錄,執行命令生成 keystore
文件
keytool -genkey -alias uzipi.com -keyalg RSA -keypass Cs123456 -storepass Cs123456 -keystore server.keystore -validity 3600
執行命令以後,將會在tomcat主目錄下生成 server.keystore
文件;
(2)根據 keystore
文件產生的證書請求,向 CA 申請服務器數字證書:
keytool -export -trustcacerts -alias uzipi.com -file server.cer -keystore server.keystore -storepass Cs123456
執行命令以後,將會在tomcat主目錄下生成 server.cer
文件;
(3)將信息中心簽發的服務器證書 server.cer
導入到 server.keystore
文件:
keytool -import -trustcacerts -alias uzipi.com -file server.cer -keystore server.keystore -storepass Cs123456
(1)爲了確保客戶端證書可以順利導入到 IE 和 Firefox 瀏覽器,須將證書格式爲 PKCS12
,命令以下:
keytool -genkey -v -alias clientAlias -keyalg RSA -storetype PKCS12 -validity 3600 -keystore client.p12 -storepass clientStorePass -keypass clientKeyPass
執行命令以後,將會在tomcat主目錄下生成 client.p12
文件;
雙向 SSL 認證,服務器需要信任客戶端證書,所以要把客戶端證書添加爲服務器的信任認證。
因爲不能直接將 PKCS12
格式的證書導入,要先把客戶端證書導出爲一個單獨的 CER
文件,命令以下:
keytool -export -alias clientAlias -keystore client.p12 -storetype PKCS12 -storepass clientStorePass -rfc -file client.cer
執行命令以後,將會在tomcat主目錄下生成 client.cer
文件;
而後將 client.cer
導入到服務器的證書庫 server.keystore
,添加爲一個信任證書:
keytool -import -v -file client.cer -keystore server.keystore -storepass Cs123456
執行後,認證就已添加至 keystore
中了。
(1)經過list命令查看服務器的證書庫,能夠看到兩個輸入,一個是服務器證書,一個是受信任的客戶端證書:
keytool -list -keystore server.keystore -storepass Cs123456
(2)刪除證書命令
keytool -delete -alias myKey -keystore server.keystore -storepass Cs123456
修改 conf/server.xml
文件,配置 <Connector> port="8443"
:
<!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the JSSE configuration, when using APR, the connector should be using the OpenSSL style configuration described in the APR documentation --> <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="Cs123456" truststoreFile="server.keystore" truststorePass="Cs123456" />
clientAuth="true"
,雙向認證;clientAuth="false"
,單向認證;執行 ./bin/startup.sh
命令,訪問 https://127.0.0.1:8443
(你本身的地址) 。
單向認證相關的配置到此結束。若是還須要配置雙向認證,繼續往下看。
將 server.xml
文件中的 clientAuth="true"
,設置爲雙向認證,打開 Firefox 菜單:編輯->首選項->高級->加密->查看證書->你的證書
,將 client.p12
導入到 IE 中,按照 Firefox 提示完成登陸 tomcat 首頁;
if(request.isSecure()) { //若是是SSL通訊 Java.security.cert.X509Certificate[] certs = (java.security.cert.X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate"); if(certs!=null && certs.lengtt>0) { subjectDN="Certificates found"; } }
使用java解析證書可獲取證書中用戶信息:
issue=certs.getIssuerDN().toString(); //證書籤發者 subject=certs.getSubjectDN().getName(); //證書全部者 after=certs.getNotAfter().toString(); //證書起效時間 before=certs.getNotBefore().toString(); //證書到期時間 version=Integer.toString(certs.getVersion()); //證書版本 serialno=certs.getSerialNumber().toString(); //證書序列號
參考文章:
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html tomcat7.0 ssl配置
http://wenku.baidu.com/view/e7b22df0f90f76c661371a6f.html Tomcat SSL 配置