如何使Sinatra支持HTTPS / SSL?

41
如标题所示,谷歌没有提供有关此事的任何有用信息。
如何为Sinatra应用程序设置和配置HTTPS/SSL?
如何创建一个HTTPS路由?
我以前从未在我的应用程序中使用过HTTPS,也没有调整Rack/任何其他东西的经验,因此感谢详细的答案。
6个回答

23

这似乎对我有用:

require 'sinatra/base'
require 'webrick'
require 'webrick/https'
require 'openssl'

CERT_PATH = '/opt/myCA/server/'

webrick_options = {
        :Port               => 8443,
        :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, "my-server.crt")).read),
        :SSLPrivateKey      => OpenSSL::PKey::RSA.new(          File.open(File.join(CERT_PATH, "my-server.key")).read),
        :SSLCertName        => [ [ "CN",WEBrick::Utils::getservername ] ]
}

class MyServer  < Sinatra::Base
    post '/' do
      "Hellow, world!"
    end            
end

Rack::Handler::WEBrick.run MyServer, webrick_options

[致谢 http://www.networkworld.com/columnists/2007/090507-dr-internet.html]


想给一些关于类似问题的提示。 - rampion
功能正常,但如何设置绑定地址?:BindAddress似乎无法保持。 - Tim
2
这似乎是对问题的更恰当的答案。 - user191152

16
我认为使用 rack-ssl 是最好的选择。
然后你只需要这样做:
class Application < Sinatra::Base
  use Rack::SSL

  get '/' do
    'SSL FTW!'
  end
end

并且所有的 http:// 请求都将被重定向到 https://


只有安装了 SSL 证书才能使此功能正常运作。 - Josh Crowder
1
好的,你总是应该这样做,我不是在谈论“VERIFY_NONE”选项 :) - Tomek Wałkuski

15

我猜你需要设置你的Web服务器,而不是Sinatra与SSL一同工作。在Sinatra中,你可以使用request.secure?方法来检查是否使用了SSL。

SSL + Nginx: 第一篇文章第二篇文章


11

我修改了richard_bw的代码,使其能够使用Ctrl+C关闭或重新启动:

require 'sinatra/base'
require 'webrick'
require 'webrick/https'
require 'openssl'

class MyServer  < Sinatra::Base
    post '/' do
      "Hello, world!\n"
    end            
end

CERT_PATH = '/opt/myCA/server/'

webrick_options = {
  :Port               => 8443,
  :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

我该如何为Webrick生成证书? - Alan Coromano
2
取决于你需要它的原因。如果只是测试,你可以发行自签名证书。以下是在Ubuntu上执行此操作的方法:http://askubuntu.com/questions/49196/how-do-i-create-a-self-signed-ssl-certificate - Dmitriy Budnik
如果你需要用于生产环境,我会建议查找您的域名注册商是否有此类服务。通常您需要付费。 - Dmitriy Budnik
1
我应该使用哪一个:/etc/ssl/certs/ssl-cert-snakeoil.pem 还是 /etc/ssl/private/ssl-cert-snakeoil.key? - Alan Coromano
2
我使用了 :Host Rack 选项来监听公共接口,否则它总是只能监听本地主机::Host => "0.0.0.0"。参见 Class: Rack::Server:BindAddress Webrick 选项没有按预期工作。 - Ludovic Kuty

1

为了避免使用多个服务器,这里的webrick特定答案是可以的,但是只适用于webrick。

当使用Puma时,配置可以简化:

require 'sinatra/base'

class MyServer  < Sinatra::Base
    post '/' do
      "Hello, world!\n"
    end
end

Rack::Server.start app: MyServer, Host: "ssl://0.0.0.0:8443?key=privkey.pem&cert=cert.pem"

0

在广泛搜索后,我找到的最简单的解决方案是Frank这里发布的解决方案。

只需将以下内容放置在Sinatra经典应用程序的顶部,即可强制您的应用程序使用HTTPS:

require 'rack/ssl-enforcer'
use Rack::SslEnforcer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接