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 ...
随机推荐
- C++学习笔记1:高级语言
笔记参考资料:http://www.learncpp.com/ 1.high languages:C,C++,Pascal,Java,Javascript,Perl... compiling proc ...
- php求文件的相对路径
php转义字符的应用,\为转义字符需要转义为\\. <?php //求b相对a的路径 $a="d:\web\file\ab.php"; $b="d:\web\fil ...
- installshield
转载出处:海洋女神
- 使用innerHTML生成的script节点不会发出请求与执行text属性
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 三 GPU 并行编程的运算架构
前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别?本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流, ...
- Linux启动流程详解
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- 199. Binary Tree Right Side View
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...
- iOS8适配工作
1 按钮,菜单文字被加上下划线的问题. 2 状态栏被遮挡的问题.(iPhone6明显,iPhone4S无) 3 使用xcode6最新版本进行编译出现的通知无法呈现的问题(也不进行提示) 4 权限检测( ...
- MySQL 参数autoReconnect=true 解决8小时连接失效
<!-- dataSource加参数 处理mysql 8小时自动断开连接的问题 --> <property name="testWhileIdle" va ...
- java 日期格式 毫秒
参考URL:http://www.busfly.net/csdn/post/java_string_fomat_date_time_simpledateformat.html 关键代码: java.t ...