在Windows 7上,带Twitter的Ruby SSL在证书OpenSSL问题上失败

在Windows 7上,带Twitter的Ruby SSL在证书OpenSSL问题上失败,ruby,windows,openssl,ssl-certificate,x509certificate,Ruby,Windows,Openssl,Ssl Certificate,X509certificate,我想访问Twitter,在使用Net::HTTP的POST函数时,我得到了这个错误 SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed 是的,我知道每个人都收到了这个信息 以下是我找到的可行解决方案 首先,手动设置证书文件: #! /usr/bin/env ruby require 'net/https' require 'uri' uri = URI

我想访问Twitter,在使用Net::HTTP的POST函数时,我得到了这个错误

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
是的,我知道每个人都收到了这个信息

以下是我找到的可行解决方案

首先,手动设置证书文件:

#! /usr/bin/env ruby
require 'net/https'
require 'uri'
 
uri = URI.parse(ARGV[0] || 'https://localhost/')
http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme == "https"
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.ca_file = File.join(File.dirname(__FILE__), "cacert.pem")
end
http.start {
  http.request_get(uri.path) {|res|
    print res.body
  }
}
这是由Ariejan de Vroom提供的:

许多人对此给出了类似的答案。这对我不起作用

然后我发现了一些东西,使我走上了正确的道路。这家伙Mislav Marohnić锁定了关注区域。它与OpenSSL::X509::DEFAULT\u CERT\u文件和OpenSSL::X509::DEFAULT\u CERT\u DIR有关。这些都是通过Ruby 1.9.3的源代码硬编码的。Mislav给出了如下解决方法:

require 'https'

http = Net::HTTP.new('example.com', 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

http.cert_store = OpenSSL::X509::Store.new
http.cert_store.set_default_paths
http.cert_store.add_file('/path/to/cacert.pem')
# ...or:
cert = OpenSSL::X509::Certificate.new(File.read('mycert.pem'))
http.cert_store.add_cert(cert)
我涉猎过这一点,我总是会遇到这样的错误:

OpenSSL::X509::StoreError: cert already in hash table
呸,骗子之类的

我还应该提到,他写了一个脚本,可以帮助调试正在发生的事情。这可能对你有帮助,但对我来说不行。链接在他的页面上

我还设置了

ENV['SSL_CERT_FILE']
ENV['SSL_CERT_DIR']
在我的ruby代码中没有成功

然后我继续在windows中通过启动->控制面板->系统->高级系统设置->设置环境变量(选项卡)->环境变量->系统变量新增,并添加了SSL\u CERT\u DIR和SSL\u CERT\u文件。这也没用

认证的宝石对我不起作用


因此,我现在将为下面的所有Windows 7用户提供我的破解答案。

因此我四处搜索,基本上盯着证书的硬编码路径。通过在命令行中键入

ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
我得到了以下信息

c:/Users/Luis/Code/openknapsack/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0k/ssl/cert.pem
所以我的解决方案是首先将cacert.pem从下载到c:\。然后打开Windows控制面板
->管理工具->Windows PowerShell模块。然后我开始打字:

cd \
cd users
mkdir Luis
cd Luis
mkdir Code
cd Code
mkdir openknapsack
cd openknapsack
mkdir knap-build
cd knap-build
mkdir var
cd var
mkdir knapsack
cd knapsack
mkdir software
cd software
mkdir x86-windows
cd x86-windows
mkir openssl
cd openssl
mkdir 1.0.0k
cd 1.0.0k
mkdir ssl
cd ssl
cp c:\cacert.pem .\cert.pem
现在一切都好了!是的,这是一个廉价的黑客和它的丑陋。但是现在你和我都可以回去做严肃的编码了,不用担心麻烦的问题

我知道这不是一个很好的解决办法,但这是唯一对我有效的办法,你也应该如此

如果有人想编写PowerShell脚本来自动将证书文件安装到此目录中,那么您可以更轻松地将Ruby项目部署到Windows 7。只是一个想法

顺便说一下,如果需要,您可以在任何操作系统上复制此过程。只需找到证书文件所属的路径:

ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'

并确保重命名文件,因为它出现在输出

如果您面临此问题,请下载 并导出到您的bash_配置文件

export SSL\u CERT\u FILE=PATH\u到下载的文件/cacert.pem


这对我有用:-)

如果你已经下载了,它有一个CA包,你可以使用


SSL\u CERT\u DIR
设置到安装Git的位置,该位置将是
C:\Program Files\Git\mingw32\SSL\certs
(如果在32位系统上)或
C:\Program Files\Git\mingw64\SSL\certs
(如果在64位系统上)。此外,您需要将
SSL\u CERT\u FILE
设置为
C:\Program Files\Git\mingw32\SSL\CERT.pem
(如果在32位系统上)或
C:\Program Files\Git\mingw64\SSL\CERT.pem(如果在64位系统上)。
刚刚发现这是由@photonstorm制作的。 为我工作:

1-下载R1 GlobalSign根证书:
https://secure.globalsign.net/cacert/Root-R1.crt

2-将其保存在本地某个位置,以便您可以通过命令提示符轻松访问它。它应该使用名称
Root-R1.crt
保存

3-转换为PEM文件。这里是上面的帖子对我不起作用的地方,但它确实起了作用:
opensslx509-in Root-R1.crt-out mycert.pem-outform pem-inform DEF


4-将新创建的
mycert.pem
文件复制到:
D:\Ruby23-x64\lib\ruby\2.3.0\rubygems\ssl\u certs
如果您知道如何为OpenSSL::X509编写内部代码,我想您可以用自己的ruby函数/方法/类/模块等覆盖代码。这是一个项目。注意:Twitter自己建议获得您的原始来源证书。。。比如Verisign。这个链接。。。是主要通过互联网传播的信息源。可能存在信任问题。但如果你想获得技术,谁是Verisign对的?;-)因为这是可行的解决方案。。。由于某种原因,Heroku工具带无法为我解决这些问题。但这是另一个问题。Heroku Toolbelt还提供了自己的Ruby副本。这是否也适用于Windows 8?和你一样,我也尝试过解决这个问题的各种方法,但没有一种对我有效。本例中的路径与您的稍有不同,但我遵循了相同的过程,但仍然得到了SSL错误。有什么想法吗?另外,您使用的是哪个版本的Ruby?我正在尝试让ruby 2.0.0p481(2014-05-08)[x64-mingw32]工作。硬编码路径是OpenSSL设计中的一个失败,它需要构建时信息,不允许使用相对路径。查看此线程了解详细信息:我相信我在64位系统上使用了最新的Ruby 2.1.2。我不太确定你的路线和系统。但我建议您将其视为对路径和提供的文件/文件名非常挑剔。我的想法是检查要匹配的路径、要匹配的文件名、文件和文件夹权限,以及内容必须符合预期。除此之外,我还感到困惑。这个解决方案解决了我的Twitter问题。我相信还有另一个例子,我仍然犯同样的错误。。。我想是和Heroku的客户在一起但我不记得了。