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