https 單向認證和雙向認證配置

HTTPS 是咱們開發中常常用到的通訊加密技術,能有效保護咱們網絡訪問中的安全,本文主要講解單向 和 雙向 https 的配置。關於https 的實現原理在這裏我就不贅述了,附上阮一峯老師的關於https介紹幾篇博客,有興趣的童鞋能夠看一看:圖解SSL/TLS協議   數字簽名是什麼?html

本文目錄:java

一、單向https配置git

二、雙向https配置apache

三、常見名詞說明(轉載)

windows

 

1.單向https 配置 

  • 生成https證書命令:

    sudo keytool -genkey -keyalg RSA -dname "cn=localhost,ou=none,o=none,l=shanghai,st=shanghai,c=cn" -alias server -keypass 123456 -keystore server.keystore -storepass 123456 -validity 3650                                        
  • 生成CSR文件 

    本文只是生成自簽名的https證書,若是須要申請CA證書,就須要生成CSR文件,並將此文件提交給相應CA機構申請CA證書。
    sudo keytool -certReq -alias server -keystore server.keystore -file ca.csr -storepass 123456
  • 生成CER文件

    由於咱們生成的證書使用keytool生成的,沒有通過操做系統可信任的CA機構頒發,因此當用瀏覽器訪問時,會出現不信任證書警告,咱們手工將cer文件(服務端公鑰)導入瀏覽器的證書列表,讓其信任。
    sudo keytool -export -alias server -keystore server.keystore -file ca.cer -storepass 123456

  • 在Tomcat中配置Https證書

   在serve.xml 中添加以下配置,便可訪問https的站點了。瀏覽器

<Connector SSLEnabled="true" clientAuth="false"
            keystoreFile="/Users/beiyan/Documents/test/server.keystore"
            keystorePass="123456" maxThreads="150" port="8443"
            protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
            secure="true" sslProtocol="TLS" />

   其中keystoreFile 爲證書的地址,keystorePass 爲證書的密碼。tomcat

        訪問界面以下:安全

          

  • 導入CER文件,讓瀏覽器信任此證書

    雙擊 ca.cer 便可導入,再設置爲 始終信任 ,再次訪問
  • 應用程序訪問

    若是使用HttpClient 等工具訪問該Https鏈接時,須要講ca.cer 導入jre中;
    命令以下:keytool -import -alias tomcatsso -file "ca.cer" -keystore "/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/security/cacerts" -storepass 123456
    其中 /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre 是jre目錄 123456 是jre默認的密碼

    2.雙向https配置

  • 生成Server端證書:

    sudo keytool -genkey -keyalg RSA -dname "cn=localhost,ou=none,o=none,l=shanghai,st=shanghai,c=cn" -alias server -keypass 123456 -keystore server.keystore -storepass 123456 -validity 3650
  • 生成客戶端證書:

    這裏的客戶端爲瀏覽器,瀏覽器支持的證書格式爲PKCS12,這裏生成PKCS12格式的證書:
    sudo keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -dname "cn=localhost,ou=none,o=none,l=shanghai,st=shanghai,c=cn"  -keypass 123456 -storepass 123456 -keystore client.p12 -validity 3650
  • 讓服務端信任客戶端的證書

    因爲是雙向認證,服務端必須驗證客戶端的身份,因此須要將客戶端的公鑰導入到服務端的信任列表,可是這裏生成的PKCS12文件不能直接導入,因此先導出成CER文件,再將CER文件導入服務端的證書庫。
    一、將客戶端證書導出爲一個單獨的CER文件
    sudo keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer

    二、將CER文件導入服務端的證書庫
    sudo keytool -import -v -file client.cer -keystore server.keystore

    三、查看server.keystore 裏面的證書列表:
    sudo keytool -list -keystore server.keystore

    上圖能夠看到,證書庫中包含兩個證書,一個是服務端的私鑰,一個是客戶端的可信任公鑰服務器

  • 讓客戶端信任服務端證書

    客戶端也須要驗證服務端的證書是否可靠,因此也須要將服務端證書的公鑰導入客戶端的信任列表。通用的作法是將服務器證書導出爲一個單獨的CER文件,而後雙擊安裝到瀏覽器的證書列表便可。
    sudo keytool -keystore server.keystore -export -alias server -file server.cer -validity 36500
  • 全部生成的證書列表以下:


    client.cer:客戶端證書的公鑰
    client.p12:客戶端證書的私鑰
    server.cer:服務端證書的公鑰
    server.keystore:服務端證書庫,既包含服務端私鑰,又包含客戶端公鑰網絡

  • 修改Tomcat 配置:

       在serve.xml 中添加以下配置

  •  

    <Connector SSLEnabled="true" clientAuth="true"
                keystoreFile="/Users/beiyan/Documents/test/keytool/server.keystore"
                truststoreFile="/Users/beiyan/Documents/test/keytool/server.keystore"
                truststorePass="123456" keystorePass="123456" maxThreads="150" port="8443"
                protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
                secure="true" sslProtocol="TLS" />
    clientAuth="true"表示雙向認證
  • 客戶端安裝私鑰

    雙擊client.p12便可安裝

    備註(這裏是mac下面的設置方式,window 與此相似,雙擊進入安裝界面) 

  • 客戶端安裝服務端的公鑰

    雙擊server.cer文件,設置同上

  • 成功訪問:

       彈出客戶端證書選擇界面,選擇客戶端證書,便可正常訪問
       
                                              選擇證書界面


         

                                       
