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 ...
随机推荐
- 【转】apache与tomcat的区别
Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...
- 在Python中,令values=[0,1,2];values[1]=values,为何结果是[0,[...],2]?
转载自:http://www.zhihu.com/question/21000872/answer/16856382>>> values = [0, 1, 2] >>&g ...
- java serializable深入了解
声明:本文转自csdn论坛,原文地址为http://blog.csdn.net/zdw890412/article/details/7380069,对原作者表示感谢! 引言 将 Java 对象序列化为 ...
- linux.打包与压缩
//打包tar -zcvf etc.tar.gz /etc//解包tar -zxvf hdmzy.tar.gz
- Cortana 在安装语言包后失灵 | 解决
http://windows.microsoft.com/zh-cn/windows-10/cortanas-regions-and-languages 适用于 Windows 10 Currentl ...
- leetcode之反转链表
原文链接:点击打开链接 Reverse a singly linked list A linked list can be reversed either iteratively or recursi ...
- 文件API及其特点
Internet Explorer 10 和使用 JavaScript 的 Windows 应用商店应用引入了对文件 API 的支持.文件 API 是万维网联合会 (W3C) 的一个 Web 规范草案 ...
- 本文使用springMVC和ajax,实现将JSON对象返回到页面
一.引言 本文使用springMVC和ajax做的一个小小的demo,实现将JSON对象返回到页面,没有什么技术含量,纯粹是因为最近项目中引入了springMVC框架. 二.入门例子 ①. 建立工程, ...
- 创建kafkatopic和productor
cd 到kafka 目录下 创建topic create topicbin/kafka-topics.sh --zookeeper spark1:2181,spark2:2181,spark3:218 ...
- IOS中使用手机号注册
#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface KCVVerify : NSObject ...