http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html
http://blog.csdn.net/jasonhwang/article/details/2344768
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
http://blog.csdn.net/jasonhwang/article/details/2413310
http://my.oschina.net/moson/blog/313126
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>
服务器的证书与网址不相符问题需要理解浏览器做了什么:
1、浏览器将自己支持的一套加密规则发送给网站。