gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:46:49 27 4
gpt4 key购买 nike

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

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

这是我的 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 测试,运行 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] 信息 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。


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

  • 设置:绑定(bind),'0.0.0.0'

最佳答案

通常您不希望任何 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
}
}

关于ruby - 为什么我的 Sinatra 应用程序不能使用 SSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34938361/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com