數字證書學習-2- 雙向認證 與 tomcat
雙向認證原理
雙向認證的
- 瀏覽器下載 “服務端公鑰證書” ,據此證書,傳送密文給服務端,服務端用“服務端公鑰”解密簽名和密文
- 瀏覽器 先載入 “客戶私鑰證書” ,據此證書,解密服務端的 “客戶公鑰證書”加密的簽名和密文
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"/>
多域名時參考如下配置
- 刪除原來的
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
- 新增
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 "%r" %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 "%r" %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>
```