如何使用Apache2和Ruby on Rails在Ubuntu上设置SSL?

在Apache2 / Ubuntu上托pipe的Ruby on Rails应用程序中,需要采取什么措施来设置SSL?

注意:我从之前错误的“社区维基”post中提出这个问题。

有一天,我的一些Rails开发人员要求在应用程序上启用SSL。

Google上有很多来源可以用Ubuntu和Apache来configurationSSL,还有一些来自Rails,还有一些来自Ubuntu / Apache / Rails,但是我找不到一个让我觉得直接和全面的东西。

因此,花了一点时间搞清楚在这个stream行configuration上使用SSL所需的步骤的确切组合后,我决定在Apache2 / Ubuntu上的Rails应用程序中创build一个ServerFault条目。

随意编辑/添加/评论根据您的经验!

对于这种情况,我们假设您从GoDaddy(不是自签名证书)获得证书,但是您可以从任何证书颁发机构获得您的证书,并且步骤应该相同。

我将使用www.yourdomain.com作为我们想要保护的示例域。

设置您的证书目录

SSL有四个与encryption有关的文件需要一个家:1)CSR(你发送给GoDaddy),2)私钥(你保存的),3)GoDaddy发送给你的实际证书,以及4)中级证书(GoDaddy会寄给你)。

如果你有Ubuntu,你可能有一个/ etc / apache2文件夹。 所以在那里创build一个名为ssl的文件夹。

创build您的私钥

你需要openssl,所以首先要做的是:

sudo apt-get install openssl 

那么你实际上是你的私钥,就像这样:

 sudo openssl genrsa -des3 -out www.yourdomain.com.key 1024 

它会要求你input密码。 稍后您将删除它,但现在只需键入您将记住的内容。 您将保留在本地的密钥(不要发送给GoDaddy)。

创build您的CSR

这是您实际发送给GoDaddy以获取您的证书的文件:

 sudo openssl req -new -key www.yourdomain.com.key -out www.yourdomain.com.csr 

获取您的证书和中级证书

现在您通过Godaddy(或您的证书颁发机构)的stream程获取证书和中间证书。 你会把他们的CSR发送给他们。 把它们放在你的/ etc / apache2 / ssl文件夹中。

从您的私钥中删除密码

这一步是可选的,但如果你不这样做,Apache不会在重启时自动启动(它会提示input密码)。

 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/* 

通过安装Mod来准备Apache

你的Apache安装可能没有安装mod_ssl或mod_headers,所以你需要做:

 sudo a2enmod ssl sudo a2enmod headers 

在Apache中调整站点configuration文件

假设你的网站已经可以使用http,你应该有一个configuration文件已经在/ 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 

如果你想变得奇怪,你可以在那里添加一些代码来返回false,如果local_requestRAILS_ENV == 'test'

而已! 希望这可以节省别人一些networking研究!