OpenSSL v1.1.1 Ubuntu 20 TLSv1 - 没有可用协议

17

在Ubuntu 20.04上,通过VPN我无法访问使用TLSv1协议的服务器。

但是在Ubuntu 18.04中可以正常工作。

我首先通过SNX连接到VPN,然后使用一个程序来访问服务器。

我使用openssl做了一些测试,以突出这个问题。是否可能解决这个问题?我认为我的问题可能与https://github.com/curl/curl/issues/4097中报告的问题有关。

我认为OpenSSL v1.1.1 ssl_choose_client_version unsupported protocol也与我的问题有关,但它不同的是没有“没有可用的协议”的问题。

当我用openssl测试时,我得到错误信息“unsupported protocol”,但当我强制使用TLSv1进行测试时,我会得到错误信息“no protocols available”。

测试的详细信息:

Ubuntu 18.04:

Package: openssl
-> Version: 1.1.1-1ubuntu2.1 ~ 18.04.5

openssl s_client -connect host: port
-> works - TLSv1 ("SSL-Session: Protocol: TLSv1.").

openssl s_client -connect host: port -tls1
-> works - TLSv1 ("SSL-Session: Protocol: TLSv1.").

openssl s_client -connect host: port -tls1_1
-> 139786161414592: error: 1425F102: SSL routines: ssl_choose_client_version: unsupported protocol: ../ ssl / statem / statem_lib.c: 1907:

openssl s_client -connect host: port -tls1_2
-> 139786161414592: error: 1425F102: SSL routines: ssl_choose_client_version: unsupported protocol: ../ ssl / statem / statem_lib.c: 1907:

Ubuntu 20.04:

Package: openssl
-> Version: 1.1.1f-1ubuntu2

openssl s_client -connect host: port
-> 140253162648896: error: 1425F102: SSL routines: ssl_choose_client_version: unsupported protocol: ../ ssl / statem / statem_lib.c: 1941:

openssl s_client -connect host: port -tls1
-> 139722831217984: error: 141E70BF: SSL routines: tls_construct_client_hello: no protocols available: ../ ssl / statem / statem_clnt.c: 1112:

openssl s_client -connect host: port -tls1_1
-> 139923839911232: error: 141E70BF: SSL routines: tls_construct_client_hello: no protocols available: ../ ssl / statem / statem_clnt.c: 1112:

openssl s_client -connect host: port -tls1_2
-> 139862992581952: error: 1425F102: SSL routines: ssl_choose_client_version: unsupported protocol: ../ ssl / statem / statem_lib.c: 1941:

Ubuntu 18.04 - 连接成功的详细说明

my@machine: ~ $ openssl s_client -connect my.domain: 9023 -tls1
CONNECTED (00000005)
depth = 2 C = XX, O = XXXXXX, OU = ICP-XX, CN = AC XXXXX vX
verify error: num = 19: self signed certificate in certificate chain
---
Certificate chain
 0 s: C = XX, ST = XX, L = XXXXXX, O = XXXXXXXX, OU = XXXXXXXXXXX XXXXX, CN = xxx.com
   i: C = XX, O = XXXXXXXX., OU = ICP-XX, CN = AC XXXXX vX
 1 s: C = XX, O = XXXXXXXX., OU = ICP-XX, CN = AC XXXXX vX
   i: C = XX, O = XXXXXXXX., OU = ICP-XX, CN = AC XXXXX vX
 2 s: C = XX, O = XXXXXXXX., OU = ICP-XX, CN = AC XXXXX vX
   i: C = XX, O = XXXXXXXX., OU = ICP-XX, CN = AC XXXXX vX
---
Server certificate
----- BEGIN CERTIFICATE -----
(...)
-----END CERTIFICATE-----
subject=X = XX, ST = XX, L = XXXXXX, O = XXXXXXX, OU = XXXXXXXX, CN = mydomain.com

issuer=C = XX, O = XXXXXXXXXX, OU = ICP-XX, CN = AC XXXXXXXXXXXXXXXXXXXXX

---
No client certificate CA names sent
---
SSL handshake has read 4604 bytes and written 449 bytes
Verification error: self signed certificate in certificate chain
---
New, SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol: TLSv1
    Cipher: AES256-SHA
    Session-ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Session-ID-ctx:
    Master-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1588445847
    Timeout: 7200 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)
    Extended master secret: no
---

Ubuntu 20.04 - 连接失败的详细信息:

my@machine: ~ / Documents / $ openssl s_client -connect my.domain: 9023
CONNECTED (00000003)
139912319178048: error: 1425F102: SSL routines: ssl_choose_client_version: unsupported protocol: ../ ssl / statem / statem_lib.c: 1941:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 4545 bytes and written 309 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)
---

my@machine: ~ / Documents / study $ openssl s_client -connect my.domain: 9023 -tls1
CONNECTED (00000003)
140581447836992: error: 141E70BF: SSL routines: tls_construct_client_hello: no protocols available: ../ ssl / statem / statem_clnt.c: 1112:
-
5个回答

