为什么我的 Sinatra 应用程序无法使用 SSL?

JP.*_*JP. 1 ruby ssl amazon-ec2 sinatra amazon-web-services

好吧,我决定确保在构建 api 之前我可以让这个 ssl 东西正常工作..我感觉已经完成了 95%。

\n\n

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

\n\n

这是我的 app.rb

\n\n
require \'sinatra/base\'\nrequire \'webrick\'\nrequire \'webrick/https\'\nrequire \'openssl\'\n\nclass MyServer  < Sinatra::Base\n  set :bind, \'0.0.0.0\'\n\n  get \'/\' do\n    "Hello, world!\\n"\n  end\nend\n\nCERT_PATH = \'./ssl\'\n\nwebrick_options = {\n    :Port               => 443,\n    :Logger             => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG),\n    :DocumentRoot       => "/ruby/htdocs",\n    :SSLEnable          => true,\n    :SSLVerifyClient    => OpenSSL::SSL::VERIFY_NONE,\n    :SSLCertificate     => OpenSSL::X509::Certificate.new(  File.open(File.join(CERT_PATH, "server.crt")).read),\n    :SSLPrivateKey      => OpenSSL::PKey::RSA.new(          File.open(File.join(CERT_PATH, "server.key")).read),\n    :SSLCertName        => [ [ "CN",WEBrick::Utils::getservername ] ],\n    :app                => MyServer\n}\nRack::Server.start webrick_options\n
Run Code Online (Sandbox Code Playgroud)\n\n

我运行程序

\n\n
sudo ruby app.rb\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

当然,这显示了我是否运行 sinatra 服务器。

\n\n

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

\n\n

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

\n\n

那么,什么给出呢?我什么地方做得不对?为什么它在 localhost 上执行了我期望的操作,但在 ec2 实例上却执行不了?

\n\n

任何帮助将不胜感激。

\n\n
\n\n

其他信息:

\n\n
    \n
  • 服务器似乎正在运行。sudo ruby​​ app.rb 为我提供了有关我的证书的有效信息,然后是

    \n\n

    [2016-01-22 03:36:52] DEBUG WEBrick::HTTPServlet::FileHandler 安装在 /.\n[2016-01-22 03:36:52] DEBUG Rack::Handler::WEBrick 安装在/.\n[2016-01-22 03:36:52] 信息 WEBrick::HTTPServer#start: pid=2499 端口=443

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

  • \n
  • 从本地计算机,我收到响应。

  • \n
\n\n

$ wget https://localhost

\n\n
--2016-01-22 04:11:48--  https://localhost/ \nResolving localhost     (localhost)... 127.0.0.1 \nConnecting to localhost (localhost)|127.0.0.1|:443... connected. \nERROR: cannot verify localhost\'s certificate, issued by \xe2\x80\x98/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA\xe2\x80\x99:   \nUnable to locally verify the issuer\'s authority. \nERROR: no certificate subject alternative name matches  requested host name \xe2\x80\x98localhost\xe2\x80\x99. \nTo connect to localhost insecurely, use `--no-check-certificate\'.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

自从我最初提出问题以来添加了一些内容,但仍然没有解决问题:

\n\n
    \n
  • 设置:绑定,\'0.0.0.0\'
  • \n
\n

Mar*_*cny 5

一般来说,您不希望任何 Ruby Web 服务器实际处理 SSL。您让它们提供纯 HTTP(只能通过本地主机访问)。然后安装一个反向代理来处理所有 SSL 通信。

例如

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

一个非常简单的 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
    }
}
Run Code Online (Sandbox Code Playgroud)