我正在编写一个自定义的客户端和服务器,希望它们可以在公共互联网上安全通信,因此我想使用OpenSSL,并让双方进行对等验证,以确保我的客户端没有被中间人误导,同样地,未经授权的客户端也无法连接到服务器。
这是在 SSL_connect / SSL_accept 阶段从服务器收到的错误信息:
这是在 SSL_connect / SSL_accept 阶段从服务器收到的错误信息:
15620:error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:ssl\record\rec_layer_s3.c:1528:SSL alert number 48
我正在运行Windows 10操作系统,使用OpenSSL 1.1.1。以下是我用来创建它们的批处理文件。由于很明显,我手动输入CA私钥密码。
openssl genrsa -out -des3 ca.key.pem 2048
openssl genrsa -out server.key.pem 2048
openssl genrsa -out client.key.pem 2048
openssl req -x509 -new -nodes -key ca.key.pem -sha256 -days 365 -out ca.cert.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar
openssl req -new -sha256 -key server.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out server.csr
openssl x509 -req -in server.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out server.cert.pem -days 365 -sha256
openssl req -new -sha256 -key client.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out client.csr
openssl x509 -req -in client.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out client.cert.pem -days 365 -sha256
本意在于创建自签名的CA,然后让它直接签署客户端和服务器密钥。
ca.key.pem将存储在安全的地方:在加密的veracrypt卷中。
客户端和服务器都会使用以下调用来启用对等验证:
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);
我相当确定这是一个证书问题,因为如果我删除那行代码,错误就会消失。