一.首先咱們須要生成服務器端和客戶端的數字證書並添加信任java
實際應用環境裏,須要向CA機構申請服務器證書。這裏咱們爲了測試方便經過Keytool工具生成自簽名證書來模擬。算法
注:相關參數說明請使用 keytool -help 查閱服務器
1. 生成服務器端證書ide
keytool -genkey -v -keyalg RSA -keysize 1024 -sigalg SHA1withRSA -validity 36000 -alias www.alan.org -keystore alan.keystore -keystore alan.keystore -dname 「CN=www.alan.org,OU=alan,O=alan,L=HN,ST=HN,C=CN」 工具
2. 生成客戶端證書測試
keytool -genkey -v -keyalg RSA -keysize 1024 -sigalg SHA1withRSA -validity 36000 -alias alanClient -storetype PKCS12 -keystore alanClient.p12 -dname 「CN=alan-client,OU=alan,O=alan,L=HN,ST=HN,C=CN」 網站
3. 讓服務器信任客戶端證書url
(1)從剛剛生成的客戶端證書庫中導出客戶端證書spa
keytool -export -alias alanClient -keystore alanClient.p12 -storetype PKCS12 -rfc -file alanClient.cer code
(2) 導入客戶端證書到服務器證書庫做爲一個信任證書
keytool -import -v -file alanClient.cer -keystore alan.keystore
4. 導入客戶端證書到IE證書庫
雙擊執行alanClient.p12文件導入證書到「我的」證書庫。
注:實際應用中,客戶端若是使用電子鑰匙,則使用相應電子鑰匙驅動工具註冊鑰匙內數字證書到IE證書庫便可
二. 配置WEB服務器端(以Tomcat服務器爲例)
在Tomcat的server.xml文件中配置雙向認證,配置代碼參考以下:
<Connector
port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="true"
sslProtocol="TLS"
keystoreFile="conf/alan.keystore"
keystorePass="changeit"
truststoreFile="conf/alan.keystore"
truststorePass="changeit"/>
注:若是這裏密鑰庫文件使用PKCS12格式,則還需指定keystoreType="PKCS12"
三.服務器端代碼參考(以Java爲例)
添加一個過濾器,過濾請求並獲取屬性「javax.servlet.request.X509Certificate」的值:
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訪問服務器
由於是自簽名證書,因此這裏會有提示,點擊「繼續瀏覽此網站」便可進入,同時在後臺能夠看到以下打印輸出:
由於是自簽名證書,因此這裏會有提示,點擊「繼續瀏覽此網站」便可進入,同時在後臺能夠看到以下打印輸出:
至此,SSL/TLS雙向認證即配置成功!能夠根據本身的業務需求對獲取到的證書信息進行相關業務操做便可。