三、jks,keystore,trustore,cer,pfx等名詞說明zhuan(轉自網絡)

備註:此處轉自網絡,網絡地點太多不肯定源地址

密鑰:
公鑰+私鑰的統稱。

密鑰對:
公鑰(證書)和私鑰成對存在。通訊雙方各持有本身的私鑰和對方的公鑰。本身的私鑰需密切保護,而公鑰是公開給對方的。在windows下,單獨存在的公鑰通常是後綴爲.cer的文件

A用本身的私鑰對數據加密,發給B,B用A提供的公鑰解密。同理B用本身的私鑰對數據加密,發送給A後,A用B的公鑰解開。

公鑰的兩個用途:
1。驗證對方身份:防止其餘人假冒對方發送數據給你。
2。解密。
私鑰的兩個用途:
1。代表本身身份:除非第三方有你私鑰,不然沒法假冒你發送數據數據給對方。
2。加密。

 

jks(Java key store):
Java用的存儲密鑰的容器。能夠同時容納n個公鑰或私鑰,後綴通常是.jks或者.keystore或.truststore等,千奇百怪。無論什麼後綴,它就是一個容器,各個公司或機構叫法不一樣而已。好比把只包含"受信任的公鑰"的容器存成.truststore文件等。
用jdk\bin目錄下的keytool.exe對其進行查看,導入,導出,刪除,修改密碼等各類操做。能夠對jks容器加密碼,輸入正確才能夠操做此容器中密鑰。還有一個密碼的概念與上者不一樣,是jks中存儲着的私鑰的密碼,一般是絕密的。

 

pfx
和jks功能相同但文件格式不一樣,pfx是瀏覽器用的。
能夠用一些工具程序把pfx轉化成jks格式供java程序使用(如銀行只提供了pfx,可是咱們想用httpclient模擬瀏覽器自動訪問時)。聽說IE導出的pfx格式不標準,轉化jks時每每報錯,能夠嘗試用Netscape Navigator導入再導出,而後再轉化。碰到過這樣的狀況。

常見的幾種https系統的訪問。經https協議的數據通過加密傳輸,防止第三方監聽,冒充和篡改。
1.不須要用戶作任何操做,好比https://www.verisign.com/
這是由於此公鑰是合法的(公鑰是可信任的機構頒發,和實際域名吻合,並且沒有到期)。用IE訪問時空白處點右鍵能夠查看公鑰信息。
2.https的頁面會彈出公鑰確認提示
公鑰不合法(不是可信任的機構頒發,和實際域名不吻合,已到期),但用戶點「是」即表示忽略危險,繼續訪問。
3.須要往瀏覽器倒入一個文件纔可訪問的
通常是銀行在線交易等特別須要安全的場合,站方(銀行)須要驗證訪客身份(如要確認必須是已註冊的網銀商戶),須要在瀏覽器中導入含有訪客私鑰的pfx文件。

 

生成jks
在銀行沒有提供jks文件的狀況下對賬,須要本身生成jks
對於1,2類https網站,若是java程序訪問此地址時在jre默認的信任庫中找不到對方證書的頒發機構,則會拋出安全方面的異常。因此要將站方公鑰存進一個jks,並在環境變量中設定,代表信任此庫中的公鑰,才能夠正常訪問。
我是用現成的make_jks的工具類在程序中讀取https://xxxx地址,程序自動抓取出銀行公鑰並存進一個jks文件。在瀏覽器中查看站方公鑰時,把公鑰導出(通常是cer後綴),而後用keytool.exe手工將此cer導入一個jks或許也能夠?沒試過。以上1,2類https網站,僅僅是用到了公鑰的「驗證對方身份」功能。對於第3種https網站,也能夠找到現成的程序把pfx直接轉成jks。既然動用了pfx,通常是把公鑰的兩個用途和私鑰的兩個用途都用起來

相關文章
相關標籤/搜索