在 Apache2/Ubuntu 上托管的 Ruby on Rails 应用程序上设置 SSL 需要采取哪些步骤?
答案1
注意:我将其从之前错误的“社区维基”帖子中移出。
有一天,我们的一些 Rails 开发人员要求我在应用程序上启用 SSL。
Google 上有许多关于使用 Ubuntu 和 Apache 配置 SSL 的资料,还有一些关于 Rails 的资料,还有一些关于 Ubuntu/Apache/Rails 的资料,但我找不到一个我觉得简单而全面的资料。
因此,在花了一些时间弄清楚使 SSL 在这个流行配置上运行所需的确切步骤组合之后,我决定制作一个 ServerFault 条目,介绍如何在 Apache2 / Ubuntu 上的 Rails 应用程序中运行 SSL。
请根据您的经验随意编辑/添加/评论!
对于这种情况,我们假设您从 GoDaddy 获取证书(而不是自签名证书),但您可以从任何证书颁发机构获取证书,并且步骤应该相同。
我将使用 www.yourdomain.com 作为我们想要保护的示例域。
设置您的证书目录
SSL 有四个与加密相关的文件需要存放:1)CSR(您发送给 GoDaddy),2)私钥(您保留),3)GoDaddy 发送给您的实际证书,以及 4)中间证书(GoDaddy 将发送给您)。
如果你有 Ubuntu,你可能有一个 /etc/apache2 文件夹。因此,在其中创建一个名为 ssl 的文件夹。
创建你的私钥
您需要 openssl 来实现此目的,因此首先执行以下操作:
sudo apt-get install openssl
然后你就可以真正地生成你的私钥了,如下所示:
sudo openssl genrsa -des3 -out www.yourdomain.com.key 1024
它会要求您输入密码。您稍后会删除它,但现在只需输入您能记住的内容。您将在本地保存此密钥(不要将其发送给 GoDaddy)。
创建您的 CSR
这是您实际发送给 GoDaddy 以获取证书的文件:
sudo openssl req -new -key www.yourdomain.com.key -out www.yourdomain.com.csr
获取证书和中级证书
现在,您需要通过 GoDaddy(或您的证书颁发机构)的流程来获取您的证书和他们的中级证书。您将向他们发送您的 CSR 以获取这些证书。将它们放入您的 /etc/apache2/ssl 文件夹中。
从你的私钥中删除密码
此步骤是可选的,但如果您不执行此步骤,Apache 将不会在重启时自动启动(它将提示输入密码)。
sudo mv www.yourdomain.com.key www.yourdomain.com.passkey
sudo openssl rsa -in www.yourdomain.com.passkey -out www.yourdomain.com.key
为关键文件设置适当的权限
您不希望随机的人窃取您的密钥。此时,如果您在 /etc/apache2/ssl 文件夹中执行 ls -l,您应该会看到这些文件归 root 所有。现在我们只需更改权限,以便只有 root 可以读取它们:
sudo chmod 400 /etc/apache2/ssl/*
通过安装 Mods 准备 Apache
您的 Apache 安装可能没有安装 mod_ssl 或 mod_headers,因此您需要执行以下操作:
sudo a2enmod ssl
sudo a2enmod headers
在 Apache 中调整站点配置文件
假设您的网站已经可以使用 http 运行,那么您应该已经在 /etc/apache2/sites-available 下有一个配置文件(与默认配置文件相同)。编辑该文件,使其如下所示:
<VirtualHost *:443>
ServerName www.yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /var/apps/yourapp/public
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/www.yourdomain.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/www.yourdomain.com.key
SSLCertificateChainFile /etc/apache2/ssl/gd_bundle.crt
#For RoR "Mongrel"
RequestHeader set X-Forwarded-Proto "https"
#Hack for IE
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
</VirtualHost>
...您当然需要在适用的地方输入您的域名,并在其中输入您的关键文件的名称。
重启 Apache
这些更改直到您重新启动 apache 才会生效,因此请执行以下操作:
sudo /etc/init.d/apache2 restart
调整您的 Rails 应用
现在我们需要调整你的 rails 应用,使其支持 SSL。编辑 /app/controllers/application_controller.rb 并在底部添加以下内容:
def ssl_required?
true
end
如果您想要更花哨一点,您可以在那里添加一些代码来在local_request
或时返回 false RAILS_ENV == ‘test’
。
就是这样!希望这能为其他人节省一些网络搜索的时间!