OpenSSL实现单向认证
OpenSSL实现单向认证
OpenSSL的安装
OpenSSL采用C语言作为开发语言,这使得它具有优秀的跨平台性能,OpenSSL支持:
- Linux
- Windows
- Mac
等常见操作系统
OpenSSL github地址
win和mac需要单独去下OpenSSL客户端,网上也有很多教程,可以自己去找找看
Linux系统自带OpenSSL库,一般不需要下载安装,我会使用KALI Linux进行本次实验
查看下openssl的版本:
简单通信过程
下面以最常见的单向认证为例,简述一下通信过程:
客户端向服务器发送请求
服务器将包含公钥的证书通过明文发送给客户端
客户端通过根证书验证服务器证书是否有效
如果有效,客户端生成一个随机密钥,也叫对称加密密钥,使用服务器的公钥进行加密传输
服务器通过私钥解密客户端传输的对称加密密钥
这时只有服务器和客户端知道这个对称加密密钥,双方可以进行对称加密传输
颁发证书
通过vim /usr/lib/ssl/openssl.cnf修改配置文件,这里修改了默认文件夹、私钥名、证书名。
在默认文件夹创建所需的目录和文件
1 | mkdir -pv ssl |
指明证书开始的编号
1 | echo 01 >> serial |
生成根证书私钥
1 | openssl genrsa -out private/ca.key 2048 |
genrsa: 产生rsa密钥命令
-out: 输出路径
这里的参数2048,指的是密钥的长度位数,默认长度为512位,密钥越长,安全性越高,但是生成速度也越慢。
生成自签名证书
1 | openssl req -new -x509 -key private/ca.key -out ca.crt -days 365 |
-new:表示生成一个新证书签署请求
-x509:专用于CA生成自签证书,如果不是自签证书则不需要此项
-key:用到的私钥文件
-out:证书的保存路径
-days:证书的有效期限,单位是day(天),默认是openssl.cnf的default_days
生成服务器密钥
1 | openssl genrsa -out private/server.key 2048 |
生成请求文件,图中划线的这几项需和根证书一致,后几项最好也保持一致。
1 | openssl req -new -key private/server.key -out csr/server.csr |
颁发证书
1 | openssl ca -in csr/server.csr -out certs/server.crt |
验证
下面通过一个例程来模拟单向SSL认证,服务器需要准备好刚刚签发的服务器证书,和一定要好好保管的密钥,客户端只需准备好根证书就行,用来验证服务器的证书。
服务端代码
1 | import socket |
客户端代码
1 | import socket |
结果
服务端
客户端