Linux C下使用openssl实现SSL双向认证服务端代码实现

zhuzhisen 2016-04-18 01:49:09
我用Openssl实现SSL连接,但是根据报文内容的不同会需要有的条件(A)单向认证,有的条件(B)双向认证。我就面临了一个问题,如果是双向认证的情况,首先我要获取报文才能判断是否需要双向认证,但是报文又必须在SSL连接建立后才会得到,也就是双向认证通过以后。由于对SSL双向认证的理解还不是很深刻,大神帮我给个服务端的双向认证模型,是不是先单向认证建立连接,再获取客户端证书验证。

我的服务端模型:

// 初始化CTX
SSL_library_init();
OpenSSL_add_all_algorithms()
SSL_load_error_strings();
SSL_CTX_new( TLSv1_server_method());
// 请求获取客户端证书
SSL_CTX_set_verify( ctx, SSL_VERIFY_PEER, NULL);
// 加载服务端证书
SSL_CTX_use_certificate_file( ctx, CERTFL, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file( ctx, PRIKEY, SSL_FILETYPE_PEM);
SSL_CTX_check_private_key( ctx);
//建立socket连接
accept();
// 加入SSL连接
SSL_new();
SSL_set_fd();
SSL_accept();

到这里就面临问题了,SSL_accept()已经是在SSL握手了,但是这里是双向认证还是单向认证呢?还是说认证需要后续单独完成?握手的时候不就要交换证书协商通讯密钥了么?理解不深刻,请指正。


...全文
2221 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_40156544 2019-11-12
  • 打赏
  • 举报
回复
在握手之前需要使用SSL_CTX_set_verify(SSL_CTX* ctx,int mode,int (*verify_callback)(int,X509_STORE_CTX*));
接口来配置对应ssl类是否认证对方证书。
wang594606821 2016-09-20
  • 打赏
  • 举报
回复
问下 你这个问题解决了吗, 我这边遇到个类似的问题; 方便的话,还想请教下;
zhuzhisen 2016-04-22
  • 打赏
  • 举报
回复
// 初始化CTX SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); SSL_CTX_new( TLSv1_client_method()); // 请求获取服务端证书 SSL_CTX_set_verify( ctx, SSL_VERIFY_PEER, verify_cb) //加载客户端证书 SSL_CTX_load_verify_locations(); SSL_CTX_set_default_passwd_cb_userdata(); SSL_CTX_use_certificate_file() SSL_CTX_use_PrivateKey_file(); SSL_CTX_check_private_key(); //创建socket,略 connect() // 加入SSL SSL_new(); SSL_set_fd(); SSL_connect(); 这个是我的双向认证客户端模型,连接别人的服务端没有问题,但是连我自己的服务端就是连不上,SSL_connect()失败。
zhuzhisen 2016-04-22
  • 打赏
  • 举报
回复
别人是java写的服务端,客户端证书是别人提供的,连接没有问题。
pengzhixi 2016-04-18
  • 打赏
  • 举报
回复
引用 2 楼 zhuzhisen 的回复:
[quote=引用 1 楼 pengzhixi 的回复:] 一般是单向认证即客户端验证服务端证书,握手的时候服务端需要发送证书给客户端,以及公钥,选择的加密套件等
你这种是单向认证的情况,调用SSL_accept()就自动完成了,我的问题就是双向认证该怎么实现,如何从代码里面体现出来?[/quote]SSL_CTX_set_verify你这里不是要求了要进行客户端验证的么
LubinLew 2016-04-18
  • 打赏
  • 举报
回复
建立socket连接之前 设置要求验证对端参数,只要是下面几个函数 SSL_CTX_set_verify, SSL_set_verify, SSL_CTX_set_verify_depth, SSL_set_verify_depth
zhuzhisen 2016-04-18
  • 打赏
  • 举报
回复
引用 1 楼 pengzhixi 的回复:
一般是单向认证即客户端验证服务端证书,握手的时候服务端需要发送证书给客户端,以及公钥,选择的加密套件等
你这种是单向认证的情况,调用SSL_accept()就自动完成了,我的问题就是双向认证该怎么实现,如何从代码里面体现出来?
pengzhixi 2016-04-18
  • 打赏
  • 举报
回复
一般是单向认证即客户端验证服务端证书,握手的时候服务端需要发送证书给客户端,以及公钥,选择的加密套件等
课程简介    随着”新基建“的推行,其中涉及到的工业互联网、物联网、人工智能、云计算、区块链,无一不是与安全相关,所有数据的存储、传输、签名认证都涉及到密码学技术,所以在这样的大环境下再结合我多年安全开发经验,设计出这门课程。    因为密码学技术在新基建中的重要性,所以使其成为底层开发人员所必备的技能。特别是现在的区块链技术是全面应用密码学,大数据技术和人工智能技术也要解决隐私安全问题。所以现在学习相关技术是非常必要的技术储备,并且可以改造现有的系统,提升其安全性。课程学习目标了解DES算法原理VS2019创建C++项目,并导入openssl库学会OpenSSL DES算法加解密接口加密文件并做PKCS7 Padding 数据填充解密数据并做数据填充解析课程特点    面向工程应用    市面上的一些密码学课程和密码学的书籍,很多都是从考证出发,讲解算法原理并不面向工程应用,而我们现在缺少的是工程应用相关的知识,本课程从工程应用出发,每种技术都主要讲解其在工程中的使用,并演示工程应用的代码。    从零实现部分算法    课程中实现了base16编解码 ,XOR对称加解密算法,PKCS7 pading数据填充算法,通过对一些简单算法的实现,从而加深对密码学的理解。    理论与实践结合    课程如果只是讲代码,同学并不能理解接口背后的原理,在项目设计中就会留下隐患,出现错误也不容易排查出问题。    如果只讲理论,比如对密码学的一些研究,对于大部分从事工程应用的同学并没有必要,而是理论与实践结合,一切为了工程实践。    代码现场打出    代码不放在ppt而是现场打出,更好的让学员理解代码编写的逻辑,老师现场敲出代码正是展示出了工程项目的思考,每个步骤为什么要这么做,考虑了哪些异常,    易学不枯燥    课程为了确保大部分人开发者都学得会,理解算法原理(才能真正理解算法特性),学会工程应用(接口调用,但不局限接口调用,理解接口背后的机制,并能解决工程中会出现的问题),阅读算法源码但不实现密码算法,,并能将密码学投入到实际工程中,如果是想学习具体的加密算法实现,请关注我后面的课程。课程用到的技术    课程主要演示基于 VS2019 C++,部分演示基于ubuntu 18.04 GCC makefile    如果没有装linux系统,对本课程的学习也没有影响    课程中的OpenSSL基于最新的3.0版本,如果是openss 1.1.1版本也支持,再低的版本不支持国密算法。 课程常见问题课程讲解用的什么平台和工具?    课程演示主要在windows,基于VS2019 ,一些项目会移植到Linux在ubuntu18.04上我不会Linux能否学习本门课程?    可以的,课程主要在Windows上,Linux部分只是移植,可以暂时跳过,熟悉了Linux再过来看我不会C/C++ 语言是否能学习本门课程?    至少要会C语言,C++特性用得不多,但做了一个封装,可以预习一些C++基础。会不会讲算法实现,会不会太难学不会?    课程偏工程应用,具体的AES,椭圆曲线、RSA等算法只通过图示讲原理,一些简单hash算法会读一些源码,并不去实现,课程中会单独实现简洁的XOR对称加密和base16算法(代码量不大易懂)。其他的应用我们都基于OpenSSL3.0的SDK调用算法。课程提供源码和PPT吗?    课程中所有讲解的源码都提供,课程的上课的ppt也提供,PPT提供pdf版,只可以用于学习,不得商用,代码可以用于商用软件项目,涉及到开源系统部分,需要遵守开源的协议,但不得用于网络教学。要观看全部内容请点击c++实战区块链核心密码学-基于opensslhttps://edu.csdn.net/course/play/29593

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