HTTPS 原理及配置

1、HTTPS 身份驗證介紹

1. HTTPS 原理

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),簡單來說就是加了安全驗證的 HTTP,即HTTP + SSL;咱們知道 HTTP 通信時,若是客戶端C 請求服務器S,那麼能夠經過網絡抓包的形式來獲取信息,甚至能夠模擬服務器 S 端,來騙取與 C 端的通信信息;這對互聯網應用在安全領域的推廣很是不利;HTTPS解決了這個問題。java

HTTPS 與 HTTP 的區別

1)HTTPS 的服務器須要到 CA 申請證書,以證實本身服務器的用途;linux

2)HTTP 信息是明文傳輸,HTTPS 信息是密文傳輸;web

3)HTTP 與 HTTPS 的默認端口不一樣,前者是 80 端口,後者是 443 端口;算法

能夠說 HTTP 與 HTTPS 是徹底不一樣的鏈接方式,HTTPS 集合了加密傳輸,身份認證,更加的安全。shell

2. HTTPS 身份驗證流程

client 向 server 發送實際的業務 HTTPS 請求以前,會先與 server 進行幾回握手,互相證實身份:apache

握手的流程圖:windows

HTTPS 身份驗證握手流程圖

一種解釋:瀏覽器

1)客戶端請求服務器,發送握手消息tomcat

2)服務器返回客戶端本身的加密算法、數字證書和公鑰;

3)客戶端驗證服務器端發送來的數字證書是否與本地受信任的證書相關信息一致;若是不一致則客戶端瀏覽器提示證書不安全。若是驗證經過,則瀏覽器會採用自身的隨機數算法產生一個隨機數,並用服務器發送來的公鑰加密;發送給服務器;這裏若是有人經過攻擊獲取了這個消息,那也沒用,由於他沒有解密此段消息所須要私鑰;驗證經過的網站在瀏覽器地址欄的右邊會有一安全鎖的標識;

3)服務器解密獲得此隨機數,並用此隨機數做爲密鑰採用對稱加密算法加密一段握手消息發送給瀏覽器;

4)瀏覽器收到消息後解密成功,則握手結束,後續的信息都經過此隨機密鑰加密傳輸。

以上是服務端認證的狀況,若是服務端對訪問的客戶端也有認證需求,則客戶端也須要將本身的證書發送給服務器,服務器認證不經過,通信結束;原理同上;

另外,通常在傳輸過程當中爲了防止消息竄改,還會採用消息摘要後再加密的方式,以此保證消息傳遞的正確性。

另外一種解釋說明:

  1. 客戶端發起一個 https 的請求,把自身支持的一系列 Cipher Suite(密鑰算法套件,簡稱Cipher)發送給服務端。

  2. 服務端,接收到客戶端全部的 Cipher 後與自身支持的對比,若是不支持則鏈接斷開,反之則會從中選出一種加密算法和HASH算法,以證書的形式返回給客戶端 證書中還包含了:公鑰、頒證機構、網址、失效日期等等。

  3. 客戶端收到服務端響應後會作如下幾件事:

    3.1 驗證證書的合法性

   頒發證書的機構是否合法與是否過時,證書中包含的網站地址是否與正在訪問的地址一致等

​ 證書驗證經過後,在瀏覽器的地址欄會加上一把小鎖(每家瀏覽器驗證經過後的提示不同 不作討論)

3.2 生成隨機密碼

​ 若是證書驗證經過,或者用戶接受了不授信的證書,此時瀏覽器會生成一串隨機數,而後用證書中的公鑰加密。       

3.3 HASH握手信息

​ 用一開始約定好的 HASH 方式,把握手消息取 HASH 值, 而後用隨機數加密 「握手消息 + 握手消息 HASH 值(簽名)」 並一塊兒發送給服務端。

​ 在這裏之因此要取握手消息的 HASH 值,主要是把握手消息作一個簽名,用於驗證握手消息在傳輸過程當中沒有被篡改過。

  1. 服務端拿到客戶端傳來的密文,用本身的私鑰來解密握手消息取出隨機數密碼,再用隨機數密碼 解密 握手消息與HASH值,並與傳過來的HASH值作對比確認是否一致。

​ 而後用隨機密碼加密一段握手消息(握手消息+握手消息的HASH值 )給客戶端

  1. 客戶端用隨機數解密並計算握手消息的 HASH,若是與服務端發來的 HASH 一致,此時握手過程結束,以後全部的通訊數據將由以前瀏覽器生成的隨機密碼並利用對稱加密算法進行加密,由於這串密鑰只有客戶端和服務端知道,因此即便中間請求被攔截也是無法解密數據的,以此保證了通訊的安全。
  • 非對稱加密算法:RSA,DSA/DSS 在客戶端與服務端相互驗證的過程當中用的是對稱加密
  • 對稱加密算法:AES,RC4,3DES 客戶端與服務端相互驗證經過後,以隨機數做爲密鑰時,就是對稱加密
  • HASH算法:MD5,SHA1,SHA256 在確認握手消息沒有被篡改時

2、windows 環境下配置 tomcat HTTPS

要麼找 CA 授信機構頒發證書,要麼本身給本身頒證書(不受信任的HTTPS)

下面咱們在 windows 上配置 tomcat 的HTTPS 訪問

1. 生成密鑰庫 keystore

首先使用 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  密鑰庫口令

2. 配置 Tomcat

2.1 將 server.keystore 文件移動到 Tomcat 根目錄下

​ 爲何要移動到 Tomcat 根目錄下呢?由於 Tomcat 啓動時優先掃描當前根目錄。

2.2 配置 server.xml 文件

​ 進入 ${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 屬性值,填寫以前建立的密鑰庫密碼
2.3 配置項目的 web.xml

配置 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>

3. 啓動 Tomcat,使用 Https + 8443 端口方式訪問項目

用 https + 8443 端口方式訪問項目,會發現與以前普通 http + 8080 端口方式訪問的區別:瀏覽器地址欄前面多了不安全的警告。由於是咱們本身頒發的證書,因此是不被其餘機構信任的。

3、linux 環境下配置 tomcat HTTPS

linux 上的配置與 windows 環境的配置是相同的。

1. 生成密鑰庫 keystore

(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

2. 生成客戶端證書

(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 文件;

3. 讓服務器信任客戶端證書

雙向 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 中了。

4. keytool 的其餘命令選項

(1)經過list命令查看服務器的證書庫,能夠看到兩個輸入,一個是服務器證書,一個是受信任的客戶端證書:

keytool -list -keystore server.keystore -storepass Cs123456

(2)刪除證書命令

keytool -delete -alias myKey -keystore server.keystore -storepass Cs123456

5. 修改 tomcat 配置

修改 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",單向認證;

6. 重啓 tomcat,訪問應用

執行 ./bin/startup.sh 命令,訪問 https://127.0.0.1:8443 (你本身的地址) 。

單向認證相關的配置到此結束。若是還須要配置雙向認證,繼續往下看。

server.xml 文件中的 clientAuth="true",設置爲雙向認證,打開 Firefox 菜單:編輯->首選項->高級->加密->查看證書->你的證書,將 client.p12 導入到 IE 中,按照 Firefox 提示完成登陸 tomcat 首頁;

7. 雙向認證,讓服務器 SSL 證書獲取代碼

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 配置

相關文章
相關標籤/搜索