使用JDK自帶工具keytool生成ssl證書

本文轉載自點擊打開鏈接

HTTPS簡介

  • 超文本傳輸安全協議(英語:Hypertext Transfer Protocol Secure,縮寫:HTTPS,常稱爲HTTP over TLS,HTTP over SSL或HTTP Secure)是一種網絡安全傳輸協議。具體介紹以前先來介紹一下以前常見的HTTP,HTTP就是我們平時瀏覽網頁時候使用的一種協議。HTTP協議傳輸的數據都是未加密的,也就是明文,因此使用HTTP協議傳輸隱私信息非常不安全。HTTP使用80端口通訊,而HTTPS佔用443端口通訊。在計算機網絡上,HTTPS經由超文本傳輸協議(HTTP)進行通信,但利用SSL/TLS來加密數據包。HTTPS開發的主要目的,是提供對網絡服務器的身份認證,保護交換數據的隱私與完整性。

  • HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊,並且會進行身份的驗證。

  • SSL(Secure Sockets Layer 安全套接層)是爲網絡通信提供安全及數據完整性的一種安全協議,SSL在網絡傳輸層對網絡連接進行加密,SSL協議位於TCP/IP協議與各種應用層協議之間,爲數據通信提供安全支持。SSL協議分爲兩層,SSL記錄協議建立在TCP之上,爲高層協議提供數據封裝、壓縮、加密等基本功能支持。SSL握手協議建立在SSL記錄協議之上,用戶實際數據傳輸開始前進行身份驗證、協商加密算法、交換加密祕鑰。

  • 問題:Firebug和postman之類的瀏覽器調試工具,爲什麼獲取到的是明文?

解答:

SSL是對傳輸的數據進行加密,針對的是傳輸過程的安全。 
firebug之類的瀏覽器調試工具,因爲他們得到的是客戶端加密之前/解密之後的數據,因此是明文的。

