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 ...
随机推荐
- Netty ChannelOption 解释
Name Associated setter method "writeBufferHighWaterMark" 默认 64 * 1024(用法未知) "writeBuf ...
- SPAdes
用后感: 拼个小基因组还好,对于很大的基因组,文库很多的,还是不要用了.服务器768G内存,都不够用.... 主页: http://bioinf.spbau.ru/spades 说明书: http:/ ...
- 隐藏select最右侧的下拉三角图标的css样式
-webkit-appearance:none; -moz-appearance:none; appearance:none;
- 新浪代码部署手册 git管理工具
目前新浪云上的应用支持通过Git和SVN来部署代码. Git仓库地址 https://git.sinacloud.com/YOUR_APP_NAME SVN仓库地址 https://svn.sinac ...
- zookeeper的 目录加密
import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.WatchedEvent;import org.apache.zo ...
- AI编辑SVG格式的相关问题
制作SVG:1.需要给每个图层命名,生成的SVG文件的(表示一个路径,另外还有标签等)标签就会有个id属性是这个图层的名字2.保存的时候内嵌文字可以保存为SVG或转为path格式,如果没有文字,则无所 ...
- 《苹果开发之Cocoa编程》挑战2 创建一个数据源 练习
<苹果开发之Cocoa编程>第4版 P87 创建一个to-do list应用程序,在文本框中输入任务.当用户单击Add按钮时,添加字符串到一个变长队列,新任务就出现在list的末尾. 关键 ...
- uploadify上传
一.上传按钮样式 1.1id="show_filebutton"是显示给用户操作按钮,id="filebutton"是flash上传按钮完成用户上传操作.id ...
- HTTPS-使用Fiddler抓取HTTPS数据包原理
最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...
- OSGi 的核心配置、动态化及问题
一.OSGi的核心组件Bundle,与java中jar包的差别就是元数据配置: 常用的Bundle元数据定义: a) Bundle-Activator:定义Activator的实现全 ...