keytool+tomcat配置HTTPS雙向證書認證

http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html
html

http://blog.csdn.net/jasonhwang/article/details/2344768 java

http://blog.163.com/khan7923@126/blog/static/7478696420103157430837/ 算法

http://www.java2s.com/Code/Java/Servlets/javaxservletrequestX509Certificate.htm
瀏覽器

http://makewong.blog.51cto.com/blog/217767/740754 tomcat

http://blog.csdn.net/jasonhwang/article/details/2413310 服務器

http://my.oschina.net/moson/blog/313126 less


keystore相關操做: 工具

http://blog.csdn.net/iamshaofa/article/details/7703434 測試

http://plplum.blog.163.com/blog/static/3103240020101010115044960/ 網站

http://blog.csdn.net/moreorless/article/details/4985940

坑過個人地方:

keystore導入多張證書的話,  keytool import 命令必須帶別名參數,不帶的話默認別名是「mykey」  例如:keytool -import -alias mykey -v -file D:\client.key.cer -keystore D:\tomcat.keystore

雙向驗證才能用下面這種方法顯示證書!!!     clientAuth="true"!!!!!    http://bbs.csdn.net/topics/370087785

import java.io.IOException;
import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
  
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
  
/**
 * CertFilter
 */
@WebFilter(description = "Certificate Filter for SSL connection", urlPatterns = { "/CertFilter" })
public class CertFilter implements Filter {
  
    /**
     * Default constructor. 
     */
    public CertFilter() {
        // TODO Auto-generated constructor stub
    }
  