42

我刚刚通过以下链接解决了我的问题 - https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level

引用此链接:

您需要将以下内容添加到配置文件的开头:

openssl_conf = default_conf

然后一直到结束:

[ default_conf ]

ssl_conf = ssl_sect

[ssl_sect]

system_default = ssl_default_sect

[ssl_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT:@SECLEVEL=1

以上链接中的评论如下:

Note that if you prefer you can make changes to a local copy of the config file, and then ensure your process is started with the environment variable OPENSSL_CONF defined to point at the location of your config file:

export OPENSSL_CONF=/path/to/my/openssl.cnf

This way you can make changes without having to impact your entire system.

我使用了第二个选项"export OPENSSL_CONF=/path/to/my/openssl.cnf",运行得非常完美!

2
我希望这些服务器和客户端都不会对互联网可见。降低TLS版本是不推荐的。 - Khanna111
2
谢谢,我为这个问题苦苦挣扎了大约10个小时。在写了一个非常详细的问题后,Stack Overflow 展示了你的答案。 - Bruno Lamps
1
@felipewind,你应该将自己的答案标记为已接受的,以向他人展示你的问题已得到解决。感谢您的帖子和解决方案! - Aleksei Chernenkov
如何强制重新加载该配置文件? - Rafael
1
在Ubuntu 20.04上,由于某种原因,我需要执行此操作并更新openssl。我按照以下说明进行操作:https://fedingo.com/how-to-install-openssl-in-ubuntu/,但将`1.1.1c`替换为(当前最新版本)`1.1.1m`。 - dmn

9
对我而言有效的解决方案是创建一个名为 openssl_tls1.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

设置OPENSSL_CONF=/path/to/openssl_tls1.cnf 后,可以连接到较低的协议,如下所示:

OPENSSL_CONF=openssl_tls1.cnf wget https://foo.bar

2
我在使用Felipe的答案时遇到了困难,不知道该把什么放在哪里。我无法编辑或评论他的答案,所以我添加了自己的答案,希望能帮助其他人。 - Michael Lohrer
谢谢,你的解释确实很有帮助。 - Felipe Windmoller
就是这样了!在我的情况下,当指定 JupyterHub Docker 镜像超过 1.1.1 时(仍使用较旧的 openssl 1.1.1,不需要此项),错误开始发生,结果原因也是相同的。感谢您结束了数小时的调试。 - reinierpost

7

服务器支持TLSv1,但不支持TLSv1.1及以上版本。

Ubuntu 20.x OpenSSL版本不支持TLSv1及以下版本。

可能是openssl.cnf文件已更新以添加更安全的连接默认设置。这取决于操作系统和版本。

确定配置文件的位置(适用于您的Linux openssl),并查看是否有降低TLS版本的任何限制或默认设置。

尝试以下内容以查看服务器是否支持TLSv1.1及以上版本:

 nmap --script ssl-enum-ciphers -p 443 your_host_name

检查输出以查看密码和相应版本。

| ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| compressors:
| NULL
| TLSv1.1:
| ciphers:
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong

1
我做了测试,似乎只支持TLSv1。 开始Nmap 7.80(https://nmap.org)于2020-05-02 22:07 -03 Nmap扫描报告为my.domain(999.999.999.999) 主机已启动(0.019秒延迟)。 端口 状态 服务 9023 / tcp 打开 swa-1 | ssl-enum-ciphers: | TLSv1.0: | 密码: | TLS_RSA_WITH_AES_256_CBC_SHA(rsa 2048)-A | TLS_RSA_WITH_AES_128_CBC_SHA(rsa 2048)-A | 压缩器: | NULL |密码优先级:服务器 | 警告: |任何密码都不支持正向保密 |_最少强度:A - Felipe Windmoller
1
有道理。看起来openssl.cnf的更新解决了问题。 - Khanna111
1
它们不仅仅是默认值 - 我发现没有办法在命令行上覆盖它们。openssl s_client -tls1 不会抱怨,但默默地拒绝实际使用 TLS 1.0。至少,我从它返回的消息中没有收集到这一点。 - reinierpost

1
如果你像我一样在尝试上述答案https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level(或其他方式)后遇到错误14187180,你可能想尝试使用openconnect的--dtls-ciphers=LEGACY选项。我需要像上面一样降级到TLSv1.1(MinProtocol = TLSv1.1)并添加此选项才能连接到客户的Cisco Anyconnect VPN。
echo password | OPENSSL_CONF=/etc/ssl/openssl_tls_1_0.cnf openconnect -v -g VPNGROUP -u username --dtls-ciphers=LEGACY --passwd-on-stdin vpn.domain

0

对于裸的 OpenSSL,直接使用密码字符串可能比设置 OPENSSL_CONF 更简单:

openssl s_client -cipher DEFAULT@SECLEVEL=1 -tls1 -connect $host:$port

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