带有自行生成的CA,证书和客户端/服务器的“未知CA”

时间:2018-11-01 15:24:50

标签: c++ ssl openssl verification peer

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

这是在SSL_connect / SSL_accept阶段从服务器收到的错误:

RecursionError: maximum recursion depth exceeded

我正在Windows 10下使用OpenSSL 1.1.1运行。我正在使用以下批处理文件来创建它们。出于明显的原因,我手动输入了ca私钥密码。

15620:error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:ssl\record\rec_layer_s3.c:1528:SSL alert number 48

这里的目的是创建一个自签名的CA,然后直接对客户端和服务器密钥进行签名。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

$ openssl req -x509 -new ... -addext basicConstraints=critical,CA:TRUE 

这实际上创建了一个具有2个基本禁忌素CA:TRUE扩展名的证书:

$ openssl x509 -in ca.cert.pem -text
    X509v3 extensions:
        ...
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Basic Constraints: critical
            CA:TRUE

尝试使用CA来验证服务器证书将不起作用:

$ openssl verify -CAfile ca.cert.pem server.cert.pem 
C = XX, ST = XX, L = XX, O = XX, CN = CA
error 24 at 1 depth lookup: invalid CA certificate
error server.cert.pem: verification failed

鉴于此简单检查不起作用,客户端也将无法验证服务器证书,从而产生unknown ca警报:

...:tlsv1 alert unknown ca:...

跳过-addext时,它将创建已记录的自签名证书,该证书已经具有CA:TRUE

$ openssl req -x509 -new ... 
...
$ openssl x509 -in ca.cert.pem -text
    X509v3 extensions:
        ...
        X509v3 Basic Constraints: critical
            CA:TRUE

并使用它来验证服务器证书是否有效:

$ openssl verify -CAfile ca.cert.pem server.cert.pem 
server.cert.pem: OK

此证书也应该由您的客户端成功验证,因此不会再产生unknown ca

答案 1 :(得分:0)

亲自回答此问题,以便它可以帮助可能会来到这里的其他任何人寻找该问题的解决方案。答案是在另一个SO问题中找到的,但是在这里值得重复:CA的公用名不能与客户端和服务器证书的公用名相同。

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

openssl req -x509-新-nodes -key ca.key.pem -sha256 -days 365 -out ca.cert.pem -subj / C = US / ST = CA / L = Somewhere / O = Someone / CN = FoobarCA

解决了这个问题。