SSL不安全的旧版本重新协商

问题描述

[root@localhost ~]# curl -V
curl 7.76.1 (x86_64-redhat-linux-gnu) libcurl/7.76.1 OpenSSL/3.0.7 zlib/1.2.11 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.1 (+libidn2/2.3.0) libssh/0.10.4/openssl/zlib nghttp2/1.43.0
Release-Date: 2021-04-14
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets

[root@localhost ~]# curl https://example.com/
curl: (35) error:0A000152:SSL routines::unsafe legacy renegotiation disabled

curl: (35) error:0A000152:SSL routines::unsafe legacy renegotiation disabled此错误是由于远程服务器不支持 RFC5746 安全重新协商引起的。在 OpenSSL 1.1.1 中设置了该标志SSL_OP_LEGACY_SERVER_CONNECT,但在 OpenSSL 3 中情况并非如此

优雅解决

OPENSSL_CONF=<(cat <<EOF
openssl_conf = openssl_init

[openssl_init]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
Options = UnsafeLegacyServerConnect
EOF
) curl https://example.com/

在这个命令中:

  1. 使用 <( ... ) 创建了一个临时的文件描述符,这个描述符对应于内部命令的输出。
  2. cat <<EOF ... EOF 是一个 Here Document,用于生成多行的字符串。用于生成提供的 OpenSSL 配置。
  3. OPENSSL_CONF=... curl https://example.com/ 设置了环境变量 OPENSSL_CONF,使其指向这个临时文件描述符,并执行 curl 命令。 将 https://example.com/ 替换为实际想要访问的 URL。

参考链接

https://stackoverflow.com/questions/75763525/curl-35-error0a000152ssl-routinesunsafe-legacy-renegotiation-disabled

updatedupdated2024-10-282024-10-28