如果在SSL通信中出现OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: wrong signature type的错误,则需要更改OpenSSL的设置

当我在Ruby中使用SSL连接到外部API时,遇到了错误。

Faraday::SSLError: SSL_connect returned=1 errno=0 state=error: wrong signature type

关于处理这个错误的方法总结

最終的結論

将OpenSSL配置文件/etc/ssl/openssl.cnf的安全级别更改如下。

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=1
< CipherString = DEFAULT@SECLEVEL=2
---
> CipherString = DEFAULT@SECLEVEL=1

正在发生的环境

Ruby 2.6.6的容器映像。由于操作系统是Debian,因此可能会在Debian系列的容器中发生相同的现象。

我在容器中确认后发现是Debian10.4。

# cat /etc/debian_version
10.4

从Ruby 2.6.6的Dockerfile中追溯下来,我们可以看到它基于Debian Buster构建,因此可以确定它是基于Debian 10.4的。

The reason

在使用OpenSSL进行与外部的加密通信(SSL,TLS)时,Debian默认使用更安全的设置。
此时,SHA-1已不再受支持以进行证书签名,至少需要SHA-256。
如果对方不支持至少TLS1.2,则会发生错误。

https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1 維基百科的公式網頁也有這個內容。

使用Dockerfile自动编辑的方法

您可以使用Sed命令编辑配置文件。

FROM ruby:2.6.6

RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/' /etc/ssl/openssl.cnf

请注意

在相似的错误情况下,

OpenSSL::SSL::SSLError SSL_connect 返回了1 errno=0 state=SSLv3 读取服务器证书B:证书验证失败。

有一个东西,如果用错误消息搜索,会混杂着这个搜索结果,所以要注意。
从 http://curl.haxx.se/ca/cacert.pem 下载并安装证书之类的事情是无关紧要的。

请参阅相关资料

    • ContinuousIntegrationTriagingTipsopenssl-1.1.1

 

    • PHP CURL – cURL error 35: error:1414D172:SSL routines:tls12_check_peer_sigalg:wrong signature type

OpenSSL v1.1.1 ssl_choose_client_version unsupported protocol [closed]