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

Why isn't my Sinatra app working with SSL?

好吧,我决定在构建 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

有趣的是,在本地主机上(从我的 macbook pro 测试,运行ning El Capitan)我可以访问 https://localhost,它只是说证书不是'不信任,问我是否想进去。伟大的。

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

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

好的,听起来很简单。安全组对吧?

好吧,根据 ec2,我使用的安全组在入站时启用了 tpc 端口 443。 (HTTPS)

那么,是什么原因呢?我做错了什么?为什么它在 localhost 上执行我期望的操作而不是在 ec2 实例上执行?

任何帮助将不胜感激。


其他信息:

$ 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。


自从我最初提出问题后添加的内容,但仍未解决问题:

通常您不希望任何 ruby 网络服务器实际处理 SSL。您让它们提供纯 HTTP(只能通过本地主机访问)。然后安装处理所有 SSL 通信的反向代理。

例如

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

一个非常简单的 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
    }
}