使用 RubyInstaller for windows 遇到的 RubyGems 源的 SSL 证书问题

使用 RubyInstaller for windows 遇到的 RubyGems 源的 SSL 证书问题

2015,10,24

问题

如果不安装证书的话,

在 MSYS2 中,RubyGems 源无论是使用 https://ruby.taobao.org/ 或是 https://mirrors.ustc.edu.cn/rubygems/ 都会出现 SSL 证书问题:

zhangkaizhao@HUMAN-MYTH MINGW64 ~
$ gem sources -a https://mirrors.ustc.edu.cn/rubygems/
Error fetching https://mirrors.ustc.edu.cn/rubygems/:
       SSL_connect returned=1 errno=0 state=error: certificate verify failed (https://mirrors.ustc.edu.cn/rubygems/specs.4.8.gz)

在 Windows cmd 中的 RubyInstaller for windows 的 RubyGems 源也一样:

C:\Users\zhangkaizhao>gem sources -a https://mirrors.ustc.edu.cn/rubygems/
Error fetching https://mirrors.ustc.edu.cn/rubygems/:
       SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://mirrors.ustc.edu.cn/rubygems/specs.4.8.gz)

解决方法

MSYS2

在 MSYS2 中,可以像在 Arch Linux 里一样,通过各自安装这些包:

  • msys/ca-certificates: 用于 msys2

    $ pacman -S msys/ca-certificates

  • mingw32/mingw-w64-i686-ca-certificates: 用于 mingw32

    $ pacman -S mingw32/mingw-w64-i686-ca-certificates

  • mingw64/mingw-w64-x86_64-ca-certificates: 用于 mingw64

    $ pacman -S mingw64/mingw-w64-x86_64-ca-certificates

结果,比如对于 mingw64 :

zhangkaizhao@HUMAN-MYTH MINGW64 ~
$ gem sources -a https://mirrors.ustc.edu.cn/rubygems/
https://mirrors.ustc.edu.cn/rubygems/ added to sources

RubyInstaller for windows

而对于 RubyInstaller for windows 呢?参考这个: http://stackoverflow.com/a/27298259/3449199

先找到 RubyGems 的位置:

C:\Users\zhangkaizhao>gem which rubygems
C:/Ruby22-x64/lib/ruby/site_ruby/2.2.0/rubygems.rb

然后直接将 MSYS2 里的 SSL 证书 pem 文件复制过去即可,比如复制 mingw64 里的:

zhangkaizhao@HUMAN-MYTH MINGW64 ~
$ cp /mingw64/ssl/cert.pem /c/Ruby22-x64/lib/ruby/site_ruby/2.2.0/rubygems/ssl_certs/mingw64_cert.pem

结果:

C:\Users\zhangkaizhao>gem sources -a https://mirrors.ustc.edu.cn/rubygems/
https://mirrors.ustc.edu.cn/rubygems/ added to sources

Sinatra

2010,09,05 zhangkaizhao

--

Sinatra 是基于 Ruby 的一个小巧的web框架, 感觉比较像 Python 中最近比较受关注的 bottle web框架。

Sinatra 入门可以看 Sinatra Book 一书。
我刚看的是 2010,08,30 时候的,发现其中有个小错误, 在 Handlers -> Cookies 一段, 因为 Sinatra 完全使用 rack ,故

set_cookie("thing", cookie)

应该是

response.set_cookie("thing", cookie)

才对。

Sinatra 完全不顾及命名空间的问题,所有 Sinatra 内置的变量函数等等均不需导入。 这个问题 Rails 中也应该存在?
有位老兄在其一篇批判 web2py 的文章, 说说 web2py 中指出的 web2py 的十宗“罪”的最后一宗也大概就是指这个问题。 该点中作者最后一句话“光凭这一点,web2py就可以去下地狱了。”我觉得说得比较狠了。 照其说法,创造和使用 Rails/Sinatra 等作品的开发人员都统统可以去下地狱了。。。:-(

不过,说真的,Java/Python 在命名空间这个问题上做得都非常好, 采用 import 方式并指明每个导入的变量命名的来源, 这确实能避免命名空间混乱的问题。
而像 PHP/Perl/Ruby 等这种导入了一个模块后就相当于把那个模块中的所有变量命名导入到当前上下文的做法实在欠妥。 也给调试和查看源代码带来了很多麻烦。
当然 Java 中可以使用

import foo.*;

而 Python 中可以使用

from foo import *

来实现这种劣质的模块导入使用机制。

在 Python 中的代码块缩进语法或是其令人称赞的 import 模块导入机制等等, 看上去都是为开发人员所考虑, 所以,我想之所以很多开发人员喜欢 Python ,这些大概也都是令人喜欢的原因。