在调试的过程中生成证书和密钥是比较关键的,系统自带的openssl生成双向的时候可能会找不到部分文件,建议下载安装包自行安装
单向认证:在服务端部署ssl证书
双向认证:客户端也需要身份认证
单向认证及相关证书和密钥生成记录:
在服务器端生成需要的key 和cert
openssl genrsa -out serkey.pem 2048
openssl req -new -x509 -key serkey.pem -out cacert.pem -days 1095
双向认证及相关证书和密钥生成记录:
加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥。
解密:通过解密算法和私钥对密文进行解密,得到明文。解密过程需要用到解密算法和私钥。注意,由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。
/****************************************************************************/
#生成根证书私钥(pem文件)
openssl genrsa -out cakey.pem 2048
#生成根证书签发申请文件(csr文件)
openssl req -new -key cakey.pem -out ca.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myCA"
#自签发根证书(cer文件)
openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey cakey.pem -in ca.csr -out cacert.pem
cacert. pem (公有密钥) privkey.pem(私有密钥)
/****************************************************************************/
#生成服务端私钥
openssl genrsa -out key.pem 2048
#生成证书请求文件
openssl req -new -key key.pem -out server.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myServer"
#使用根证书签发服务端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ../CA/cacert.pem -CAkey ../CA/cakey.pem -CAserial ca.srl -CAcreateserial -in server.csr -out servercert.pem
#使用CA证书验证server端证书
openssl verify -CAfile ../CA/cacert.pem cert.pem
/****************************************************************************/
#生成客户端私钥
openssl genrsa -out key.pem 2048
#生成证书请求文件
openssl req -new -key key.pem -out client.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myClient"
#使用根证书签发客户端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ./cacert.pem -CAkey ./cakey.pem -CAserial . /ca.srl -in client.csr -out clientcert.pem
#使用CA证书验证客户端证书
openssl verify -CAfile ../CA/cacert.pem cert.pem
/*************************************************************************/
无论是修改那一个的CA,均会认证失败
无论是单向认证还是双向认证,服务端的代码和处理流程大致一样
服务端:
- 初始化ssl相关信息,lib_init/all_algorith/err_thing/ctx_new创建ctx用于对证书和密钥进行验证.
- 载入证书SSL_CTX_use_certificate_file和密钥SSL_CTX_use_PrivateKey_file,检查密钥正确性SSL_CTX_check_private_key。
- 创建socket正常流程,accept等待连接newfd
- 基于ctx 产生一个新的SSL
- 将连接的socket与SSL关联 SSL_set_fd(ssl,newfd);
- 建立SSL_accept连接。
- 连接成功,SSL_write/SSL_read。
8,异常结束处理:SSL_shutdown SSL_free close(newfd) SSL_CTX_free();
单向/双向 认证客户端:
- 初始化ssl相关信息,lib_init/all_algorith/err_thing/ctx_new创建ctx用于对证书和密钥进行验证.
- 创建CTX;
- 载入证书SSL_CTX_use_certificate_file和密钥SSL_CTX_use_PrivateKey_file,检查密钥正确性SSL_CTX_check_private_key(双向认证需要,单向不需要)。
- 正常socket流程 sockfd = socket();
- 创建ssl = SSL_new(ctx) 与sockfd关联SSL_set_fd(ssl,sockfd);
- 连接服务器SSL_connect()
- 在循环里面进行读写SSL_read/SSL_write
相关接口见源码:https://download.csdn.net/download/u014220105/10832105