ruby 深度0处的SSL验证错误:无法获取本地颁发者证书(20)

cyej8jka  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(122)

出于安全原因,我的公司对所有互联网流量都使用代理,但不幸的是,这会破坏Ruby的SSL。
当我尝试gem install rake或任何其他gem命令时,我得到以下错误:

ERROR:  SSL verification error at depth 0: unable to get local issuer certificate (20)
ERROR:  You must add /C=US/ST=New York/L=New York City/O=My Company, Inc./OU=Corporate/CN=mycompany.com to your local trusted store
RubyGems connection to rubygems.org:      failed  ❌  (certificate verification)

字符串
我该如何解决这个问题?

vsikbqxv

vsikbqxv1#

我们的企业代理在Ruby使用的默认Privacy Enhanced Mail(PEM)文件中没有SSL证书(基本上是长哈希),所以我必须手动添加它:

1.获取错误信息中地址的SSL证书hash

该错误指定服务器的地址,在本例中为mycompany.com。在Web浏览器中导航到此地址。我用的是Google Chrome。它可能会重定向,但没关系。您应该会在地址栏中的Web地址左侧看到一个锁图标,表示连接是安全的。这意味着浏览器已找到SSL证书。要获取我们需要的哈希,请单击锁图标以打开证书查看器。点击“详细信息”选项卡,确保选择顶级证书(这应该与您在错误消息中获得的原始网址相匹配),然后点击“导出”。将文件保存在某个地方,然后在文本编辑器中打开它,您将看到哈希。


的数据
打开文件:

-----BEGIN CERTIFICATE-----
MIIESzCCAzOgAwIBAgIJAKNiDFgr+nN4MA0GCSqGSIb3DQEBCwUAMIG7MQswCQYD
VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp
[lots more stuff...]
Z05JMrKlVndAmcLUoycD2hGqY9I1/9atfV23MkNslR+LBo7nMbjUj+lk/1rchww=
-----END CERTIFICATE-----

字符串

2.找到Ruby的证书文件,追加服务器的证书

在终端中,运行:
ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'
你会看到一条路。在我的例子中:"C:/Ruby32-x64/bin/etc/ssl/cert.pem"
在文本编辑器中打开此文件,并将“append the certificate”添加到文件末尾。添加一个注解来指定证书的用途可能是个好主意。为安全起见,在条目的上方和下方保留一个换行符:

mYCOMPANY.com
====================
-----BEGIN CERTIFICATE-----
[paste certificate hash here]
-----END CERTIFICATE-----


保存文件。此时,您可以跳过下一步。

3.告诉Ruby使用该文件(可能可以跳过这一步)

在PowerShell中:
$env:SSL_CERT_FILE="C:\Ruby32-x64\bin\etc\ssl\cert.pem"
在命令提示符下:
set SSL_CERT_FILE=C:\Ruby32-x64\bin\etc\ssl\cert.pem

4.测试

运行this script检查错误是否已解决。按照链接,将其保存为check.rb,然后运行ruby check.rb。你应该看到这样的东西:

Here's your Ruby and OpenSSL environment:

Ruby:           3.2.2p53 (2023-03-30 revision e51014f9c05aa65cbf203442d37fef7c12390015) [x64-mingw-ucrt]
RubyGems:       3.4.10
Bundler:        2.4.10
Compiled with:  OpenSSL 3.1.0 14 Mar 2023
Loaded version: OpenSSL 3.1.0 14 Mar 2023
SSL_CERT_FILE:  C:/Ruby32-x64/bin/etc/ssl/cert.pem
SSL_CERT_DIR:   C:/Ruby32-x64/bin/etc/ssl/certs

With that out of the way, let's see if you can connect to rubygems.org...

Bundler connection to rubygems.org:       success ✅
RubyGems connection to rubygems.org:      success ✅
Ruby net/http connection to rubygems.org: success ✅

Hooray! This Ruby can connect to rubygems.org. You are all set to use Bundler and RubyGems. 👌

相关问题