openssl实现双向认证教程(服务端代码+客户端代码+证书生成) | 您所在的位置:网站首页 › pyopenssl和openssl的区别 › openssl实现双向认证教程(服务端代码+客户端代码+证书生成) |
一、背景说明
1.1 面临问题
最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击。 《信息安全工程》中接触过双向认证,但有两个问题。 第一个是当时最终的课程设计客户端是浏览器,服务端是tomcat双向认证只需要对两者进行配置并不需要自己真的实现代码。 第二个是虽然课程也有接近双向认证的实现代码,但当时是Java+JCE环境现在要用C+++OpenSSL环境,总体意思确实还是差不多但具体函数和参数差别还是不少。 所以眼下有的是:证书生成的思想+双向认证实现的思想。对读者而言,即要假定已对证书、SSL/TSL、socket编程等几个概念有基本的了解,本文不做详细介绍。 基于此本文要解决的问题是:openssl具体如何生成证书+openssl如何实现双向认证。 1.2 解决办法 1.2.1 openssl具体生成证书解决办法 参考https://blog.csdn.net/gengxiaoming7/article/details/78505107再加其他一些文章总结而成 1.2.2 openssl实现双向认证解决办法 使用https://blog.csdn.net/sardden/article/details/42705897代码实SSL,在其基础上实现双向认证。 双向认证的关键点在以下几个函数(服务端和客户端都一样),其他就不细说参看代码注释: 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 服务端代码 ![]() ![]() 2.3 客户端代码 ![]() ![]() 2.4 证书生成 注意三点 第一点,注意将其中的私钥加密密码(-passout参数)修改成自己的密码;下边都是以带-passout参数生成私钥,如果使用-nodes参数,则最后一步“将加密的RSA密钥转成未加密的RSA密钥”不需要执行。 第二点,证书和密钥给出了直接一步生成和分步生成两种形式,两种形式是等价的,这里使用直接生成形式(分步生成形式被注释) 第三点,注意将其中的证书信息改成自己的组织信息的。其中证数各参数含义如下: C-----国家(Country Name) ST----省份(State or Province Name) L----城市(Locality Name) O----公司(Organization Name) OU----部门(Organizational Unit Name) CN----产品名(Common Name) emailAddress----邮箱(Email Address) # CA证书及密钥生成方法一----直接生成CA密钥及其自签名证书 # 如果想以后读取私钥文件ca_rsa_private.pem时不需要输入密码,亦即不对私钥进行加密存储,那么将-passout pass:123456替换成-nodes openssl req -newkey rsa:2048 -passout pass:123456 -keyout ca_rsa_private.pem -x509 -days 365 -out ca.crt -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CA/[email protected]" # CA证书及密钥生成方法二----分步生成CA密钥及其自签名证书: # openssl genrsa -aes256 -passout pass:123456 -out ca_rsa_private.pem 2048 # openssl req -new -x509 -days 365 -key ca_rsa_private.pem -passin pass:123456 -out ca.crt -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CA/[email protected]" # 服务器证书及密钥生成方法一----直接生成服务器密钥及待签名证书 # 如果想以后读取私钥文件server_rsa_private.pem时不需要输入密码,亦即不对私钥进行加密存储,那么将-passout pass:server替换成-nodes openssl req -newkey rsa:2048 -passout pass:server -keyout server_rsa_private.pem -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=SERVER/[email protected]" # 服务器证书及密钥生成方法二----分步生成服务器密钥及待签名证书 # openssl genrsa -aes256 -passout pass:server -out server_rsa_private.pem 2048 # openssl req -new -key server_rsa_private.pem -passin pass:server -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=SERVER/[email protected]" # 使用CA证书及密钥对服务器证书进行签名: openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca_rsa_private.pem -passin pass:123456 -CAcreateserial -out server.crt # 将加密的RSA密钥转成未加密的RSA密钥,避免每次读取都要求输入解密密码 # 密码就是生成私钥文件时设置的passout、读取私钥文件时要输入的passin,比如这里要输入“server” openssl rsa -in server_rsa_private.pem -out server_rsa_private.pem.unsecure # 客户端证书及密钥生成方法一----直接生成客户端密钥及待签名证书 # 如果想以后读取私钥文件client_rsa_private.pem时不需要输入密码,亦即不对私钥进行加密存储,那么将-passout pass:client替换成-nodes openssl req -newkey rsa:2048 -passout pass:client -keyout client_rsa_private.pem -out client.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CLIENT/[email protected]" # 客户端证书及密钥生成方法二----分步生成客户端密钥及待签名证书: # openssl genrsa -aes256 -passout pass:client -out client_rsa_private.pem 2048 # openssl req -new -key client_rsa_private.pem -passin pass:client -out client.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CLIENT/[email protected]" # 使用CA证书及密钥对客户端证书进行签名: openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca_rsa_private.pem -passin pass:123456 -CAcreateserial -out client.crt # 将加密的RSA密钥转成未加密的RSA密钥,避免每次读取都要求输入解密密码 # 密码就是生成私钥文件时设置的passout、读取私钥文件时要输入的passin,比如这里要输入“client” openssl rsa -in client_rsa_private.pem -out client_rsa_private.pem.unsecure2.5 开发环境配置 操作系统----kali-roaling。为了使用现在虚拟机而已,使用ubuntu、centos等等应该都是没差别的。 IDE----eclipse。直接在终端中编译不通过没深究,放eclipse编译没问题就直接使用eclipse。 2.5.1 在同一活动目录下建了两个project myclient1----建src文件夹放客户端代码 myserver1----建src文件夹放服务端代码 (其他目录要么是自动生成的,要么是编译后自动生成的,不用管;如果项目有报错试试多重启几次eclipse甚操作系统) 2.5.2 指定ssl和crypto 在项目文件夹上右键----Properties----指定ssl库和crypto库目录不然编译找不到ssl。两个project都要配置 2.5.3 编译 使用Ctrl+B快捷键进行编译,eclipse会编译所有project 2.5.4 证书复制 将前边生成的ca证书(ca.crt)、客户端证书(client.crt)、客户端未加密私钥文件()复制到myclient1项目的Debug目录下 将前边生成的ca证书、服务端证书、服务端端未加密私钥文件复制到myclient1项目的Debug目录下 2.5.5 运行程序 先运行服务端后运行客户端 ./myserver1 7838 1 server.crt server_rsa_private.pem.unsecure ./myclient1 127.0.0.1 7838 client.crt client_rsa_private.pem.unsecure运行结果如下,服务端: 客户端:
参考: https://blog.csdn.net/gengxiaoming7/article/details/78505107 https://blog.csdn.net/sardden/article/details/42705897 https://blog.csdn.net/Junkie0901/article/details/40402003 https://www.openssl.org/docs/man1.1.1/man3/ https://blog.csdn.net/wangsifu2009/article/details/7569566 https://www.cnblogs.com/zhouxihi/p/6001866.html |
CopyRight 2018-2019 实验室设备网 版权所有 |