好吧,我决定确保在构建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。
自从我最初提出这个问题以来添加的东西,但仍然没有解决问题:
答案 0 :(得分:4)
通常,您不希望任何ruby Web服务器实际处理SSL。您使它们提供纯HTTP(只能通过localhost访问)。然后安装一个处理所有SSL通信的反向代理。
例如
一个非常简单的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
}
}