1. 程式人生 > >數字證書學習-2- 雙向認證 與 tomcat

數字證書學習-2- 雙向認證 與 tomcat

雙向認證原理

雙向認證的

  1. 瀏覽器下載 “服務端公鑰證書” ,據此證書,傳送密文給服務端,服務端用“服務端公鑰”解密簽名和密文
  2. 瀏覽器 先載入 “客戶私鑰證書” ,據此證書,解密服務端的 “客戶公鑰證書”加密的簽名和密文

tomcat的雙向認證

tomcat雙向認證配置與ngnix 不一樣,利用了java 的keystore ,1個keystore 就夠了。 keystore 祕鑰庫

java的keystore是一個庫檔案, 裡面可以存放多個非對稱祕鑰或對稱祕鑰(包含公鑰和私鑰),管理起來很方便。需要證書時,從keystore中用特定的非對稱祕鑰生成某種格式的證書即可。keytool 工具有很多命令,網上可以查。 所以 keystore中必須放兩組祕鑰: 1.伺服器非對稱祕鑰,2. 驗證客戶端祕鑰的公鑰 另外製作一個p12格式的私鑰證書給客戶端,單獨匯入到瀏覽器中,或客戶端 即可

參考

指令碼

1. 新建一個目錄用來存放製作好的祕鑰庫和證書
mkdir d:/ssl
cd ssl
2. 生成 server 祕鑰庫和 server 祕鑰
keytool -validity 3650 -genkey -v -alias server -keyalg RSA -keystore server.keystore -dname "CN=www.xxx.com,O=lh, C=CN" -storepass 123456 -keypass 123456  -storetype PKCS12 
# 預設是jks格式的祕鑰庫   可以使用PKCS12 行業標準格式的祕鑰庫
# 如果不新增這個   “-storetype PKCS12”  引數  可以用下面的命令進行轉換
keytool -importkeystore -srckeystore server.keystore -destkeystore server.keystore -deststoretype pkcs12
3. 生成客戶端祕鑰庫
keytool -genkey -keystore cert.p12 -alias iekey -storepass 123456 -keyalg RSA -storetype PKCS12 -validity 3650  -dname "OU=Manager,CN=www.xxx.com, O=lh, C=CN" 
4. 用客戶端金鑰對製作客戶公鑰證書
keytool -export -file cert.cer -keystore cert.p12 -alias iekey -storepass 123456  -storetype PKCS12 -rfc
5. 從客戶公鑰證書中提取 公鑰和簽名匯入 server祕鑰庫
keytool -import  -alias iekey -v -file cert.cer -keystore server.keystore -storepass 123456
6. 用郵件、網盤或者qq 傳送 cert.p12 檔案給客戶

#刪除key
keytool -delete -alias mykey  -keystore server.keystore -storepass 123456
#檢視祕鑰庫
keytool -list -keystore server.keystore  -storepass 123456

tomcat的配置檔案

server.xml

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"
               keystoreFile="D:/ssl/server.keystore" keystorePass="123456"
               truststoreFile="D:/ssl/server.keystore" truststorePass="123456"/> 


多域名時參考如下配置

  1. 刪除原來的 <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
  2. 新增

Host .name 約束了可以訪問的域名 Host . Context .docBase 屬性是程式碼存放目錄 Host . Context .path 屬性是程式碼 域名後的虛擬路徑,一般部署時沒有,開發時才有 <Host appBase="webapps" autoDeploy="true" name="www.zdy.com" unpackWARs="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt" /> <Context docBase="spring3" path="" reloadable="true" source="org.eclipse.jst.jee.server:spring3" /> </Host> <Host appBase="webapps" autoDeploy="true" name="www.hyl.com" unpackWARs="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt" /> <Context docBase="hjsp" path="" reloadable="true" source="org.eclipse.jst.jee.server:hyl.framework.hjsp" /> </Host> web.xml

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>SSL</web-resource-name>
            <url-pattern>/*</url-pattern><!-- 全站使用SSL -->
        </web-resource-collection>
        <user-data-constraint>
            <description>SSL required</description>
            <!-- CONFIDENTIAL: 要保證伺服器和客戶端之間傳輸的資料不能夠被修改,且不能被第三方檢視到 -->
            <!-- INTEGRAL: 要保證伺服器和client之間傳輸的資料不能夠被修改 -->
            <!-- NONE: 指示容器必須能夠在任一的連線上提供資料。(即用HTTP或HTTPS,由客戶端來決定)-->
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
    ```