博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSL/TLS双向认证案例参考
阅读量:5924 次
发布时间:2019-06-19

本文共 3911 字,大约阅读时间需要 13 分钟。

  hot3.png

一.首先我们需要生成服务器端和客户端的数字证书并添加信任

实际应用环境里,需要向CA机构申请服务器证书。这里我们为了测试方便通过Keytool工具生成自签名证书来模拟。

注:相关参数说明请使用 keytool -help 查阅

 

1. 生成服务器端证书

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”082448_1qXY_1170792.jpg 

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”082524_PYdk_1170792.jpg 

3. 让服务器信任客户端证书

(1)从刚刚生成的客户端证书库中导出客户端证书

keytool -export -alias alanClient -keystore alanClient.p12 -storetype PKCS12 -rfc -file alanClient.cer082612_MHHx_1170792.jpg 

 (2) 导入客户端证书到服务器证书库作为一个信任证书

keytool -import -v -file alanClient.cer -keystore alan.keystore082700_vOnv_1170792.jpg 

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访问服务器

 

因为是自签名证书,所以这里会有提示,点击“继续浏览此网站”即可进入,同时在后台可以看到如下打印输出:

082804_A2bq_1170792.jpg 

因为是自签名证书,所以这里会有提示,点击“继续浏览此网站”即可进入,同时在后台可以看到如下打印输出:

083116_nvA8_1170792.jpg

 

至此,SSL/TLS双向认证即配置成功!可以根据自己的业务需求对获取到的证书信息进行相关业务操作即可。

转载于:https://my.oschina.net/moson/blog/313126

你可能感兴趣的文章
django 一对多,多对多关系解析
查看>>
配置percona mysql server 5.7基于gtid主主复制架构
查看>>
Windows2016的 IIS中配置PHP7运行环境
查看>>
浏览器image对象相关总结,(含PC浏览器,移动浏览器)
查看>>
实验报告五
查看>>
ORB0-SLAM2 system.h 阅读
查看>>
ueditor编辑器使用总结
查看>>
ssh整合之七注解结合xml形式
查看>>
[C puzzle book] Programming styles
查看>>
Javascript&Jquery获取浏览器和屏幕各种高度宽度方法总结及运用
查看>>
js懒加载
查看>>
小波变换 完美通俗解读【转载】
查看>>
python练习---校园管理系统
查看>>
小程序简介
查看>>
表格行的偶数与奇数
查看>>
基础数据类型之列表,元组
查看>>
1124 Raffle for Weibo Followers
查看>>
如何对文献进行阅读与整理
查看>>
GsonFormat插件
查看>>
SharePoint Portal Server 2003深入指南(部分章节--转)1
查看>>