    /**
     * @see  Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
      
    /**
     * 獲取證書信息
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 獲取request參數「javax.servlet.request.X509Certificate」中的證書信息
        X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
        for(X509Certificate cert : certs) {
            System.out.println("!!!Start!!!");
            System.out.println("版本:" + cert.getVersion());
            System.out.println("序列號:" + cert.getSerialNumber());
            System.out.println("頒佈者:" + cert.getIssuerDN().getName());
            System.out.println("使用者(主題項):" + cert.getSubjectDN().getName());
            System.out.println("簽名算法:" + cert.getSigAlgName());
            System.out.println("證書類型:" + cert.getType());
            System.out.println("有效期從:" + cert.getNotBefore());
            System.out.println("至:" + cert.getNotAfter());
            try {
                cert.checkValidity(); // 檢查證書是否過時
            } catch (CertificateExpiredException e) {
                e.printStackTrace();
            } catch (CertificateNotYetValidException e) {
                e.printStackTrace();
            }
            System.out.println("!!!End!!!");
        }
        // pass the request along the filter chain
        chain.doFilter(request, response);
    }
      
    /**
     * @see  Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
      
}



什麼是https? 百度百科足夠解釋它:http://baike.baidu.com/view/14121.htm


工具: keytool (Windows下路徑:%JAVA_HOME%/bin/keytool.exe)
環境: Windows8.1企業版、Tomcat-7.0.2七、JDK1.六、IE十一、Chrome

1、爲服務器生成證書

C:\Windows\system32>keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
  [Unknown]:  StoneXing
您的組織單位名稱是什麼?
  [Unknown]:  iFLYTEK
您的組織名稱是什麼?
  [Unknown]:  iFLYTEK
您所在的城市或區域名稱是什麼?
  [Unknown]:  合肥市
您所在的州或省份名稱是什麼?
  [Unknown]:  安徽省
該單位的兩字母國家代碼是什麼
  [Unknown]:  CN
CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥市, ST=安徽省, C=CN 正確嗎?  [否]:  y

正在爲如下對象生成 1,024 位 RSA 密鑰對和自簽名證書 (SHA1withRSA)(有效期爲 36,500 天):
         CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥市, ST=安徽省, C=CN
輸入<tomcat>的主密碼
        (若是和 keystore 密碼相同,按回車):
[正在存儲 D:\tomcat.keystore]

C:\Windows\system32>

「D:\tomcat.keystore」含義是將證書文件的保存路徑,證書文件名稱是tomcat.keystore(可自定義名稱);
「-validity 36500」含義是證書有效期,36500表示100年,默認值是90天;


2、爲客戶端生成證書

一、生成客戶端證書

C:\Windows\system32>keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\client.key.p12
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
  [Unknown]:  StoneXing
您的組織單位名稱是什麼?
  [Unknown]:  iFLYTEK
您的組織名稱是什麼?
  [Unknown]:  iFLYTEK
您所在的城市或區域名稱是什麼?
  [Unknown]:  合肥
您所在的州或省份名稱是什麼?
  [Unknown]:  安徽省
該單位的兩字母國家代碼是什麼
  [Unknown]:  CN
CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN 正確嗎?  [否]:  y

正在爲如下對象生成 1,024 位 RSA 密鑰對和自簽名證書 (SHA1withRSA)(有效期爲 90 天):
         CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN
[正在存儲 D:\client.key.p12]

C:\Windows\system32>

生成的兩個文件:


二、安裝客戶端證書
雙擊客戶端證書「client.key.p12」完成導入證書過程以下:



3、讓服務器信任客戶端證書

一、將客戶端證書導出爲CER文件
因爲是雙向SSL認證,服務器必需要信任客戶端證書,所以,必須把客戶端證書添加爲服務器的信任認證。因不能直接將PKCS12格式的證書庫導入服務器證書庫,將客戶端證書導出爲一個單獨的CER文件
keytool -export -alias mykey -keystore D:\client.key.p12 -storetype PKCS12 -storepass password -rfc -file D:\client.key.cer
注:password爲客戶端證書的密碼

C:\Windows\system32>keytool -export -alias mykey -keystore D:\client.key.p12 -storetype PKCS12 -storepass 888888 -rfc -file D:\client.key.cer
保存在文件中的認證 <D:\client.key.cer>

C:\Windows\system32>


二、將CER文件導入到服務器的證書庫
添加爲一個信任證書使用命令以下:

C:\Windows\system32>keytool -import -v -file D:\client.key.cer -keystore D:\tomcat.keystore
輸入keystore密碼:
全部者:CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN
簽發人:CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN
序列號:52e07723
有效期: Thu Jan 23 09:57:55 CST 2014 至Wed Apr 23 09:57:55 CST 2014
證書指紋:
         MD5:15:29:58:68:8D:63:E1:00:8E:E6:EC:5E:AD:23:79:38
         SHA1:B7:EF:B9:67:BD:56:95:82:3D:D8:14:0D:20:69:F0:C8:60:98:31:9A
         簽名算法名稱:SHA1withRSA
         版本: 3
信任這個認證? [否]:  y
認證已添加至keystore中
[正在存儲 D:\tomcat.keystore]

C:\Windows\system32>


三、檢查安裝結果

經過list命令查看服務器的證書庫,能夠看到兩個證書,一個是服務器證書,一個是受信任的客戶端證書:
keytool -list -keystore D:\tomcat.keystore (tomcat爲你設置服務器端的證書名)。

C:\Windows\system32>keytool -list -keystore D:\tomcat.keystore
輸入keystore密碼:

Keystore 類型: JKS
Keystore 提供者: SUN

您的 keystore 包含 2 輸入

tomcat, 2014-1-23, PrivateKeyEntry,
認證指紋 (MD5): 4B:71:06:02:7C:35:F8:BF:B1:24:E2:68:8F:65:75:15
mykey, 2014-1-23, trustedCertEntry,
認證指紋 (MD5): 15:29:58:68:8D:63:E1:00:8E:E6:EC:5E:AD:23:79:38

C:\Windows\system32>


4、讓客戶端信任服務器證書

一、把服務器證書導出爲CER文件
因爲是雙向SSL認證,客戶端也要驗證服務器證書,所以,必須把服務器證書添加到瀏覽的「受信任的根證書頒發機構」。因爲不能直接將keystore格式的證書庫導入,必須先把服務器證書導出爲一個單獨的CER文件,使用以下命令:
keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer (tomcat爲你設置服務器端的證書名)。

C:\Windows\system32>keytool -keystore D:\tomcat.keystore -export -alias tomcat -file D:\tomcat.cer
輸入keystore密碼:
保存在文件中的認證 <D:\tomcat.cer>

C:\Windows\system32>


二、在客戶端安裝服務器證書
雙擊「tomcat.cer」,按照提示安裝證書,將證書填入到「受信任的根證書頒發機構」。


三、檢查安裝結果
IE -> Internet選項 -> 內容 -> 證書


5、配置Tomcat服務器

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
  2.            maxThreads="150" scheme="https" secure="true"  
  3.            clientAuth="false" sslProtocol="TLS"  
  4.            keystoreFile="D:\\tomcat.keystore" keystorePass="888888"  
  5.            truststoreFile="D:\\tomcat.keystore" truststorePass="888888" />  

注意服務端證書名保持一致
屬性說明:
clientAuth:設置是否雙向驗證,默認爲false,設置爲true表明雙向驗證
keystoreFile:服務器證書文件路徑
keystorePass:服務器證書密碼
truststoreFile:用來驗證客戶端證書的根證書,此例中就是服務器證書
truststorePass:根證書密碼

6、測試

https://localhost:8443/


服務器的證書與網址不相符問題須要理解瀏覽器作了什麼:

一、瀏覽器將本身支持的一套加密規則發送給網站。
二、網站從中選出一組加密算法與HASH算法,並將本身的身份信息以證書的形式發回給瀏覽器。證書裏面包含了網站地址,加密公鑰,以及證書的頒發機構等信息。
三、得到網站證書以後瀏覽器要作如下工做:
      a)  驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),若是證書受信任,則瀏覽器欄裏面會顯示一個小鎖頭,不然會給出證書不受信的提示。
      b)  若是證書受信任,或者是用戶接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。
      c)  使用約定好的HASH計算握手消息,並使用生成的隨機數對消息進行加密,最後將以前生成的全部信息發送給網站。
相關文章
相關標籤/搜索