SSL使用windows证书库中证书实现双向认证
前一段时间对OpenSSL库中的SSL通讯稍微琢磨了一下,在百度文库中找了个示例程序,然后在机器上跑,哇塞,运行成功!那时那个惊喜啊,SSL蛮简单的嘛。前几天,老板要我整一个SSL通讯,要使用windows证书库中的证书进行双向认证,我就想,那不是一小case嘛,于是没怎么放在心上,先休息两天再说。。昨天开完会后,决定开始整。。一打开原来做的SSL工程,我靠,傻眼了,原来示例程序中使用的都是OpenSSL生成的,例如CA证书,Server端证书,Client端证书,以及各自的密钥文件,我想,这咋办呢,还是把windows证书库中的证书先导出来,然后在程序中使用证书文件吧,但又一想,如果是多级证书咋办呢,那就要使用证书链了,从哪获得证书链呢,难道还要去根证书库中把所有CA证书也导出来吧,然后自己生成证书链?这难度也忒大了吧,在百度中搜索,还真有人做过,他提供了一个示例,输入多个证书文件生成证书链,然后再根据证书链验证证书。如果要这样做,就要导出所有CA证书(根证书以及所有中间证书),实现起来意义不大(必须要到各个证书库中寻找CA证书)。后来又一想,我们每次查看证书时不是可以看到证书的路径吗。。是啊,证书库肯定维护了证书彼此的关联,能不能直接导出一个证书链呢?百度,谷歌,找了大半天,发现竟然可以,在导出证书时选择“导出PKCS#7证书”,导出的就是.p7b格式的证书,这就是表示证书链。SSL提供的API中有SSL_CTX_use_certificate_chain_file接口,但是有要求,必须要使用PEM格式的证书链,我草,为什么就不能支持两个格式呢,幸亏OpenSSL提供了命令PKCS7,可以把.p7b格式的证书链转化成.pem格式。这里转化也不是那么顺利,刚开始转化时就使用OpenSSL pkcs7 -inform DER -outform PEM -in 某某.p7b -out 某某.pem,得到的结果竟然是PKCS7文件(以Begin PKCS7开头和以End PKCS7结尾),使用这个文件SSL_CTX_use_certificate_chain_file运行失败。我也觉得失败是正常的,这不太像证书链吧(证书链就是有顺序的在一个文件中存放多个证书,这是我的理解)。然后我重新使用pkcs7命令进行转化,各个尝试,好像都不对,但是通过加-text或-print_certs后再修改就可以了。使用OpenSSL pkcs7 -inform DER -outform PEM -in -text或OpenSSL pkcs7 -inform DER -outform PEM -in -print_certs,后然后打开文件,删除一些东西就可以了,让文件中存放的都是证书。然后测试,运行成功,这样,证书链的问题就解决了。
在SSL两端的服务器证书和客户端证书,都必须要使用证书对应的私钥。如果我们是通过OpenSSL生成的证书,我们肯定可以得到相应的密钥文件。我们要使用的是windows证书库中的证书,如何获得OpenSSL可以使用的密钥呢。在网上搜到一个CSP Engine程序,里面提供了从一个windows证书上下文CERT_CONTEXT获得OpenSSL中对应的X509格式证书和EVP_PKEY格式密钥的接口EVP_PKEY_new_CERT_CONTEXT,然后就可以使用SSL_CTX_use_PrivateKey函数传入EVP_PKEY格式密钥。
服务器端基本上完成了。
客户端需要对传过来的服务器证书链进行验证,还需要设置一个根证书,使用SSL_CTX_load_verify_locations可以设置根证书到SSL上下文。传入的参数是根证书的文件名和路径。这里要强调一点,这里的根证书必须是PEM格式的,如果是从windows证书库中导出的,那是DER格式,所以必须要进行转化,可以使用x509命令。
客户端基本上也完成了。
然后客户端就可以对服务器进行认证了。服务器对客户端的认证过程也是类似的,这里就不重复讲解了。
SSL使用windows证书库中证书实现双向认证的更多相关文章
- SSL/TLS协议详解(中)——证书颁发机构
本文转载自SSL/TLS协议详解(中)--证书颁发机构 导语 上一篇中,我们讨论了关于Diffie Hellman算法的SSL/TLS密钥交换.我们最终认为需要第三方来验证服务器的真实性,并提出了证书 ...
- Https:创建部署SSL证书进行双向认证
一.前言 建立客户端与服务器的Https的连接需要证书进行双向验证后,才可访问. 二.证书类型 不同数字证书部署在服务器上后,用户浏览器访问网站时,展示如下: 1.无证书时 显示不安全标识. 2. ...
- windows下tomcat+nginx+openssl配置双向认证
1. 基础知识 CA证书:https://blog.csdn.net/yangyuge1987/article/details/79209473 SSL双向认证原理:https://blog.csdn ...
- 使用自签CA,Server,client证书和双向认证
服务端代码 package main import ( "crypto/tls" "crypto/x509" "google.golang.org/g ...
- ubuntu下 将证书导入java的cacerts证书库
首先,说下java的cacerts证书库: JAVA_HOME目录下的jre的cacerts 主要的步骤有4个: 生成证书 导出证书 导入证书 生成证书(此处CN的值为localhost或者你想设置的 ...
- 【密码学】SSL双向认证以及证书的制作和使用
客户端认证服务器: 正规的做法是:到国际知名的证书颁发机构,如VeriSign申请一本服务器证书,比如支付宝的首页,点击小锁的图标,可以看到支付宝是通过VeriSign认证颁发的服务器证书: 我们用的 ...
- java ssl https 连接详解 生成证书
我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全 ...
- java ssl https 连接详解 生成证书 tomcat keystone
java ssl https 连接详解 生成证书 我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over ...
- windows p12(pfx)个人证书安装过程
证书库个人证书存储区为其中的每个证书维护一个属性CERT_KEY_PROV_INFO_PROP_ID,该属性指定了证书对应的密钥容器的相关信息,包括密钥容器名,CSP名称,CSP类型,密钥用途,以及C ...
随机推荐
- MINIX3 进程通信分析
MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...
- for else
- Dubbox监控在服务器中的安装
Jdk-1.6.30以上版本 Tomcat-7.0.42 Duboo-2.5.3 Zookeeper-3.4.5 端口分配 序 系统/端口 http https shutdown ajp 调度JMX ...
- RelativeLayout相对布局
RelativeLayout相对布局常用属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_center ...
- telnet命令使用示例
导读 telnet命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式.它 ...
- tulterbot遥感操作使用Interactive Markers--12
原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 1.安装ros indigo功能包: sudo apt-get install ros-indigo-t ...
- Java——网络编程
// TODO Auto-generated method stub //获取本地主机IP对象 InetAddress ip = InetAddress.getLocalHost(); Syst ...
- java的nio之:java的nio系列教程之Scatter/Gather
一:Java NIO的scatter/gather应用概念 ===>Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Chann ...
- PHP递归题目
$arr = [ 'a' => 'A', 'b' => 'B', 'c' => [ 'd'=> 'D', 'e'=>[ 'f'=>'F', 'g'=>['h' ...
- ps颜色相加
一. 红+绿=黄 红+蓝=品红 绿+蓝=青 白色:红+绿+蓝=白色.(黄.品红.青,两种以上颜色相加是白色) 互补色:红->青.绿->品红.蓝->黄 二. 品红+黄=红 青+黄=绿 ...