JavaWeb學習總結(一):深入學習Tomcat以及https連接器

一、Tomcat體系結構


由上圖可看出Tomca的心臟是兩個組件:Connecter和Container。一個Container可以選擇多個Connecter,多個Connector和一個Container就形成了一個Service。Service可以對外提供服務,而Server服務器控制整個Tomcat的生命週期。

Tomcat兩大組件:Connector和Container

  1. Connector組件
        一個Connecter將在某個指定的端口上偵聽客戶請求,接收瀏覽器的發過來的 tcp 連接請求,創建一個 Request 和 Response 對象分別用於和請求端交換數據,然後會產生一個線程來處理這個請求並把產生的 Request 和 Response 對象傳給處理Engine(Container中的一部分),從Engine出獲得響應並返回客戶。 
        Tomcat中有兩個經典的Connector,一個直接偵聽來自Browser的HTTP請求,另外一個來自其他的WebServer請求。Cotote HTTP/1.1 Connector在端口8080處偵聽來自客戶Browser的HTTP請求,Coyote JK2 Connector在端口8009處偵聽其他Web Server的Servlet/JSP請求。 
        Connector 最重要的功能就是接收連接請求然後分配線程讓 Container 來處理這個請求,所以這必然是多線程的,多線程的處理是 Connector 設計的核心。
   2.Container組件
 container體系結構
    Container是容器的父接口,該容器的設計用的是典型的責任鏈的設計模式,它由四個自容器組件構成,分別是Engine、Host、Context、Wrapper。這四個組件是負責關係,存在包含關係。通常一個Servlet class對應一個Wrapper,如果有多個Servlet定義多個Wrapper,如果有多個Wrapper就要定義一個更高的Container,如Context。 
    Context 還可以定義在父容器 Host 中,Host 不是必須的,但是要運行 war 程序,就必須要 Host,因爲 war 中必有 web.xml 文件,這個文件的解析就需要 Host 了,如果要有多個 Host 就要定義一個 top 容器 Engine 了。而 Engine 沒有父容器了,一個 Engine 代表一個完整的 Servlet 引擎。

  • Engine容器
    Engine 容器比較簡單,它只定義了一些基本的關聯關係
  • Host容器
    Host 是 Engine 的字容器,一個 Host 在 Engine 中代表一個虛擬主機,這個虛擬主機的作用就是運行多個應用,它負責安裝和展開這些應用,並且標識這個應用以便能夠區分它們。它的子容器通常是 Context,它除了關聯子容器外,還有就是保存一個主機應該有的信息。
  • Context容器
    Context 代表 Servlet 的 Context,它具備了 Servlet 運行的基本環境,理論上只要有 Context 就能運行 Servlet 了。簡單的 Tomcat 可以沒有 Engine 和 Host。Context 最重要的功能就是管理它裏面的 Servlet 實例,Servlet 實例在 Context 中是以 Wrapper 出現的,還有一點就是 Context 如何才能找到正確的 Servlet 來執行它呢? Tomcat5 以前是通過一個 Mapper 類來管理的,Tomcat5 以後這個功能被移到了 request 中,在前面的時序圖中就可以發現獲取子容器都是通過 request 來分配的。
  • Wrapper容器
    Wrapper 代表一個 Servlet,它負責管理一個 Servlet,包括的 Servlet 的裝載、初始化、執行以及資源回收。Wrapper 是最底層的容器,它沒有子容器了,所以調用它的 addChild 將會報錯。 
    Wrapper 的實現類是 StandardWrapper,StandardWrapper 還實現了擁有一個 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 將直接和 Servlet 的各種信息打交道。

Tomcat其他組件

    Tomcat 還有其它重要的組件,如安全組件 security、logger 日誌組件、session、mbeans、naming 等其它組件。這些組件共同爲 Connector 和 Container 提供必要的服務。

