C++ windows客户端支持SSL双向认证
C++ windows客户端支持SSL双向认证,服务端是JAVA开发的,使用的证书是jks格式的。C++并不支持JKS格式的证书,所以要用openssl进行转换下。
1、 需要先把jks转成.p12文件
keytool -importkeystore -srckeystore demo.jks -destkeystore demo.p12 -srcstoretype jks -deststoretype pkcs12
2、然后把.p12文件转成pem文件
openssl pkcs12 -nodes -in demo.p12 -out demo.pem
3、拷贝-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----到cacert.pem文件里
如果有cer格式证书文件有可用下面的命令直接转成cacert.pem
openssl x509 -inform der -in demo.cer -out cacert.pem
4、提取私有key
openssl pkcs12 -in demo.p12 -nocerts -nodes -out demo.key;
openssl rsa -in demo.key -out privkey.pem;
流程图:

有几点注意的地方:
1、SSL_load_error_strings();
SSL_library_init();
OpenSSL_add_all_algorithms();
只需要执行一次即可,即使后面需要重新连接,也不需要再次调用。所以放在构造函数里可以里了。
2、一般连接的时候,都会把socket设置成非阻塞的,防止服务端不在线,需要连接很久。但是设置非阻塞之后,ssl_connect可能会连接失败,所以需要多次连接。
所以我自己封装了下:
int CSslSocketClient::SSL_ShakeHands()
{
int ssl_conn_ret = SSL_connect(m_ssl);
if (ssl_conn_ret == )
{
return ;
}
else if (ssl_conn_ret == -)
{
int ssl_conn_err = SSL_get_error(m_ssl, ssl_conn_ret);
if (SSL_ERROR_WANT_READ == ssl_conn_err ||
SSL_ERROR_WANT_WRITE == ssl_conn_err) {
//需要再次来进行握手
return -;
}
else
{
return -;
}
}
else
{
return -;
}
}
外面调用的时候,如果返回值是0,说明成功,如果是-1,说明失败,如果是-2,说明需要再次ssl连接。
3、因为要支持双向认证,所以在SSL_new之前需要加载下证书,并check下。
CString strPath;
strPath.Format("%s\\pem\\%s", m_strWorkPath, CERT_NAME);
if (SSL_CTX_use_certificate_file(m_ctx, strPath, SSL_FILETYPE_PEM) <= ){
MYTRACE("CSslSocketClient", "certificate file error!");
DisconnectSocket();
return -;
} strPath.Format("%s\\pem\\%s", m_strWorkPath, PRIV_NAME);
if (SSL_CTX_use_PrivateKey_file(m_ctx, strPath, SSL_FILETYPE_PEM) <= ){
MYTRACE("CSslSocketClient", "use privatekey file Error: %s\n", ERR_reason_error_string(ERR_get_error()));
DisconnectSocket();
return -;
}
if (!SSL_CTX_check_private_key(m_ctx)){
MYTRACE("CSslSocketClient", "Check private key failed!\n");
DisconnectSocket();
return -;
}
4、类的析构函数里释放内存ssl的内存,但是仍然会有2MB左右的内存泄漏,不会也没有关系,反正这时候程序已经退出了。
// 释放内存
sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
CRYPTO_cleanup_all_ex_data(); ERR_remove_state();
CONF_modules_unload();
CONF_modules_free();
ERR_free_strings();
ERR_remove_thread_state(NULL);
EVP_cleanup();
上面的函数需要头文件
#include <openssl/err.h>
#include <openssl/conf.h>
C++ windows客户端支持SSL双向认证的更多相关文章
- nginx支持ssl双向认证配置
nginx支持ssl双向认证配置 listen 443; server_name test.com; ssl on; ssl_certificate server.crt; //server端公钥 s ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
- SSL双向认证(高清版)
介绍了SSL双向认证的一些基本问题,以及使用Nginx+PHP基于它搭建https的Webservice. 之前的方式只是实现1:1的模式,昨天同事继续实现了n:1的模式,这里我再整理记录下. 由于n ...
- Nginx、SSL双向认证、PHP、SOAP、Webservice、https
本文是1:1模式,N:1模式请参见新的一篇博客<SSL双向认证(高清版)> ----------------------------------------------------- 我是 ...
- apache用户认证,ssl双向认证配置
安装环境: OS:contos 6.4 httpd:httpd-2.2.15-59.el6.centos.i686.rpm openssl:openssl-1.0.1e-57.el6.i686.rpm ...
- SSL双向认证和SSL单向认证的流程和区别
refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...
- php实现https(tls/ssl)双向认证
php实现https(tls/ssl)双向认证 通常情况下,在部署https的时候,是基于ssl单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端. 但在一些安全性较高的场景,如银行, ...
- php使用curl库进行ssl双向认证
官方文档: http://www.php.net/manual/zh/function.curl-setopt.php#10692 官方举例: <?phpcurl_setopt($ch, CUR ...
- tomcat配置SSL双向认证
一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ...
随机推荐
- python 在init方法中导入数据
- Libevent:5events相关
Libevents的基本操作单元是event,每一个event代表了一些条件的集合,这些条件包括: 文件描述符已经准备好读或写 文件描述符正在变为就绪,准备好读或写(仅限于边沿触发) 超时事件 信号发 ...
- 2016年中国的SaaS服务商企业研究
近年来,随着中国人口红利的消退及移动互联网红利的凸显,让中国的To C创业,尤其是O2O领域的创业经历了一波高潮.2015年末,一场"资本寒冬"让O2O创业趋于理性,但SaaS及T ...
- datetimepicker —— 日期选择控件
一.依赖 <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel=&qu ...
- mysql 查询当天、昨天、本周、上周、本月、上月、今年、去年数据
mysql查询今天.昨天.7天.近30天.本月.上一月 数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT ...
- 中国联通与阿里云达成合作,推动5G+新媒体产业发展
4月24日在中国联通合作伙伴大会上,阿里云与中国联通签署合作协议,未来双方将基于各自优势,聚焦5G时代下的超高清视频发展. 随着5G时代到来,视频不再被网速制约,超短延时.计算节点下沉等特性将更高清. ...
- LeetCode70 Climbing Stairs
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- 2018-8-10-win10-uwp-如何在DataTemplate绑定方法
title author date CreateTime categories win10 uwp 如何在DataTemplate绑定方法 lindexi 2018-08-10 19:16:50 +0 ...
- webpack详述
一.利用package.json执行打包任务 首先使用npm init生成package.json文件:然后配置scripts如下: "scripts": { "buil ...
- [***]HZOJ 柱状图
神仙题. 作者的正解: *logn). 算法三:对于100%的数据: 我们枚举屋顶位置再三分高度的做法,复杂度的瓶颈在于花费的计算.假设屋顶在i处,高度为hi,如果j<i,有hj-j=hi ...