GET请求ssl_choose_client_version:不支持的协议。

7

我在处理一个应用程序向远程服务器发出 GET 请求的升级问题时遇到了一些问题。

首先,这是旧版本所完成的 GET 请求的功能性示例,并且按照预期工作。

curl -k -vvvvv https://mywebsite.com/mywonderfulwebsite/mypage.php

*   Trying 192.168.0.70...
* TCP_NODELAY set
* Connected to mywebsite.com (192.168.0.70) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.0 (IN), TLS handshake, Certificate (11):
* TLSv1.0 (IN), TLS handshake, Server finished (14):
* TLSv1.0 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.0 (OUT), TLS change cipher, Client hello (1):
* TLSv1.0 (OUT), TLS handshake, Finished (20):
* TLSv1.0 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.0 / AES128-SHA
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CN=MYWEBSITE.COM
*  start date: Mar 24 10:20:51 2020 GMT
*  expire date: Mar 24 00:00:00 2021 GMT
*  issuer: CN=MYWEBSITE.COM
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
> GET /mywonderfulwebsite/mypage.php HTTP/1.1
> Host: mywebsite.com
> User-Agent: curl/7.58.0
> Accept: */*
....... and here the content of the page.....

现在从新版本开始,它不起作用了。

curl -vvvvv https://mywebsite.com/mywonderfulwebsite/mypage.php
*   Trying 192.168.0.70:443...
* TCP_NODELAY set
* Connected to mywebsite.com (192.168.0.70) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (OUT), TLS alert, protocol version (582):
* error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
* Closing connection 0
curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol

所以我认为问题出在TLS版本上,没问题,让我们强制执行:

curl --tlsv1.0 -vvvvv https://mywebsite.com/mywonderfulwebsite/mypage.php

*   Trying 192.168.0.70:443...
* TCP_NODELAY set
* Connected to mywebsite.com (192.168.0.70) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (OUT), TLS alert, protocol version (582):
* error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
* Closing connection 0
curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol

但它失败了。

我尝试添加来自远程网站的证书,但是得到了相同的答复。

我使用openssl客户端查看了请求:

# openssl s_client -connect mywebsite.com:443 -tls1
CONNECTED(00000003)
139820362433856:error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available:../ssl/statem/statem_clnt.c:1112:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 7 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

现在我正在处理版本和请求方面的问题,但是我不知道应该在哪里检查。您知道我该如何解决问题吗?


看起来您正在使用一个 OpenSSL 版本,它被奇怪地编译(以删除 TLS1.0)或在某个地方配置为禁用 TLS1.0(包括 SECLEVEL>=3 和/或 SuiteB)。您使用的是什么系统(Linux?哪个版本?其他 Unix?MacOS?ChromeOS?Android?Windows?),确切地说,您正在运行哪些程序文件,它们来自哪里(标准 repo 的软件包管理器,其他 repo,自己构建的,朋友或同事提供的,某个网站)?是否设置了 envvar OPENSSL_CONF?如果没有,请使用 openssl version -d 查找您的配置文件,并查看它是否有任何全局设置。 - dave_thompson_085
尽管通常正确检查证书是一件好事,但你的问题与证书无关,因此修复证书不会对其产生任何影响。 - dave_thompson_085
你说得对。这绝对是与TSL相关的问题,最小TLS版本存在问题。在Debian Buster上,openssl被配置为禁止使用TLS < 1.2。我将在我的回答中解释它。 - Matthew
2个回答

20

这是解决方案:https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level

较晚的openssl包被配置为禁止使用TLS < 1.2,但第一个curl请求显示了使用TLS 1.0进行通信。

因此,在debian Buster中,openssl包太新。

dpkg -l | grep openssl
ii  openssl                       1.1.1d-0+deb10u7

我不需要降级 Openssl

编辑 /etc/ssl/openssl.cnf 文件

在文件开头添加

openssl_conf = default_conf

并将此添加至文件末尾

[ default_conf ]

ssl_conf = ssl_sect

[ssl_sect]

system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT:@SECLEVEL=1
改变配置允许使用 TSL 1.0 或更高版本的最小版本,因此现在我可以请求我的旧合作伙伴。

0

对于CentOS用户。

我的解决方案是将要使用的协议降低到最低级别。

/etc/crypto-policies/back-ends/opensslcnf.config

MinProtocol = TLSv1.0

希望这个方法有效,希望能对你有所帮助。 祝好。

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