如何配置Rails和Puma以使用SSL?

21

我只找到了如何使用 SSL 启动 Puma:

$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'

然而,文档中没有关于如何包含中间 CA 证书的描述。有人能指点我吗?我正在使用 Puma 1.6.3

谢谢!


@Smartis 感谢您的编辑!我正在考虑关闭和/或删除这个问题,因为它有点……冗余而且奇怪地具体?您有什么想法吗? - omninonsense
请记得在Rails中启用force_ssl和ACME挑战。 - Mark Boulder
5个回答

25

仅当您使用nginx时,结合证书和捆绑包才能起作用。

如果没有nginx,您可以使用 ca verify_mode 选项:

rails s puma -b 'ssl://0.0.0.0:9292?key=path_to_key.key&cert=path_to_cert.crt&verify_mode=none&ca=path_to_root_bundle.crt'

来源: https://github.com/puma/puma/blob/master/lib/puma/binder.rb


15
根目录包路径?这是什么鬼? - IIllIIll
是的,什么是根捆绑包?你是指完整链证书吗? - Mark Boulder
我爱你。我找不到任何方法,但这个神奇的参数救了我的一天。 - luuchorocha

9

可能有些晚,但我有另一个解决方案,你可以查看我的文章了解更多细节。

首先使用mkcert为本地主机创建证书。

mkcert localhost

如果您想要在HTTPS上使用另一个域名,只需将localhost替换为您想要的域名,例如mkcert mylocalhost-with-a-cool-domain.com

之后,在config文件夹下创建一个local-certs文件夹,并将证书和密钥粘贴到其中。

现在,您应该将这些证书标记为可信任的。我使用的是Mac计算机,不确定如何在Windows或Linux发行版上处理此特定部分。请查看帖子,其中有屏幕截图。简而言之,您需要将使用mkcert创建的证书拖到Keychain Access中。

然后,在您的puma配置文件中(如果没有,请创建一个并将其命名为puma.rb),您应该有类似以下内容:

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['THREAD_COUNT'] || 5)
threads threads_count, threads_count

rackup      DefaultRackup
port        3001
environment ENV['RACK_ENV'] || 'production'

if ENV['RACK_ENV'] == 'development'

  # If you didn't place the cert and key under `local-certs` you should change this
  localhost_key = "#{File.join('config', 'local-certs', 'localhost-key.pem')}" 
  localhost_crt = "#{File.join('config', 'local-certs', 'localhost.pem')}"

  ssl_bind '0.0.0.0', 3000, {
    key: localhost_key,
    cert: localhost_crt,
    verify_mode: 'none'
  }
end

运行bundle exec puma -C puma.rbbundle exec rails s即可 :D

如果有任何问题,请告诉我。希望能帮助到未来的读者!


我们能否将其设置为任何域名,而不是特定的域名? - pjo336
2
@pjo336 是的,只需将 localhost 替换为您喜欢的任何内容即可。在我的工作中,我们有几个服务,例如:api.myjob.comclient.myjob.comanother_name.myjob.com。如果您也是这种情况,您可以直接运行 mkcert *.myjob.com 并使用该证书。 - MatayoshiMariano
@MatayoshiMariano 使用通配符将适用于myjob.com上的任何子域,但同时不适用于根域。我还没有找出如何在使用puma设置的mkcert中解决这个问题。 - swiknaba
1
使用通配符将适用于myjob.com上的任何子域,但同时不适用于根域。为此,请运行mkcert“*.myjob.com myjob.com”。请注意通配符版本周围的引号。--更新我的评论意图,但已过5分钟-.- - swiknaba
@swiknaba 我没有测试根域名,需要检查一下并回复你。 - MatayoshiMariano
3
对于 Rails 6.x,您应该使用 if ENV['RAILS_ENV'] == 'development' - Ccastillop

3

我们同时使用Nginx+PhusionPassenger组合。在nginx中,你无法指定链式证书文件。诀窍是将所有证书捆绑在一个证书中,然后将新的证书文件设置为服务器配置中的证书。你可以在nginx文档中查找更多信息。请检查SSL证书链部分。

cat www.example.com.crt bundle.crt > www.example.com.chained.crt

希望这有所帮助。

在 Puma 中似乎无法附加中间证书。 - Susan

3

rails s puma -b 'ssl://0.0.0.0:9292?key=certkey.key&cert=cert.crt&verify_mode=peer&ca=root_bundle.crt'

请确保设置verify_mode=peer


-8

使用Phusion Passenger + Nginx可能是更好的选择,以获得SSL支持。这个组合有广泛的文档,并且非常容易设置,因为它目前是最受欢迎的应用服务器选择之一,被纽约时报、赛门铁克、AirBnB等公司所使用。如果您已经安装了Nginx和Phusion Passenger,以下是如何设置:

server {
    listen 443;
    server_name yourapp.local;
    ssl on;
    ssl_certificate ...;
    ssl_key ...;
    root /path-to-your-app/public;
    passenger_enabled on;
}

1
DV 代表没有回答问题。 - LAW
1
这可能不是你想要的答案,但它是一个有效的答案。如果某些东西不起作用,那么看看其他替代方案可能会更好。 - Hongli
14
问题是“如何使用Puma配置Rails来使用SSL?”。我不明白解释Phusion Passenger设置如何回答这个问题。我认为OP知道各种服务器选择,并出于某种原因选择了Puma,就像我在找到这个问题时一样。有关Puma的好话已经说得很多了,我特别想让它能够工作,以便我可以测试它。因此,你告诉我去使用其他东西是没有帮助的。 - LAW

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