为什么我的 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 实例上执行?
任何帮助将不胜感激。
其他信息:
服务器似乎 运行ning。 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] 信息 WEBrick::HTTPServer#start: pid=2499 端口=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。
自从我最初提出问题后添加的内容,但仍未解决问题:
- 设置:绑定,'0.0.0.0'
通常您不希望任何 ruby 网络服务器实际处理 SSL。您让它们提供纯 HTTP(只能通过本地主机访问)。然后安装处理所有 SSL 通信的反向代理。
例如
- 安装 nginx(反向代理)并将其配置为侦听端口 443。
- 设置你的
ruby 应用服务器侦听端口 127.0.0.1:80(接受本地
仅限连接)
- 所有请求都命中了 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
}
}
好吧,我决定在构建 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 实例上执行?
任何帮助将不胜感激。
其他信息:
服务器似乎 运行ning。 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] 信息 WEBrick::HTTPServer#start: pid=2499 端口=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。
自从我最初提出问题后添加的内容,但仍未解决问题:
- 设置:绑定,'0.0.0.0'
通常您不希望任何 ruby 网络服务器实际处理 SSL。您让它们提供纯 HTTP(只能通过本地主机访问)。然后安装处理所有 SSL 通信的反向代理。
例如
- 安装 nginx(反向代理)并将其配置为侦听端口 443。
- 设置你的 ruby 应用服务器侦听端口 127.0.0.1:80(接受本地 仅限连接)
- 所有请求都命中了 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
}
}