Linux服务器cURL访问嵌入式API遇SSL alert 35问题求助
我尝试使用cURL访问一台无法修改的Geo卫星调制解调器嵌入式服务器的API。在Mac上使用以下版本的cURL请求可成功:
curl 8.1.2 (x86_64-apple-darwin22.0) libcurl/8.1.2 (SecureTransport) LibreSSL/3.3.6 zlib/1.2.11 nghttp2/1.51.0 Release-Date: 2023-05-30 Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL threadsafe UnixSockets
但在Linux服务器上,使用以下版本的cURL时遇到SSL alert 35错误:
curl 7.86.0 (x86_64-pc-linux-gnu) libcurl/7.86.0 OpenSSL/3.0.7 zlib/1.2.13 brotli/1.0.9 zstd/1.5.2 libidn2/2.3.2 libssh2/1.10.0 nghttp2/1.49.0 Release-Date: 2022-10-26 Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd
执行命令及错误输出:
curl -vvvv -L -k https://192.168.44.1/api/ * Trying 192.168.44.1:443... * Connected to 192.168.44.1 (192.168.44.1) port 443 (#0) * ALPN: offers h2 * ALPN: offers http/1.1 * TLSv1.0 (OUT), TLS header, Certificate Status (22): * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS header, Certificate Status (22): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS header, Unknown (21): * TLSv1.2 (IN), TLS alert, unsupported certificate (555): * error:0A000413:SSL routines::sslv3 alert unsupported certificate * Closing connection 0 curl: (35) error:0A000413:SSL routines::sslv3 alert unsupported certificate
原以为-k参数能完全跳过证书验证,但仍出现该告警,想知道是否有办法屏蔽、忽略或避免此OpenSSL错误。
另外,Mac上的Chrome也无法打开该页面,提示ERR_BAD_SSL_CLIENT_AUTH_CERT,不过可通过Firefox提取到疑似有问题的证书——该证书为GeoSat Modem的自签名证书,有效期至2033年。
这个错误并非因为服务器证书不被信任,而是OpenSSL 3.0.x对旧证书的兼容性问题:服务器返回的证书可能使用了过时的签名算法(如MD5)或不符合现代TLS规范的格式,导致OpenSSL直接拒绝处理。-k参数仅能跳过证书信任验证,无法绕过证书格式或算法不支持的问题。
可尝试以下几种解决方法:
指定兼容的TLS版本:服务器可能仅支持旧版TLS,强制cURL使用TLS 1.2或更低版本:
curl -vvvv -L -k --tls-max 1.2 https://192.168.44.1/api/或者直接指定TLS版本:
curl -vvvv -L -k --tlsv1.2 https://192.168.44.1/api/临时调整OpenSSL安全策略:OpenSSL 3.0默认启用了严格的安全策略,可通过环境变量临时降低策略级别:
OPENSSL_CONF=<(printf "[openssl_init]\nssl_conf = ssl_sect\n[ssl_sect]\nsystem_default = system_default_sect\n[system_default_sect]\nMinProtocol = TLSv1.2\nCipherString = DEFAULT@SECLEVEL=1") curl -vvvv -L -k https://192.168.44.1/api/该命令临时设置OpenSSL使用TLS 1.2作为最低版本,并将安全级别降至1,允许使用部分旧但可用的算法。
使用基于LibreSSL的cURL:既然Mac上使用LibreSSL的cURL能成功,Linux上可尝试安装或编译基于LibreSSL的cURL版本,LibreSSL对旧证书的兼容性更好。
手动指定信任的证书文件:从Firefox导出服务器证书(保存为PEM格式),然后让cURL指定该证书:
curl -vvvv -L --cacert /path/to/exported-cert.pem https://192.168.44.1/api/这种方式比
-k更可靠,明确告知cURL信任该证书,避免OpenSSL对未知证书的格式校验问题。
内容的提问来源于stack exchange,提问作者Peter Goldsborough

