我正在用彪马设置一个Rails应用程序,我似乎不能让它在HTTPS上提供服务. 我try 了大约15种不同的指南,并堆叠了流畅的答案,但它们都没有对我起作用. 现在,我也不能提供常规的HTTP,即使在恢复配置时也是如此.

我试过的是:

配置/Puma.rb

port ENV.fetch("PORT") { 3000 }

my_key = "#{File.join(Rails.root, 'public', '.well-你知道吗?known', 'privkey.pem')}"
my_crt = "#{File.join(Rails.root, 'public', '.well-你知道吗?known', 'cert.pem')}"

ssl_bind(
  'mydomain.com',
  3000,
  key: my_key,
  cert: my_crt,
  verify_mode: 'peer'
)

当然,mydomain.com会被正确的域名所取代.

配置/应用程序.rb

config.force_ssl = true

我已将我的证书和私钥放入public/.well-你知道吗?known.这些文件是使用Certbot生成的. 文件夹内容:

cert.pem
chain.pem
fullchain.pem
privkey.pem

这些文件是使用Certbot生成的.

生成的错误消息如下: HTTP parse error, malformed request: #<Puma::HttpParserError: Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-你知道吗?SSL Puma?>

我做错了什么?

-你知道吗?

此外,在重置我的配置和测试站点时,我收到了相同的错误消息. 对此我们能做些什么呢?

SOLUTION:个 查看Jan VíTek回复中的 comments ,看看这个问题是如何解决的.

推荐答案

我认为这里有几个问题:

  1. 这不是它不起作用的原因,但请将您的私钥移出/public路径.那里并不是很私密.
  2. 您正在将SSL绑定到与HTTP服务器相同的端口
  3. 您正在将SSL值绑定到whatever.domain.它会带来很多问题.如果存在NAT,则应用程序没有可绑定的接口.如果/etc/hosts中有服务器的FQDN,它将绑定到本地主机接口,你将无法从互联网访问它.如果它真的绑定到从该域解析的IP的接口,你可能会在本地访问该应用程序时遇到问题.现在只需将其更改为0.0.0.0,当它起作用时,您可以try 使用此属性.
  4. SSL验证模式peer将验证客户端证书.我不确定这是否是您的意图,但需要将:ca选项传递到ssl_bind(),并提供指向您的CA证书的路径
  5. 你没有说它是用于开发还是生产目的.对于生产环境,您可能希望考虑使用apache+Passenger或Nginx+Passenger,其中的HTTPS将由Web服务器(Apacheor Nginx)处理

无论如何,我创建了一个新的rails 7应用程序,将我的CRT和键设置为config/ssl/,只修改了config/puma.rb

#config/puma.rb
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count
worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development"

port ENV.fetch("PORT") { 3000 }

ssl_bind '0.0.0.0', 3001, {
  key: 'config/ssl/dev.mydomain.com.key',
  cert: 'config/ssl/fullchain.cer',
  verify_mode: 'none'
}

environment ENV.fetch("RAILS_ENV") { "development" }
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
plugin :tmp_restart

然后简单的rails s,我就可以连接到https://dev.mydomain.com:3001了.一定要明确拨打https://.

Ruby-on-rails相关问答推荐

ActiveRecord::声明在类别中无效#new

序列化来自关联的不可变数据是个好主意吗?

如何在哪里查询 Rails 模型中定义的方法

在bash中匹配带有空格字符的字符串

插件和 Ruby gem 之间的区别?

来自控制台的 ActionCable.server.broadcast

Ruby Sinatra Web 服务在 localhost:4567 上运行,但不在 IP 上

rails select标签,预先 Select 了多个值

如何让 Rspec 运行嵌套在文件夹下的所有测试?

更改 form_for rails 3.1 生成的 html 表单 ID

Rails 服务对象与 lib 类

如何获取包含表的列名的数组

Rails Active Admin css 与 Twitter Bootstrap css 冲突

Redis 引发需要 NOAUTH 身份验证错误,但没有设置密码

Rails HABTM - 正确删除关联

禁用 JS/Ajax 请求时的 ActionController::InvalidAuthenticityToken

在 Rails 协会中未找到名为的协会可能拼写错误的问题

如何使用 Rails 3 获取请求的目标控制器和操作?

如何从另一个调用 Capistrano 任务?

Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务?