Openssl实现双向认证教程(附服务端客户端代码)实现双向认证教程(附服务端客户端代码)
一、背景说明一、背景说明
1.1 面临问题
最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击。
《信息安全工程》中接触过双向认证,但有两个问题。
第一个是当时最终的课程设计客户端是浏览器,服务端是tomcat双向认证只需要对两者进行配置并不需要自己真的实现代码。
第二个是虽然课程也有接近双向认证的实现代码,但当时是Java+JCE环境现在要用C+++OpenSSL环境,总体意思确实还是差不多但具体函
数和参数差别还是不少。
所以眼下有的是:证书生成的思想+双向认证实现的思想。对读者而言,即要假定已对证书、SSL/TSL、socket编程等几个概念有基本的了
解,本文不做详细介绍。
基于此本文要解决的问题是:openssl具体如何生成证书+openssl如何实现双向认证。
双向认证的关键点在以下几个函数(服务端和客户端都一样),其他就不细说参看代码注释:
SSL_CTX_set_verify—-配置启用双向认证
SSL_CTX_load_verify_locations—-加载信任的根证书
SSL_CTX_use_certificate_file—-加载自己的证书
SSL_CTX_use_PrivateKey_file—-加载自己的私钥
SSL_get_verify_result—-真正进行验证,一定要调用这个函数不然前面四个光配置而已并不会进行双向验证
二、双向认证程序实现二、双向认证程序实现
2.1 安装openssl及开发api
apt-get install libssl-dev
2.2 服务端代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define MAXBUF 1024
void ShowCerts(SSL * ssl)
{
X509 *cert;
char *line;
cert = SSL_get_peer_certificate(ssl);
// SSL_get_verify_result()是重点,SSL_CTX_set_verify()只是配置启不启用并没有执行认证,调用该函数才会真证进行证书认证
// 如果验证不通过,那么程序抛出异常中止连接
if(SSL_get_verify_result(ssl) == X509_V_OK){
printf("证书验证通过");
}
if (cert != NULL) {
printf("数字证书信息:\n");
line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
printf("证书: %s", line);
free(line);
line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
printf("颁发者: %s", line);
free(line);
X509_free(cert);
} else
printf("无证书信息!");
}
int main(int argc, char **argv) {
int sockfd, new_fd;
评论5