Ruby 如何自制 HTTPS 服务器使用的证书和密钥

ibachue · 2014年03月03日 · 最后由 advancedxy 回复于 2014年03月04日 · 5397 次阅读

今天在做一个小项目,在这当中我要启动一个自制的简单的 HTTPS 服务器 (没用 Rack 服务器),当然我是肯定没有证书或密钥的,对此我使用了 WEBrick 自带的工具,WEBrick::Utils.create_self_signed_cert,代码如下:

servers = WEBrick::Utils.create_listeners nil, 443
cn = [['CN', 'localhost']]

ssl_context = OpenSSL::SSL::SSLContext.new
ssl_context.cert, ssl_context.key = WEBrick::Utils.create_self_signed_cert(1024, cn, 'Generated by Bachue')
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE

但奇怪的是,用这个方法伪造的证书密钥,用curl -k总是有效的。但如果用 Chrome/Firefox 的话,就很奇葩了,有时候无论怎么样都不会有问题,如果通过本机的 domain name 访问也通常不会有问题,但如果用 localhost 访问,尤其是服务器刚启动就用 localhost 访问,就可能会出现 in `accept': SSL_accept returned=1 errno=0 state=SSLv3 read client certificate A: sslv3 alert bad certificate (OpenSSL::SSL::SSLError) 这样的错误,实在太奇怪了。大家遭遇过类似的问题吗?如何解决?谢谢。

我是通过 openssl 生成证书 你可以参考 http://book.51cto.com/art/200712/61762.htm

此外,证书是针对域名授权的。不建议你创建证书的时候使用 localhost,可以使用一个虚拟域名,比如:ibachue.local,然后在 /etc/hosts 中指定 127.0.0.1 ibachue.local,最后访问 http://ibachue.locale 即可

https 证书讲究的是信任链,curl -k 的意思是不验证这个信任链。所以当然是通过的。

自制的 https 服务器证书没什么实际意义。因为客户的浏览器是不会信任你这个站点的..如果只是想本地测试的话,应该将你生成的公玥证书加到浏览器的信任证书里面。这样的话,你本地的浏览其应该就可以信任你自制的 https 站点了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号