Openssl Tcp 加密

 

在调试的过程中生成证书和密钥是比较关键的,系统自带的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,均会认证失败

 

 

无论是单向认证还是双向认证,服务端的代码和处理流程大致一样

服务端:

  1. 初始化ssl相关信息,lib_init/all_algorith/err_thing/ctx_new创建ctx用于对证书和密钥进行验证.
  2. 载入证书SSL_CTX_use_certificate_file和密钥SSL_CTX_use_PrivateKey_file,检查密钥正确性SSL_CTX_check_private_key。
  3. 创建socket正常流程,accept等待连接newfd
  4. 基于ctx 产生一个新的SSL
  5. 将连接的socket与SSL关联 SSL_set_fd(ssl,newfd);
  6. 建立SSL_accept连接。
  7. 连接成功,SSL_write/SSL_read。

8,异常结束处理:SSL_shutdown  SSL_free  close(newfd) SSL_CTX_free();  

 

单向/双向 认证客户端:

  1. 初始化ssl相关信息,lib_init/all_algorith/err_thing/ctx_new创建ctx用于对证书和密钥进行验证.
  2. 创建CTX;
  3. 载入证书SSL_CTX_use_certificate_file和密钥SSL_CTX_use_PrivateKey_file,检查密钥正确性SSL_CTX_check_private_key(双向认证需要,单向不需要)。
  4. 正常socket流程 sockfd = socket();
  5. 创建ssl = SSL_new(ctx) 与sockfd关联SSL_set_fd(ssl,sockfd);
  6. 连接服务器SSL_connect()
  7. 在循环里面进行读写SSL_read/SSL_write

 

相关接口见源码:https://download.csdn.net/download/u014220105/10832105

猜你喜欢

转载自blog.csdn.net/u014220105/article/details/84851031