为什么curl 无法连接到bit.ly?

为什么curl 无法连接到bit.ly?

我试图按照说明安装 Hyperledger Fabric 及其示例代码和示例在他们的页面上。但是,当我尝试执行以下命令时:

curl -sSL https://bit.ly/2ysbOFE | bash -s

我收到以下错误:

curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

经过一些小的调试后,我发现问题是它试图找到名称909be051.0/etc/ssl/certs/.快速搜索后,我发现文件名是基于 openssl 命名约定的特定哈希值。我试图理解所发现的建议这里,但我没有rootcert.pem提到这个。

然后我尝试卸载并重新安装curl。那没有用。我尝试通过运行来更新证书update-ca-certificates,还尝试通过调用来重新哈希c_rehash。那些没有用。

然后我发现了这个回答。我查了这个命令(例如这里)并阅读相关内容这里,并用它来尝试获取 bit.ly 的 SSL 证书,如下所示:

openssl s_client -showcerts -servername bit.ly -connect bit.ly:443 > cacert.pem

然后我将证书复制到证书目录/etc/ssl/certs,执行update-ca-certificatesand c_rehash,并重试curl命令,但它再次不起作用。我必须说我调用c_rehash时没有指定任何目录,并且我的SSL_CERT_DIR环境变量为空,所以也许我没有正确执行该过程。无论如何,我然后直接在curl命令中使用了这个证书,如下所示:

curl -vsSL https://bit.ly/2ysbOFE --cacert ./cacert.pem | bash -s

并得到了

...

* Connection #0 to host bit.ly left intact
* Issue another request to this URL: 
'https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh'
*   Trying 185.199.109.133:443...
* Connected to raw.githubusercontent.com (185.199.109.133) port 443 (#1)
* ALPN, offering http/1.1
*  CAfile: ./cacert-bitly.pem

...

* TLSv1.3 (OUT), TLS alert, unknown CA (560):
} [2 bytes data]
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 1
curl: (60) SSL certificate problem: unable to get local issuer certificate

这表明我提供的证书似乎适用于连接到bit.ly,但现在curl 正在尝试raw.githubusercontent.com使用我提供的相同.pem文件连接到 ,该文件不包含第二个域的证书。于是我重用了之前的命令来获取 的证书raw.githubusercontent.com,即:

openssl s_client -showcerts -servername raw.githubusercontent.com -connect raw.githubusercontent.com:443 > cacert-githubusercontent.pem

我再次将第二个证书复制到证书目录/etc/ssl/certs,执行update-ca-certificatesand c_rehash,然后重试curl命令,但它再次不起作用(再次,我可能以错误的方式完成了更新)。然后我将第二个证书附加到第一个证书,以便两个证书都可以在一个文件中用于curl 命令,如下所示:

cat cacert-githubusercontent.pem >> cacert.pem

最后,我运行:

curl -vsSL https://bit.ly/2ysbOFE --cacert ./cacert.pem | bash -s

它起作用了。

我的问题是:

  • 为什么 bit.ly 的证书丢失了?
  • curl 无法自行确定要使用哪个证书的原因是什么?
  • 为什么curl 要求提供该文件909be051.0
  • 我这样做的方式安全吗?
  • 我可以更容易地做到这一点吗?

预先非常感谢您!

PS:我是在 VMWare 虚拟机中运行的 Ubuntu 18.04.6 上完成所有这些操作的。

相关内容