c++ - "unknown ca"带有自生成的 CA、证书和客户端/服务器

标签 c++ ssl openssl verification peer

我正在编写一个自定义客户端和服务器,我想通过公共(public) Internet 安全地进行通信,因此我想使用 OpenSSL 并让两端进行对等验证以确保我的客户端不会被 MITM 误导,同样,未经授权的客户端无法连接到服务器。

这是在 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,然后让其直接签署客户端和服务器 key 。

ca.key.pem 将存储在一个安全的地方:在一个加密的 veracrypt 卷上。

客户端和服务器都使用以下调用来启用对等验证:

    SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);

我相当确定这是一个证书问题,因为如果我删除该行,错误就会消失。

最佳答案

我自己回答这个问题,这样它可以帮助任何可能来到这里寻找解决这个问题的人。答案在另一个 SO 问题中找到,但值得在这里重复:CA 的通用名称不能与客户端和服务器证书的通用名称相同。

因此将批处理文件的第四行更改为:

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 =FoobarCA

解决了问题。

关于c++ - "unknown ca"带有自生成的 CA、证书和客户端/服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53104296/

相关文章:

android - 在运行时为 Android 4.0 添加 TLSv1.2 支持

ruby - 在设置 RVM 环境以使用 Gist 和 OpenSSL 时遇到问题

c++ - ROOT 中的实时更新

iis - Windows Server 2012 R2 和 IIS 是否受 Heartbleed 漏洞影响?

c++ - 断言失败 - 在 Unity-Xbox 上崩溃

amazon-web-services - CloudFront 分发和 AWS 颁发的证书给出 SSL_ERROR_NO_CYPHER_OVERLAP

linux - 如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ/WANT_WRITE

linux - 如何删除openssl库依赖

c++ - 更改 DEF 文件中的函数签名

c++ - 未定义对 ‘_imp__InitBizLib’ 的引用