如何在使用openssl s_client连接时忽略证书验证?

13

我正在尝试使用以下命令连接服务器:

openssl s_client -connect xx.xx.xx.xx:443

错误:

CONNECTED(00000005)
depth=0 L = XXXXXXX
verify error:num=20:**unable to get local issuer certificate**
verify return:1
depth=0 L = XXXXXXXX
verify error:num=21:**unable to verify the first certificate
verify return:1**
---
Certificate chain
 0 s:/L=XXXX
   i:/C=XXXX
---
Server certificate
-----BEGIN CERTIFICATE-----
....
...
..
<removed cert>
..
...
....
-----END CERTIFICATE-----
subject=xxxxxxx CN=*xxx.xom
issuer=XXXX CA
---
No client certificate CA names sent
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2281 bytes and written 326 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 52A27BC97001D52A7DA4A73FBA87C7DD2902A0C55B0AE9FAA87A3A8DBA94A7CE
    Session-ID-ctx:
    Master-Key: ECD435DCDD59B2BAD50A1BF8BAEA39E68058524A082DC219CEE290DB7A80A37AE4E763DF7FA
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 5d b4 5c fe ca 2d 54 2e-31 49 74 a6 18 a7 3a f5   ].\..-T.1It...:.
    XXXX
    0080 - ab 5c 0a bc 45 9c 10 01-9f 3b ce 6e ee 1a a6 99   .\..E....;.n....
    0090 - 04 81 ea e0 be a5 91 a2-18 09 d4 b8 90 b7 c7 50   ...............P
    00a0 - f7 7d 73 e5 b1 3d 0d 58-20 07 78 7b 57 c4 34 58   .}s..=.X .x{W.4X

    Start Time: 1566410644
    Timeout   : 7200 (sec)
    **Verify return code: 21 (unable to verify the first certificate)**
---

看起来命令正在尝试验证证书,而我不想要这个。我该如何跳过验证呢? 是否有类似于curl -k 标志的东西?


它是否终止?据我所知,s_client命令只是打印一些信息,然后继续使用连接。 - bartonjs
1个回答

8
OpenSSL的`s_client`在错误证书上永远不会终止,除非你使用`-verify_return_error`参数要求它这样做(正如@bartonjs在评论中已经建议的那样)。
您可以在手册页`man 1 s_client`或在线上了解更多信息。查找`-verify`参数或稍后在NOTES中:

如果存在验证服务器证书的问题,则可以使用`-showcerts`选项显示服务器发送的所有证书。

`s_client`实用程序是一个测试工具,旨在在任何证书验证错误之后继续握手。因此,它将接受对等方发送的任何证书链(可信任或不可信任)。非测试应用程序不应该这样做,因为这使它们容易受到中间人攻击。可以通过`-verify_return_error`选项来更改此行为:然后返回任何验证错误并中止握手。

如果您看到的结果是最后一个“错误”,那么很可能是服务器上的其他内容在那一刻终止了连接。您应该在Web服务器日志中查看原因。

我相信问题提交者甚至不想在输出中看到:“验证返回代码:21(无法验证第一个证书)”。 - azbarcea
这个答案必须要更新,因为在脚本中使用openssl时会进行验证。 - Steve Owens
@SteveOwens 您可以添加一个示例吗?最新的 s_client 文档仍然清楚地表明它会在出现错误后继续握手。我相信答案仍然有效。顺便问一下,您是在谈论 s_client 还是 openssl 总体?因为这个答案只适用于 s_client - Kepi
对我来说,仅添加“-verify_return_error”无法在验证错误时终止连接。我不得不添加额外的“-verify 3”才能做到这一点。 - Alexey Andronov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接