在 Ruby on Rails 中使用 HTTP
介绍
HTTPS 是 HTTP 协议的安全加密版本。要通过 HTTPS 提供 Ruby on Rails 应用程序,您需要遵循三个步骤:
- 获取 SSL 证书
- 配置 Web 服务器以使用 SSL 证书
- 为 Ruby on Rails 应用程序配置 HTTPS
在本指南中,我们将介绍每个步骤。由于有几种可能的替代方案可以通过 HTTPS 为 Ruby on Rails 应用程序提供服务,因此我们将重点介绍最常见的选项和配置。
如果您要将现有的 Ruby on Rails 应用程序从 HTTP 迁移到 HTTPS,则应遵循一些小的更改和最佳实践,以简化转换并确保与两种协议的兼容性。我将在本指南的最后提到其中的一些。
获取 SSL 证书
SSL 证书有多种类型。您可以根据验证级别(域验证、组织验证、扩展验证)、覆盖范围(单名称、通配符、多域等)和真实性(自签名与公众信任的证书颁发机构)对它们进行分组。
一般来说,单名或通配符证书是最常见的选择。它们允许您保护单个主机名(例如www.example.com)或整个子域级别(例如*.example.com)。除非您需要一些额外的验证级别,否则域验证证书是最便宜和最常见的解决方案。第二受欢迎的替代方案是扩展验证证书,它通常由浏览器在地址栏中显示的绿色栏识别。
对于生产环境,您需要购买由受信任的证书颁发机构(例如Digicert、Comodo、Let's Encrypt)或经销商(例如DNSimple)颁发的 SSL 证书。要购买受信任的 SSL 证书,请按照证书提供商提供的说明进行操作。
对于非生产应用程序,您可以使用自签名 SSL 证书来避免与 SSL 证书相关的成本。如果您使用自签名证书,连接仍将被加密,但是,您的浏览器可能会显示安全警告,因为该证书不是由受信任的证书颁发机构颁发的。您可以按照这些说明生成自签名证书。
无论证书类型如何,在颁发过程结束时您都应该获得以下文件:
- 公共 SSL 证书
- 私钥
- 可选,中级 SSL 证书列表或中级 SSL 证书包
这些文件是继续下一步并配置 Web 服务器以支持 HTTPS 所必需的。
配置 Web 服务器以支持 HTTPS
在本节中,我们将学习如何配置最常见的 Ruby on Rails Web 服务器以在 HTTPS 下为应用程序提供服务。我们将使用上一步中获得的公共 SSL 证书、私钥和中间 SSL 链。
为了举例说明,我将使用以下文件名:
- certificate.crt-公共 SSL 证书
- private.key - 私钥
根据 Web 服务器的不同,您可能需要在单个文件中提供 SSL 中间链以及公共 SSL 证书,或者使用两个单独的文件:
- chain.pem - 中间 SSL 证书包
- certificate_and_chain.pem - SSL 证书和中级 SSL 证书包
中级和 SSL 证书包
中间 SSL 证书包的创建通常是最令人困惑的步骤之一,因此值得特别提及。
该包只是一个简单的文本文件,其中包含所有中间 SSL 证书的串联。顺序通常是倒序的,从最具体的中间 SSL 证书到最通用的(和/或根证书)。
根证书通常会被省略,因为它应该被捆绑在浏览器或操作系统中。如果捆绑包必须包含服务器 SSL 证书,那么它必须作为列表中的第一个证书出现(因为这是最具体的)。
SERVER CERTIFICATE
INTERMEDIATE CERTIFICATE 1
INTERMEDIATE CERTIFICATE 2
INTERMEDIATE CERTIFICATE N
ROOT CERTIFICATE
您可以使用文本编辑器将文件连接在一起,或者使用cat unix 实用程序。
cat certificate.crt interm1.crt intermN.crt root.csr > certificate_and_chain.pem
cat interm1.crt intermN.crt root.csr > chain.pem
Nginx
Nginx 通常用作其他 Rack Web 服务器的前端代理,例如 Unicorn、Passenger、Puma 或 Thin。
要在 Nginx 上配置 HTTPS,必须在服务器块中的监听套接字上启用ssl参数,并且必须指定 SSL 证书包和私钥文件的位置:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/certificate_and_chain.pem;
ssl_certificate_key /path/to/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
另请参阅为 Nginx 配置 HTTPS 服务器。您可能需要参考cipherli.st了解推荐的密码和协议配置。
虽然您可以配置一个服务器块来监听80和443,但通常的做法是配置两个不同的服务器块:一个用于 HTTP,一个用于 HTTPS。
不要忘记重新启动 Web 服务器来应用配置。
阿帕奇
Apache 一般与 Passenger 结合使用。
要在 Apache 上配置 HTTPS,VirtualHost必须监听端口443,必须打开 SSLEngine ,然后必须指定 SSL 证书包和私钥文件的位置。
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile "/path/to/certificate_and_chain.pem"
SSLCertificateKeyFile "/path/to/private.key"
</VirtualHost>
如果您使用的是 2.4.8 之前的 Apache 版本,请注意您需要对公共 SSL 证书和 SSL 中间链使用两个单独的文件。
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile "/path/to/certificate.crt"
SSLCertificateChainFile "/path/to/chain.pem"
SSLCertificateKeyFile "/path/to/private.key"
</VirtualHost>
另请参阅Apache 的 SSL/TLS 强加密。您可能需要参考cipherli.st了解推荐的密码和协议配置。
不要忘记重新启动 Web 服务器来应用配置。
Heroku
Heroku 是一种流行的平台即服务 (PaaS),也用于部署 Rack 应用程序。Heroku 是一个托管环境,因此您无法访问低级 Web 服务器配置。
为了在 Heroku 上配置 SSL 证书,您必须使用 Heroku CLI 来配置 SSL 端点
$ heroku addons:create ssl:endpoint
并使用私钥和由证书和链(如果有)组成的完整 SSL 证书包安装 SSL 证书。
$ heroku certs:add certificate_and_chain.pem private.key
亚马逊 AWS
如何配置 AWS 以提供 HTTPS 取决于您使用的特定 AWS 服务。如果您使用单个 EC2 实例,则必须安装 Web 服务器来托管您的 Ruby on Rails 应用程序,并且配置取决于您将使用的特定服务器。如果您将 Nginx 或 Apache 与特定的 Rack Web 服务器一起使用,则可以按照前面部分中发布的说明进行操作。
为 HTTPS 配置 Ruby on Rails 应用程序
默认情况下,一旦您正确地为 HTTPS 配置了 Web 服务器,您就应该能够通过 HTTPS 加载 Ruby on Rails 应用程序,而无需进一步配置。
但是,为了通过 HTTPS 有效地提供 Ruby on Rails 应用程序,建议您将 cookie 标记为安全,使用适当的 HTTPs 安全标头进行响应,并将 HTTP 流量重定向到 HTTPS。
force_ssl 配置
在最近的 Ruby on Rails 版本中,框架提供了一个名为force_ssl的配置标志,您可以启用该标志来强制应用程序在 HTTPS 下运行。此功能自 Ruby on Rails 3.1 开始可用。
您可以通过在环境文件中将值设置为true来在特定环境中启用此功能。
# config/environments/production.rb
Rails.application.configure do
# ...
# force HTTPS on production
config.force_ssl = true
end
请记住重新启动 Ruby on Rails 网络服务器以应用更改。
您还可以在application.rb文件中全局启用该功能,这将应用于所有环境。但请注意,这也会影响您的测试和开发环境。
module MyApp
class Application < Rails::Application
# ...
# force HTTPS on all environments
config.force_ssl = true
end
一旦启用,框架将为您执行以下操作:
- 应用程序设置的所有 cookie都将被标记为安全
- 响应将包含HTTP 严格传输安全 (HSTS) 安全标头,该标头将指示浏览器仅通过 HTTPS 执行后续请求
- 所有 HTTP 请求都将重定向到 HTTPS
需要注意的是,此配置适用于整个环境:它会影响发送到应用程序的所有请求,并且无法在特定控制器或操作上启用/禁用它。此外,由于这一点,无法在 HTTP 和
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~