Openssl s_client 仅在提供 -servername 选项时显示 CONNECT_CR_SRVR_HELLO

Openssl s_client 仅在提供 -servername 选项时显示 CONNECT_CR_SRVR_HELLO

我有一个启用 HTTPS 的 centOS7 服务器,其中安装了 GitLab/nginx,并在付费 DNS 上注册了 A 记录,证书由 Let's Encrypt 验证。(我将在这里使用 gitlab.example.com)。该域名已测试至少可以通过 ssh 和纯 HTTP 访问。

使用 HTTPS,我可以使用直接 IP 连接到服务器,例如https://xxxx。虽然会弹出不安全的证书错误(由于域名不匹配),但如果我选择继续,尽管出现警告,gitlab 页面就会正确显示。

但是如果我尝试使用https://gitlab.example.com错误ERR_SSL_PROTOCOL_ERROR将会弹出。

我尝试使用 openssl s_client 来调试该问题并得到以下结果

openssl s_client -connect gitlab.example.com:443 -servername gitlab.example.com

CONNECTED(00000003)
4658671212:error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.120.1/libressl-2.8/ssl/ssl_pkt.c:386:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Start Time: 1641487269
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---


有趣的是,如果我不包含该-servername选项,则不会出现错误,并且将正确获取证书。使用端口 443 的直接 IP 也可以正确获取证书。

我尝试在 Google 上搜索该错误几个小时,但没有成功。

我也尝试使用 curl 访问并得到同样的错误(似乎这些信息不如 openssl s_client 结果有用,除了可能域名正确映射到 IP 地址的信息)

curl --insecure -Lv https://gitlab.example.com
*   Trying x.x.x.x...
* TCP_NODELAY set
* Connected to gitlab.example.com (x.x.x.x) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
* Closing connection 0
curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number

Gitlab 的日志中没有显示任何内容,我认为请求甚至没有超出 SSL 握手阶段。

我被困在这一点上了。任何关于如何处理这个问题的帮助或提示都将不胜感激。

相关内容