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
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天;
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>
生成的兩個文件:
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>
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>
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>
C:\Windows\system32>keytool -keystore D:\tomcat.keystore -export -alias tomcat -file D:\tomcat.cer
輸入keystore密碼:
保存在文件中的認證 <D:\tomcat.cer>
C:\Windows\system32>
服務器的證書與網址不相符問題須要理解瀏覽器作了什麼:
一、瀏覽器將本身支持的一套加密規則發送給網站。