SSL/TLS双向认证案例参考

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

实际应用环境里,需要向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

版权声明:本文为weixin_33747129原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33747129/article/details/91693428

智能推荐

第三方库PNChart的使用

PNChart 是一个强大的带动画的图表库   要是用这个库可以使用pods,也可以直接将库导入项目中,必须引入"PNChart.h"头文件   下面我们来看一下代码!      转载于:https://www.cnblogs.com/aeronfay/articles/4929223.html...

LeetCode刷题笔记(10)-BFS广度优先搜索

LeetCode刷题笔记(10)-BFS广度优先搜索 127、单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 输入: beginWord = “hit”, endWord = &ldqu...

线性筛选素数的方法及基于线性筛选素数的欧拉函数筛选莫比乌斯函数筛选

欧拉筛法线性求素数 回忆一下经典的埃式筛法求素数。时间复杂度是为O(nloglogn)(我之前一直以为是O(n))O(nloglogn)(我之前一直以为是O(n)) 显然,当一个数是素数的时候,那么他的倍数肯定是合数,筛选标记即可 我们来举个列子 筛选2-10的素数 首先2是素数,然后把其倍数删去,我们标记下删去的次数用一个斜杠表示删去了一次 之后3是素数,继续删去倍数,这个时候发现6被重复删去两...

JEECG 页面多个用户选择器只显示最后一个

在一个页面当中,我们可能会需要有多个的用户选择器进行快速的录入,此时会发现所有的输入都会在最后一个用户选择器的地方显示 查看页面代码当中的ID也是不一致: 查看通过标签生成之后的源码,可以发现所有的用户选择器都会生成一个 点击输入框调用的js方法都是一样的,看到这里也就可以明白为什么都是只有最后一个用户选择输入框当中有数据了。 因此我们对后台当中标签代码生成部分进行改造,让其支持多个用户选择器: ...

力扣47 全排列ii 回溯加剪枝

 这题难点在于先排序,然后重复的数字112 used[i-1]= fase 代表之前我用过了,就是我俩 1前面的用过了现在这一个我就直接跳过去    ...

猜你喜欢

arp协议

arp协议叫做地址解析协议,通常与ip地址共同使用,将ip地址转换成硬件地址(MAC地址)。arp既可以放在网络层,也可以放在数据链路层,因为它做了两层的工作。 当一个主机向另一个主机发送数据报时,通过arp协议,向局域网中发送arp请求,所有在局域网中的主机都可以收到,但会在网络层丢弃,只有一台符合目的ip的主机会发送给源主机arp响应包含自己mac地址,因此源主机就可以向目的主机发送报文。 l...

模拟登陆改版后的知乎(最新版)

今天,想着看看视频,把模拟登陆这一块学习学习,以后弄把梯子,去爬爬FaceBook什么的。就拿知乎练练手吧,可曾想,知乎竟然改版了!!之前的教程书籍对现在的知乎来说,都是扯淡,连页面都找不到了。下面一起谈谈改版后的纸糊的模拟登陆吧。 页面分析 抓包 首先,打开页面:https://www.zhihu.com/signup?next=%2F(登录网址都变了…),F12,输入账号密码(记...

干货分享——比微信域名防封防举报更牛逼的防封方案

从微信兴起到现在,微信的流量就一直居高不下,在淘宝时代和传统的电商时代,只要把广告打出去,别人通过搜索就可以找到我们,所以,移动互联网的到来,在微信爆棚的今天,都想在微信里面推广自己的产品,借力微信,达到客户沉淀,营销宣传,传播影响的目的,可以由于微信种种机制,有人腾讯要维护自身的利益,也有人说是微信要营造一个健康的生态圈,种种限制,比如分享次数过多,域名会被微信拦截屏蔽封杀,还比如微信中的链接不...

mysql的事务提交(java)

个人理解的一个事务:是一个Connection一系列的操作过程,如果是两个Connection连接在操作,那就是两个事务。 事务的前提:数据库的存储引擎是innodb。 事务的目的:保证数据的安全性。 事务安全:  1.自动提交事务:每执行一条sql语句,就同步到数据库中。  2.手动提交事务:执行一系列的sql语句后一起同步到数据库中。 事务的四大特性:  A(at...

使用宏批量修改word中图片大小

                word中使用宏修改图片大小,图片大小相同 1、打开word中视图选项卡,选择“宏”->“输入宏名”->“创建” 2、编辑宏 输入下面...