为什么我的Sinatra应用程序不能使用SSL?

时间:2016-01-22 03:11:13

标签: ruby amazon-web-services ssl amazon-ec2 sinatra

好吧,我决定确保在构建api之前我可以使用这些ssl工作...而且我感觉95%的方式。

所以,我有一个来自namecheap的证书和密钥。一切都应该很好。

这是我的app.rb

require 'sinatra/base'
require 'webrick'
require 'webrick/https'
require 'openssl'

class MyServer  < Sinatra::Base
  set :bind, '0.0.0.0'

  get '/' do
    "Hello, world!\n"
  end
end

CERT_PATH = './ssl'

webrick_options = {
    :Port               => 443,
    :Logger             => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG),
    :DocumentRoot       => "/ruby/htdocs",
    :SSLEnable          => true,
    :SSLVerifyClient    => OpenSSL::SSL::VERIFY_NONE,
    :SSLCertificate     => OpenSSL::X509::Certificate.new(  File.open(File.join(CERT_PATH, "server.crt")).read),
    :SSLPrivateKey      => OpenSSL::PKey::RSA.new(          File.open(File.join(CERT_PATH, "server.key")).read),
    :SSLCertName        => [ [ "CN",WEBrick::Utils::getservername ] ],
    :app                => MyServer
}
Rack::Server.start webrick_options

我用

运行程序
sudo ruby app.rb

有趣的是,在localhost(从我的macbook pro测试,运行El Capitan)我可以访问https://localhost,它只是说证书不受信任,并询问我是否还想进入。大。

我的ec2实例,但我现在可以通过域名访问,当然,该域名与证书相匹配。但该网站只返回一个ERR_CONNECTION_REFUSED(这是以chrome显示的内容)

但当然,这表明我是否运行sinatra服务器。

好的,听起来很容易。安全组,对吗?

嗯,根据ec2,我正在使用一个安全组,它在入站时启用了tpc端口443。 (HTTPS)

那么,是什么给出的?我做得不对劲?为什么它在localhost上做我期望的但不在ec2实例上呢?

任何帮助都会受到超级赞赏。

其他信息:

  • 服务器确实正在运行。 sudo ruby​​ app.rb给了我关于我的证书的有效信息,然后是

    [2016-01-22 03:36:52] DEBUG WEBrick :: HTTPServlet :: FileHandler挂载在/上。 [2016-01-22 03:36:52] DEBUG Rack :: Handler :: WEBrick挂载在/上。 [2016-01-22 03:36:52] INFO WEBrick :: HTTPServer #start:pid = 2499 port = 443

  • 如果我删除webrick并将端口更改为80,一切正常。我可以从我网站的域名访问此应用程序,当然是http(而不是https)。

  • 在本地机器上,我收到了回复。

$ wget https://localhost

--2016-01-22 04:11:48--  https://localhost/ 
Resolving localhost     (localhost)... 127.0.0.1 
Connecting to localhost (localhost)|127.0.0.1|:443... connected. 
ERROR: cannot verify localhost's certificate, issued by ‘/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA’:   
Unable to locally verify the issuer's authority. 
ERROR: no certificate subject alternative name matches  requested host name ‘localhost’. 
To connect to localhost insecurely, use `--no-check-certificate'.

这似乎是正确的!所以,它似乎与服务器设置有关。我无法连接到它。 = /再次。安全组允许443和80。

自从我最初提出这个问题以来添加的东西,但仍然没有解决问题:

  • set:bind,'0.0.0.0'

1 个答案:

答案 0 :(得分:4)

通常,您不希望任何ruby Web服务器实际处理SSL。您使它们提供纯HTTP(只能通过localhost访问)。然后安装一个处理所有SSL通信的反向代理。

例如

  1. 安装nginx(反向代理)并将其配置为侦听端口443。
  2. 设置你的 ruby应用服务器侦听端口127.0.0.1:80(接受本地 仅限连接)
  3. 所有请求都命中了nginx,它剥离了SSL, 并将纯HTTP请求发送到您的ruby网络服务器。
  4. 一个非常简单的nginx配置,可以帮助您入门:

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/your.key;
    ssl on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
    
    server {
        listen 443 ssl;
        server_name you.example.com;
    
        location / {
            proxy_pass http://localhost:8080;  # your ruby appserver
        }
    }