OpenSSL 命令检查服务器是否提供证书

我正在尝试运行一个 openssl 命令来缩小从我们的系统发送出站消息时可能出现的 SSL 问题。

我在另一个主题中找到了这个命令: 使用 openssl 从服务器获取证书

openssl s_client -connect ip:port -prexit

这个输出的结果是

CONNECTED(00000003)
15841:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 121 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

这是否意味着服务器不提供任何证书?我在另一个 ip: port 上尝试了其他系统,它们成功地提供了一个证书。

使用-prexit 进行相互身份验证是否会影响此命令?

——更新——

我再次运行命令

openssl s_client -connect ip:port -prexit

现在我得到了这个回答

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 121 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

我在命令中添加了 -ssl3

openssl s_client -connect ip:port -prexit -ssl3

回应:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol  : SSLv3
Cipher    : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg   : None
Krb5 Principal: None
Start Time: 1403907236
Timeout   : 7200 (sec)
Verify return code: 0 (ok)
---

我也在努力

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol  : TLSv1
Cipher    : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg   : None
Krb5 Principal: None
Start Time: 1403907267
Timeout   : 7200 (sec)
Verify return code: 0 (ok)
---
172150 次浏览
15841:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
...
SSL handshake has read 0 bytes and written 121 bytes

这是握手失败。另一端关闭连接而不发送任何数据(“读取0字节”)。可能的情况是,对方根本不使用 SSL。但是我在破损的 SSL 实现上看到过类似的错误,它们不理解更新的 SSL 版本。如果通过将 -ssl3添加到 s _ client 的命令行来获得 SSL 连接,请尝试一下。

在我的例子中,ssl 证书没有为所有站点配置(只是为非 www 版本重定向到的 www 版本配置)。我用的是 Laravel 锻炉和 Nginx 样板配置

我的 nginx 站点有以下配置:

/etc/nginx/sites- 可用/timer.at

server {
listen [::]:80;
listen 80;
server_name timtimer.at www.timtimer.at;


include h5bp/directive-only/ssl.conf;


# and redirect to the https host (declared below)
# avoiding http://www -> https://www -> https:// chain.
return 301 https://www.timtimer.at$request_uri;
}


server {
listen [::]:443 ssl spdy;
listen 443 ssl spdy;


# listen on the wrong host
server_name timtimer.at;


### ERROR IS HERE ###
# You eighter have to include the .crt and .key here also (like below)
# or include it in the below included ssl.conf like suggested by H5BP


include h5bp/directive-only/ssl.conf;


# and redirect to the www host (declared below)
return 301 https://www.timtimer.at$request_uri;
}


server {
listen [::]:443 ssl spdy;
listen 443 ssl spdy;


server_name www.timtimer.at;


include h5bp/directive-only/ssl.conf;


# Path for static files
root /home/forge/default/public;


# FORGE SSL (DO NOT REMOVE!)
ssl_certificate /etc/nginx/ssl/default/2658/server.crt;
ssl_certificate_key /etc/nginx/ssl/default/2658/server.key;


# ...


# Include the basic h5bp config set
include h5bp/basic.conf;
}

因此,在移动(剪切和粘贴)以下部分到 /etc/nginx/h5bp/direct-only/ssl.conf文件的一切工作正常:

# FORGE SSL (DO NOT REMOVE!)
ssl_certificate /etc/nginx/ssl/default/2658/server.crt;
ssl_certificate_key /etc/nginx/ssl/default/2658/server.key;

因此,如果您只是直接调用 www 版本,那么仅仅为 www 版本指定密钥是不够的!

我今天正在调试一个 SSL 问题,结果导致了同样的 write:errno=104错误。最后我发现这种行为的原因是服务器 需要 SNI(servername TLS 扩展)正常工作。为 openssl 提供 -servername选项使其成功连接:

openssl s_client -connect domain.tld:443 -servername domain.tld

希望这个能帮上忙。

当我们的代理用他们的自签名证书重写 HTTPS 连接时,我也试图登陆 github.com:

没有可用的对等证书 未发送客户端证书 CA 名称

在我的作品中还有:

协议: TLSv1.3

我添加了 -tls1_2,它工作得很好,现在我可以看到它在传出请求中使用的是哪个 CA。例如:
openssl s_client -connect github.com:443 -tls1_2

我也有过类似的问题。根本原因是发送 IP 不在接收服务器上白名单 IP 的范围内。所有的通讯请求都被接收站终止了。

我遇到了 write:errno=104试图用 openssl s _ client 测试连接到启用 SSL 的 RabbitMQ 代理端口。

问题很简单,用户 RabbitMQ 正在运行,因为它对证书文件没有读权限。RabbitMQ 中几乎没有有用的日志记录。

我也遇到过同样的问题。但是使用 IP 很好; 我在/etc/hosts 中指定 ip host

使用 IP 工作正常,但主机不能