二、互聯網加密原理

    Tomcat服務器啓動時候會啓動多個Connector(連接器),而Tomcat服務器的連接器又分爲加密連接器和非加密連機器。使用"http://"去請求服務器上的web資源的這個過程中,我們的請求是不加密的,要是想以一種加密的方式來訪問Tomcat服務器,那麼就要在Tomcat裏面配置一個加密的Connector。要配置一個加密連接器,首先應該把互聯網上的加密原理弄清楚。

  1. 對稱加密
    採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱爲對稱加密,也稱爲單密鑰加密。
      需要對加密和解密使用相同密鑰的加密算法。由於其速度快,對稱性加密通常在消息發送方需要加密大量數據時使用。對稱性加密也稱爲密鑰加密。
      所謂對稱,就是採用這種加密方法的雙方使用方式用同樣的密鑰進行加密和解密。密鑰是控制加密及解密過程的指令。算法是一組規則,規定如何進行加密和解密。
      加密的安全性不僅取決於加密算法本身,密鑰管理的安全性更是重要。因爲加密和解密都使用同一個密鑰,如何把密鑰安全地傳遞到解密者手上就成了必須要解決的問題
      常用的對稱加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等

  2. 非對稱加密

    非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。 非對稱加密算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把作爲公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行加密後再發送給甲方;甲方再用自己保存的另一把專用密鑰對加密後的信息進行解密。另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名後再發送給乙方;乙方再用自己的私匙對數據進行驗籤。

    非對稱加密工作原理

      1.A要向B發送信息,A和B都要產生一對用於加密和解密的公鑰和私鑰。
      2.A的私鑰保密,A的公鑰告訴B;B的私鑰保密,B的公鑰告訴A。
      3.A要給B發送信息時,A用B的公鑰加密信息,因爲A知道B的公鑰。
      4.A將這個消息發給B(已經用B的公鑰加密消息)。
      5.B收到這個消息後,B用自己的私鑰解密A的消息。其他所有收到這個報文的人都無法解密,因爲只有B纔有B的私鑰

      發送方使用接收方的公鑰對數據加密,而接收方則使用自己的私鑰解密,這樣,信息就可以安全無誤地到達目的地了,即使被第三方截獲,由於沒有相應的私鑰,也無法進行解密。通過數字的手段保證加密過程是一個不可逆過程,即只有用私有密鑰才能解密。

      非對稱性加密依然沒有解決數據傳輸的安全性問題,比如A想向B發數據,B首先生成一對密鑰(公鑰和私鑰),然後將公鑰發給A,A拿到B發給他的公鑰有就可以使用公鑰加密數據後發給B,然而在B公鑰發送給A的這個過程中,很有可能會被第三方C截獲,C截獲到B的公鑰後,也使用B的公鑰加密數據,然後發給B,B接收到數據後就暈了,因爲搞不清楚接收到的數據到底是A發的還是C發的,這是其中一個問題,另一個問題就是,C截獲到B發的公鑰後,C可以自己生成一對密鑰(公鑰和私鑰),然後發給A,A拿到公鑰後就以爲是B發給他的,然後就使用公鑰加密數據發給B,發送給B的過程中被C截獲下來,由於A是用C發給他的公鑰加密數據的,而C有私鑰,因此就可以解密A加密過後的內容了,而B接收到A發給他的數據後反而解不開了,因爲數據是用C的公鑰加密的,B沒有C的私鑰,所以就無法解密。所以,非對稱性加密存在一個問題:A想向B發數據,A如何確定拿到的公鑰一定是B發的呢?那麼如何解決這個問題呢?只能靠一個第三方機構(CA機構,即證書授權中心(Certificate Authority ),或稱證書授權機構)來擔保。A想向B發數據,B首先將公鑰發給CA機構,CA機構拿到B的公鑰後跑到B的家裏問:這是你發的公鑰嗎?B確認過後說是:沒錯,是我發的!那麼此時CA機構就會爲B的公鑰做擔保,生成一份數字證書給B,數字證書包含了CA的擔保認證簽名和B的公鑰,B拿到CA的這份數字證書後,就發給A,A拿到數字證書後,看到上面有CA的簽名,就可以確定當前拿到的公鑰是B發的,那麼就可以放心大膽地使用公鑰加密數據,然後發給B了。


三、Https連接器

    明白了互聯網上的加密原理之後,下面來看看瀏覽器與服務器交互時,瀏覽器想將數據加密後再發送給服務器,那麼該怎麼做呢?服務器首先要向瀏覽器出示一份數字證書,瀏覽器看到數字證書後,就可以使用數字證書裏面的公鑰加密數據,所以要想做瀏覽器和服務器的加密數據傳輸,那麼首先得針對服務器生成一份數字證書。然後再配置一下服務器,讓服務器收到瀏覽器的請求之後,會向瀏覽器出示它的數字證書。

  1. 生成tomcat服務器的數字證書

    1. SUN公司提供了製作證書的工具keytool, 在JDK 1.4以後的版本中都包含了這一工具,它的位置爲<JAVA_HOME>\bin\keytool.exe

    keytool -genkey -alias tomcat -keyalg RSA

     使用keytool生成一個名字爲tomcat的證書,存放在.keystore這個密鑰庫中


    命令執行完之後,操作系統的用戶文件夾下面就會生成一個.keystore文件,如下圖所示:

      

    使用命令:keytool -list -keystore .keystore查看.keystore密鑰庫裏面的所有證書

      

  2. 配置https連接器

    將生成的.keystore密鑰庫文件拷貝到Tomcat服務器的conf目錄下,如下圖所示:

      

      修改server.xml文件,配置https連接器,代碼如下:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" 
                   keystoreFile="conf/.keystore" keystorePass="123456"/>

      在server.xml文件中配置了一個端口是8443的加密連接器,瀏覽器訪問8443端口的連接器時,將會以加密的方式來訪問web服務器,這個連接器收到瀏覽器的請求後,將會向瀏覽器出示一份數字證書,瀏覽器再用數字證書裏面的公鑰來加密數據,keystoreFile="conf/.keystore" 用來指明密鑰庫文件的所在路徑,服務器從密鑰庫中提取證書時需要密碼,keystorePass="123456"指明密鑰庫的訪問密碼。

      使用"https://localhost:8443/"訪問8443的加密連接器

      

      由於密鑰庫裏面的證書是我們手工生成的,沒有經過CA的認證,所以使用"https://localhost:8443/"訪問8443的加密連接器,瀏覽器會出現"證書錯誤,導航已阻止",瀏覽器認爲當前要訪問的這個主機是不安全的,不推薦繼續訪問,點擊就可以繼續訪問了,如下圖所示:

      

  3. 安裝數字證書

  4. 刪除數字證書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章