我已经search了高和低的答案。 许多人有自己的答案。 他们都没有为我工作。 我会提供的情况。
所以我想访问Twitter和使用networking:HTTP的后期function我得到这个错误。
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
是的,我知道每个人都得到这个消息。
这是我find的可行解决scheme。
第一; 手动设置证书文件:
#! /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在这个链接提供的http://blog.kabisa.nl/2009/12/04/ruby-and-ssl-certificate-validation/
很多人都给出了类似的答案。 这不适合我。
然后我发现了一些让我走向正确的道路。 这家伙MislavMarohnićhttp://mislav.uniqpath.com/2013/07/ruby-openssl/钉住了关注的领域。 它与OpenSSL :: X509 :: DEFAULT_CERT_FILE和OpenSSL :: X509 :: DEFAULT_CERT_DIR有关。 结果是硬编码到我的Ruby 1.9.3通过它的源代码。 米斯拉夫给他的工作如下:
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
Bah骗子和所有的东西!
我还要提到他写了一个脚本,可以帮助debugging正在发生的事情。 它可以帮助你,但不是在我的情况。 链接在他的页面上。
哦耶。 我也定了
ENV['SSL_CERT_FILE'] ENV['SSL_CERT_DIR']
在我的ruby代码没有成功。
然后我通过开始 – > 控制面板 – > 系统 – > 高级系统设置 – > 高级 (选项卡) – > 环境variables – >系统variables新build 设置 环境variables ,并添加了SSL_CERT_DIR和SSL_CERT_FILE。 这也没有工作。
而authentication的gem不适合我… https://github.com/stevegraham/certified
所以我现在将为您提供我所有的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
所以我的解决方案是先从http://curl.haxx.se/ca/cacert.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'
并确保重命名文件,因为它出现在输出!
如果您遇到这个问题,请下载http://curl.haxx.se/ca/cacert.pem并导出到您的bash_profile
export SSL_CERT_FILE=PATH_TO_THe_DOWNLOADED_FILE/cacert.pem
这适用于我:-)
如果您已经下载了Windows的Git ,那么您可以使用一个CA包。
将SSL_CERT_DIR
设置为安装Git的位置,这将是C:\Program Files\Git\mingw32\ssl\certs
(如果在32位系统上)或C:\Program Files\Git\mingw64\ssl\certs
(如果在64位系统上)。 此外,您需要将SSL_CERT_FILE
设置为C:\Program Files\Git\mingw32\ssl\cert.pem
(如果在32位系统上)或C:\Program Files\Git\mingw64\ssl\cert.pem (if on a 64-bit system).
只是发现这个由@ photonstorm。 为我工作:
1 – 下载R1 GlobalSign根证书: https://secure.globalsign.net/cacert/Root-R1.crt
: https://secure.globalsign.net/cacert/Root-R1.crt
2-将其保存在本地,以便您可以通过命令提示符轻松访问它。 它应该保存名称Root-R1.crt
。
3-转换为PEM文件。 这里是上面的帖子没有为我工作,但是这样做: openssl x509 -in Root-R1.crt -out mycert.pem -outform PEM -inform DEF
4-将所创建的新mycert.pem
文件复制到: D:\Ruby23-x64\lib\ruby\2.3.0\rubygems\ssl_certs
< – 这个路径显然会有所不同,这取决于您安装了Ruby的位置!