openssl客户端如何信任服务器的自签名证书

时间:2019-09-09 10:59:27

标签: c++ c openssl handshake

我正在建立一个用于处理tls连接(客户端和服务器)的c ++类。 除tls握手外,它均有效: 我已经生成了我自己签名的根证书,并用它签名了rsa服务器密钥。 但是我收到一个未知的CA错误客户端错误

用于生成自签名CA(CA文件和CA.pem文件)的脚本

openssl req -x509 -sha256 -days 3650 -newkey rsa:4096 -keyout CA -out CA.pem

用于生成和签名服务器密钥(密钥文件和key.pem文件)的脚本

read -p "key and cert name :" x

openssl genrsa -out $(echo $x) 2048
openssl req -new -key $(echo $x) -out $(echo $x).csr
openssl x509 -req -in $(echo $x).csr -CA CA/CA.pem -CAkey CA/CA -CAcreateserial -out $(echo $x).pem -days 3650 -sha256

然后我使用SSL_CTX_use_certificate_file将CA.pem传递给客户端,使用SSL_CTX_use_PrivateKey_file将密钥传递给服务器,并使用SSL_CTX_use_certificate_file传递key.pem

客户端处于模式SSL_VERIFY_PEER,服务器处于模式SSL_VERIFY_NONE,因此只有客户端检查服务器证书。

由于服务器密钥是使用CA和客户端信任CA.pem签名的,因此它应该可以工作,但是当握手时,我在Wireshark中得到了这条消息(从客户端到服务器的消息): Alert level Fatal, Description : Unknown CA

1 个答案:

答案 0 :(得分:0)

如果您阅读OpenSSL的文档,则客户端SSL_CTX_use_certificate_file将安装客户端证书。它没有指定可用于验证证书的受信任CA的列表。

为此,您要在客户端使用SSL_CTX_load_verify_locations

  

SSL_CTX_load_verify_locations()指定ctx的位置,位于   哪些CA证书用于验证。