HTTPS工作原理

  • HTTPS 工作原理
    HTTPS在傳輸數據之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸數據的密碼信息。TLS/SSL協議不僅僅是一套加密傳輸的協議,更是一件經過藝術家精心設計的藝術品,TLS/SSL中使用了非對稱加密,對稱加密以及HASH算法。握手過程的具體描述如下:

  • 瀏覽器將自己支持的一套加密規則發送給網站。
  • 網站從中選出一組加密算法與HASH算法,並將自己的身份信息以證書的形式發回給瀏覽器。證書裏面包含了網站地址,加密公鑰,以及證書的頒發機構等信息。
  • 瀏覽器獲得網站證書之後瀏覽器要做以下工作:
    • 驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄裏面會顯示一個小鎖頭,否則會給出證書不受信的提示
    • 如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。
    • 使用約定好的HASH算法計算握手消息,並使用生成的隨機數對消息進行加密,最後將之前生成的所有信息發送給網站。
  • 網站接收瀏覽器發來的數據之後要做以下的操作:
    • 使用自己的私鑰將信息解密取出密碼,使用密碼解密瀏覽器發來的握手消息,並驗證HASH是否與瀏覽器發來的一致。
    • 使用密碼加密一段握手消息,發送給瀏覽器。
  • 瀏覽器解密並計算握手消息的HASH,如果與服務端發來的HASH一致,此時握手過程結束,之後所有的通信數據將由之前瀏覽器生成的隨機密碼並利用對稱加密算法進行加密。
  • 這裏瀏覽器與網站互相發送加密的握手消息並驗證,目的是爲了保證雙方都獲得了一致的密碼,並且可以正常的加密解密數據,爲後續真正數據的傳輸做一次測試。另外,HTTPS一般使用的加密與HASH算法如下:

    • 非對稱加密算法:RSA,DSA/DSS
    • 對稱加密算法:AES,RC4,3DES
    • HASH算法:MD5,SHA1,SHA256

    自簽名證書簡介

    • JDK中keytool是一個證書管理工具,可以生成自簽名證書。 就是自己生成的證書,並不是官方生成的證書。除非是很正式的項目,否則使用自己簽發的證書即可,因爲官方生成證書是要花錢滴。

    • 其他描述

    1. 客戶端發起HTTPS請求
    這個沒什麼好說的,就是用戶在瀏覽器裏輸入一個https網址,然後連接到server的443端口。
    
    2. 服務端的配置
    採用HTTPS協議的服務器必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因爲只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。
    
    3. 傳送證書
    這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間等等。
    
    4. 客戶端解析證書
    這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值。然後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。
    
    5. 傳送加密信息
    這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。
    
    6. 服務段解密信息
    服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密算法夠彪悍,私鑰夠複雜,數據就夠安全。
    
    7. 傳輸加密後的信息
    這部分信息是服務段用私鑰加密後的信息,可以在客戶端被還原
    
    8. 客戶端解密信息
    客戶端用之前生成的私鑰解密服務段傳過來的信息,於是獲取瞭解密後的內容。整個過程第三方即使監聽到了數據,也束手無策。
    

    生成ssl證書步驟

    步驟一:爲服務器生成證書

    • 進入jdk的bin目錄下面,打開CMD命令行工具
    • 相關命令:
    keytool 
    
    -genkey 
    
    -alias tomcat(別名) 
    
    -keypass 123456(別名密碼) 
    
    -keyalg RSA(生證書的算法名稱,RSA是一種非對稱加密算法) 
    
    -keysize 1024(密鑰長度,證書大小) 
    
    -validity 365(證書有效期,天單位) 
    
    -keystore W:/tomcat.keystore(指定生成證書的位置和證書名稱) 
    
    -storepass 123456(獲取keystore信息的密碼)
    
    - storetype (指定密鑰倉庫類型) 
    
    • 使用keytool命令生成證書:
    方便複製版:  keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore W:/tomcat.keystore -storepass 123456
    
    返回:
    
    W:\sys_toos\jdk8\jdk1.8.0_73\bin>keytool -genkey -alias tomcat -keypass 123456 -
    keyalg RSA -keysize 1024 -validity 365 -keystore W:/tomcat.keystore -storepass 1
    23456
    您的名字與姓氏是什麼?
      [Unknown]:  www.seeker.com
    您的組織單位名稱是什麼?
      [Unknown]:  seeker
    您的組織名稱是什麼?
      [Unknown]:  seeker
    您所在的城市或區域名稱是什麼?
      [Unknown]:  beijing
    您所在的省/市/自治區名稱是什麼?
      [Unknown]:  beijing
    該單位的雙字母國家/地區代碼是什麼?
      [Unknown]:  zh
    CN=www.seeker.com, OU=seeker, O=seeker, L=beijing, ST=beijing, C=zh是否正確?
      []:  y
    
    
    點擊回車:W:/目錄下面生成tomcat.keystore的文件。
    

    步驟二:爲客戶端生成證書

    • 爲瀏覽器生成證書,以便讓服務器來驗證它。爲了能將證書順利導入至IE和Firefox,證書格式應該是PKCS12

    關於.jks,.pkcs12,.keystore.cer文件,可以百度其區別

    方便複製版: keytool -genkey -alias client -keypass 123456 -keyalg RSA -storetype PKCS12 -keypass 123456 -storepass 123456 -keystore W:/client.p12
    
    返回:
    
    W:\sys_toos\jdk8\jdk1.8.0_73\bin>keytool -genkey -alias client -keypass 123456 -
    keyalg RSA -storetype PKCS12 -keypass 123456 -storepass 123456 -keystore W:/clie
    nt.p12
    您的名字與姓氏是什麼?
      [Unknown]:  www.seeker.com
    您的組織單位名稱是什麼?
      [Unknown]:  seeker
    您的組織名稱是什麼?
      [Unknown]:  seeker
    您所在的城市或區域名稱是什麼?
      [Unknown]:  beijing
    您所在的省/市/自治區名稱是什麼?
      [Unknown]:  beijing
    該單位的雙字母國家/地區代碼是什麼?
      [Unknown]:  zh
    CN=www.seeker.com, OU=seeker, O=seeker, L=beijing, ST=beijing, C=zh是否正確?
      []:  y
    
    
    點擊回車:W:/目錄下面生成client.p12的文件。
    

    步驟三:讓服務器信任客戶端證書

    由於不能直接將PKCS12格式的證書庫導入,必須先把客戶端證書導出爲一個單獨的CER文件,使用如下命令:
    
    keytool -export -alias client -keystore W:/client.p12 -storetype PKCS12 -keypass 123456 -file W:/client.cer
    
    點擊回車:W:/目錄下面生成client.cer的文件。
    
    將該文件導入到服務器的證書庫,添加爲一個信任證書:
    
    keytool -import -v -file W:/client.cer -keystore W:/tomcat.keystor
    
    返回:
    
    W:\sys_toos\jdk8\jdk1.8.0_73\bin>keytool -import -v -file W:/client.cer -keystor
    e W:/tomcat.keystor
    輸入密鑰庫口令:
    所有者: CN=www.seeker.com, OU=seeker, O=seeker, L=beijing, ST=beijing, C=zh
    發佈者: CN=www.seeker.com, OU=seeker, O=seeker, L=beijing, ST=beijing, C=zh
    序列號: 40e67ca9
    有效期開始日期: Thu May 17 11:35:09 CST 2018, 截止日期: Wed Aug 15 11:35:09 CST
    2018
    證書指紋:
             MD5: 2E:B4:0D:A0:51:97:FF:FF:C2:78:26:8C:F7:9A:B0:E7
             SHA1: 3B:2D:FC:F8:40:0B:A2:56:24:AA:FB:85:35:93:7C:08:4F:4D:D7:33
             SHA256: A7:1E:53:28:0F:96:85:B8:59:10:99:7B:0F:FD:46:57:DA:29:EA:94:1A:
    07:A2:48:B8:70:6F:AA:BC:9B:34:31
             簽名算法名稱: SHA256withRSA
             版本: 3
    
    擴展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: 1A 52 82 28 D9 AC 3E 03   E5 12 91 98 56 11 C0 49  .R.(..>.....V..I
    0010: 88 53 2D 09                                        .S-.
    ]
    ]
    
    是否信任此證書? [否]:  Y
    證書已添加到密鑰庫中
    [正在存儲W:/tomcat.keystor]
    
    
    完成之後通過list命令查看服務器的證書庫,可以看到兩個證書,一個是服務器證書,一個是受信任的客戶端證書:
    
    keytool -list -v -keystore W:/tomcat.keystore
    

    步驟四:讓客戶端信任服務器證書

    由於是雙向SSL認證,客戶端也要驗證服務器證書,因此,必須把服務器證書添加到瀏覽器的“受信任的根證書頒發機構”。
    
    由於不能直接將keystore格式的證書庫導入,必須先把服務器證書導出爲一個單獨的CER文件,使用如下命令:
    
    keytool -keystore W:/tomcat.keystore -export -alias tomcat -file W:/server.cer
    
    
    返回:
    
    W:\sys_toos\jdk8\jdk1.8.0_73\bin>keytool -keystore W:/tomcat.keystore -export -alias tomcat -file W:/server.cer
    輸入密鑰庫口令:
    存儲在文件 <W:/server.cer> 中的證書
    
    
    雙擊server.cer文件,按照提示安裝證書
    
    將證書填入到“受信任的根證書頒發機構”。具體方法:(我用的谷歌瀏覽器):
    
    - 打開谷歌瀏覽器 --> 設置--> 高級 --> 管理證書 --> 中級證書頒發機構 --> 選擇www.seeker.com,點擊導出到桌面SEEKER.cer
    
    - 打開谷歌瀏覽器 --> 設置--> 高級 --> 管理證書 --> 受信任的根證書頒發機構 --> 導入SEEKER.cer
    
    
    其他瀏覽器將證書填入到“受信任的根證書頒發機構”:
    
    - 打開瀏覽器   - 工具  -  internet選項-內容- 證書-把中級證書頒發機構裏的www.seeker.com(該名稱即時你前面生成證書時填寫的名字與姓氏)證書導出來-再把導出來的證書導入  受信任的根頒發機構  就OK了。

    步驟五:配置Tomcat服務器

    
    server.xml配置:
    
    <Connector  port="8443"
    
    protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"
    
    maxThreads="150"
    
    scheme="https"
    
    secure="true"
    
    clientAuth="true"
    
    sslProtocol="TLS"
    
    keystoreFile="W:/tomcat.keystore"
    
    keystorePass="123456"
    
    truststoreFile="W:/tomcat.keystore"
    
    truststorePass="123456" />
    
    
    屬性說明:
    
    clientAuth:設置是否雙向驗證,默認爲false,設置爲true代表雙向驗證
    
    keystoreFile:服務器證書文件路徑
    
    keystorePass:服務器證書密碼
    
    truststoreFile:用來驗證客戶端證書的根證書,此例中就是服務器證書
    
    truststorePass:根證書密碼
    
    注意:
    
    ① 設置clientAuth屬性爲True時,需要手動導入客戶端證書才能訪問。
    
    ② 要訪問https請求 需要訪問8443端口,訪問http請求則訪問Tomcat默認端口(你自己設置的端口,默認8080)即可。
    
    
    小知識:
    
    強制 https 訪問,在 tomcat /conf/web.xml 中的 </welcome- file-list> 後面加上這
    
    <login-config>    
    <!-- Authorization setting for SSL -->    
    <auth-method>CLIENT-CERT</auth-method>    
    <realm-name>Client Cert Users-only Area</realm-name>    
    </login-config>    
    <security-constraint>    
    <!-- Authorization setting for SSL -->    
    <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> 
    
    完成以上步驟後,在瀏覽器中輸入http的訪問地址也會自動轉換爲https

    springboot配置ssl(證書爲JKS格式,或者.keystore文件)

    • 將tomcat.keystore拷貝到項目根目錄下(跟pom文件同級目錄)
    • 配置application.properties
    #端口號
    server.port=8443
    #你生成的證書名字
    server.ssl.key-store=tomcat.keystore
    #密鑰庫密碼
    server.ssl.key-store-password=123456
    server.ssl.keyStoreType=JKS
    server.ssl.keyAlias:tomcat
    • 修改springboot運行主類:實現http自動跳轉https
    package seeker1.seeker1;
    
    import org.apache.catalina.Context;
    import org.apache.catalina.connector.Connector;
    import org.apache.tomcat.util.descriptor.web.SecurityCollection;
    import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
    import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    @SpringBootApplication
    public class Seeker1Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Seeker1Application.class, args);
        }
    
        /**
         * it's for set http url auto change to https
         */
        @Bean
        public EmbeddedServletContainerFactory servletContainer() {
            TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint securityConstraint = new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");// confidential
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                }
            };
            tomcat.addAdditionalTomcatConnectors(httpConnector());
            return tomcat;
        }
    
        @Bean
        public Connector httpConnector() {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(8080);
            connector.setSecure(false);
            connector.setRedirectPort(8443);
            return connector;
        }
    }
    

    springboot配置ssl(方案二)

    • 生成自簽名證書(keyStoreType=PKCS12),命令:
    keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore W:/keystore.p12 -validity 3650
    
    執行命令後,在你的系統的W:/目錄下會生成一個keystore.p12文件,將這個文件拷貝到我們項目resoruces目錄下(和application.properties同級目錄)
    • 修改application.properties文件
    server.port:8443
    # classpath就是指目錄 src/main/resources/ 
    server.ssl.key-store: classpath:keystore.p12
    server.ssl.key-store-password: 123456
    server.ssl.keyStoreType: PKCS12
    server.ssl.keyAlias: tomcat

    直接在springboot裏面配置是爲了應對簡單的服務,真正的系統會在nginx上配置證書。

    參考博客

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