带客户端证书的openssl ssl_accept问题

时间:2019-02-11 19:13:58

标签: ssl openssl

我有一个可以正常工作的c ++系统,在该系统中,我都使用了C语言的openssl库在客户端和服务器之间建立了ssl连接。

系统通过要求客户端证书作为连接的一部分来使用客户端身份验证。客户端证书是自签名的,它由服务器上的ca.pem在对自签名证书进行签名的服务器上进行验证。

服务器证书是由digikey颁发的。

我的理解是,客户端对服务器证书的验证(它在客户端上进行验证)与客户端[自签名]证书的服务器验证(在我提供的ca上在服务器上进行验证)之间没有关系。 .pem。

但是,当我将服务器证书更改为letencrypt签名的证书时,却遇到了问题。

我在接受连接时遇到此错误:

错误:14094418:SSL例程:ssl3_read_bytes:tlsv1警报未知ca:s3_pkt.c:1487:SSL警报编号48

未知的CA。啊,但是哪个?

我尝试删除客户端证书要求作为测试,并且能够建立连接,因此显然,客户端很乐意验证新的letencrypt服务器证书。

因此,服务器似乎无法验证客户端证书。但这是没有意义的,因为这一切都没有改变,因此客户端证书是相同的,并且服务器的ca.pem用来验证该证书是相同的。

为什么更改服务器证书会影响客户端证书的验证方式?

服务器是否正在向客户端发出请求,以请求包含主题的“ letencrypt”之类的客户端证书?我对客户端证书请求的工作方式有些困惑。

是否有办法从ssl错误中获取更多信息,并从库中获取更详细的日志记录?

我已经在命令行上运行openssl verify命令来手动验证客户端的ca.pem可信根列表可以验证letencrypt证书,并且服务器的ca.pem可以验证客户端证书(因为它始终)

所以...。我在做什么错了?

有什么想法吗?建议?可以尝试的东西吗?

谢谢。

更新:

所以我不得不重建openssl,但是我在服务器端进行了跟踪,得到了:

Received Record
Header:
  Version = TLS 1.2 (0x303)
  Content Type = Alert (21)
  Length = 2
    Level=fatal(2), description=unknown CA(48)

这使我现在相信问题出在客户端。 前一条消息是从服务器发送的:

Sent Record
Header:
  Version = TLS 1.2 (0x303)
  Content Type = Handshake (22)
  Length = 46
    CertificateRequest, Length=38
      certificate_types (len=3)
        rsa_sign (1)
        dss_sign (2)
        ecdsa_sign (64)
      signature_algorithms (len=30)
        sha512+rsa (6+1)
        sha512+dsa (6+2)
        sha512+ecdsa (6+3)
        sha384+rsa (5+1)
        sha384+dsa (5+2)
        sha384+ecdsa (5+3)
        sha256+rsa (4+1)
        sha256+dsa (4+2)
        sha256+ecdsa (4+3)
        sha224+rsa (3+1)
        sha224+dsa (3+2)
        sha224+ecdsa (3+3)
        sha1+rsa (2+1)
        sha1+dsa (2+2)
        sha1+ecdsa (2+3)
      certificate_authorities (len=0)

因此,这意味着服务器不提供有关与客户机证书匹配的内容的建议,而客户机不喜欢该建议吗?不确定这是否有帮助,除了让我指出可能是客户端出现问题的事实。

1 个答案:

答案 0 :(得分:0)

因此,对于所有关注者,我都知道了。

小费是来自跟踪

Received Record
Header:
  Version = TLS 1.2 (0x303)
  Content Type = Alert (21)
  Length = 2
    Level=fatal(2), description=unknown CA(48)

表明服务器实际上在抱怨客户端问题(客户端没有,叹气)

因此,一旦我意识到它抱怨客户端(服务器)上的服务器证书,我就意识到我没有在客户端上可用于验证新服务器证书的所有根证书和中间件。我添加了它们,瞧,ssl连接。 ssl错误可能会引起误解。

没有解释为什么我的无客户端连接有效的原因...也许我以某种方式弄乱了该测试。