ssl - OpenSSL 连接错误 SSL23_GET_SERVER_HELLO,但浏览器和 curl 有效

标签 ssl openssl

我正在处理一个问题,由于 openssl 无法完成握手,python 无法通过 ssl 连接到特定服务器。 Curl 和我的浏览器工作。我尝试了几个不同的 openssl 版本和 solutions , 但似乎无法连接。

以下是我在以下两个平台上尝试过的内容。在 OpenSSL 1.0.1e 上打印的输出略有不同,但仍然是相同的错误。

Mac OSX Yosemite - OpenSSL 0.9.8zg 14 July 2015
Debian GNU/Linux 7 (wheezy) - OpenSSL 1.0.1e 11 Feb 2013

不指定是哪个版本

openssl s_client -connect www.uk-recruitment.net:443
openssl s_client -connect www.uk-recruitment.net:443 -cipher 'DEFAULT:!ECDH'
openssl s_client -connect www.uk-recruitment.net:443 -CAfile cacert.pem
openssl s_client -connect www.uk-recruitment.net:443 -CAfile cacert.pem -cipher 'DEFAULT:!ECDH'
openssl s_client -connect www.uk-recruitment.net:443 -CAfile cacert.pem -cipher 'DEFAULT:!ECDH' -servername uk-recruitment.net

但我总是得到相同的结果

CONNECTED(00000003)
66716:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error:/SourceCache/OpenSSL098/OpenSSL098-52.40.1/src/ssl/s23_clnt.c:593: 

如果我添加具有所有相同选项的 -tls1-tls1_1-tls1_2,我会得到一个稍微不同的错误:

openssl s_client -connect www.uk-recruitment.net:443 -tls1
CONNECTED(00000003)
66750:error:14094438:SSL routines:SSL3_READ_BYTES:tlsv1 alert internal error:/SourceCache/OpenSSL098/OpenSSL098-52.40.1/src/ssl/s3_pkt.c:1145:SSL alert number 80
66750:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:/SourceCache/OpenSSL098/OpenSSL098-52.40.1/src/ssl/s3_pkt.c:566:

最佳答案

站点需要 Server Name Indication (SNI)不使用 SNI 的 SSL 握手将导致失败:

$ openssl s_client -connect www.uk-recruitment.net:443
CONNECTED(00000003)
139999237719712:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error:s23_clnt.c:770:

使用 SNI 看起来好多了:

$ openssl s_client -connect www.uk-recruitment.net:443 -servername www.uk-recruitment.net
CONNECTED(00000003)
...
   Cipher    : ECDHE-ECDSA-AES128-GCM-SHA256

-servername 选项可能不适用于 OpenSSL 0.9.8,但它应该适用于 OpenSSL 1.0.1。

关于ssl - OpenSSL 连接错误 SSL23_GET_SERVER_HELLO,但浏览器和 curl 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34187934/

相关文章:

node.js - HTTPS 重定向仅在页面重新加载时有效

ssl - 如何使用 MakeCert.exe 与现有 CA 创建证书

php - 从命令行脚本填充密码

php - 将我的加密库从 Mcrypt 升级到 OpenSSL

ssl - 使用 openssl 将 .pem 文件转换为 .crt

ssl - 无法使用 SSL 从 Windows 应用程序连接到 IdentityServer4

python - 尝试使用 slackclient 和 python 2.7 时获取 CERTIFICATE_VERIFY_FAILED

linux - RHEL 中的 openssl - 在不使用 openssl.cnf 的情况下使用 root 签署客户端证书?

python - 验证用 python 签名的文件的问题

reference - 关于在 pthreads 中使用 OpenSSL 的教程