2012年11月20日星期二

在 Nginx 上安装 SSL (CAcert.org) ubuntu 11.10

 

设置 ssl 可以让访客通过 443 端口 &加密方式访问你的网站。SSL是一个网络安全数据数据套接字协议 提供在网络上加密你的网络会话来传输你的信息。

对于文章的内容,我不会对其做出任何的担保。

 

前提


 

已经正确安装了nginx 而且正在运行的 , 服务器 nginx 版本 >= 0.8.21 .

 

nginx -v

 

证书方面, 这里使用开放组织 CAcerts.org 的 SSL 签名服务,  虽然现在对于该签发机构 各大浏览器貌似还没有几个加入基为默认。 但是在开源社区 对其的支持就要好得多 ,具体的 列表在这里: 点我

 

本文全程都是在root 权限下运行的.

 

虚拟主机设置


 

假设 网站的目录为  /var/www/blog/

nginx 的虚拟主机站点配置文件 在 /etc/nginx/site-enabled/

 

创建自签名证书


 

在设置SSL 虚拟主机之前,我们需要一个 SSL 证书。现在我们来制作一个自签名证书 ,关于这个证书 ,浏览器会发生警告 ,但是我们需要用这个证书来 做为 后面 CAcert 认证证书的前题。

确保 ssl-cert 已经安装

 

apt-get install ssl-cert

 

用下面的方式创建一个自签名证书

 

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/blog.crt

 

中途需要输入主机名

 

host name :  <= blog.blambin.com

 

这将会在这个文件里生成自签名证书 和 密钥    /etc/ssl/private/blog.crt

 

cat /etc/ssl/private/blog.crt

 

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDDxJqZcSPKhMhE
+AEHBfRPwgM1+k3vUDye6KZzcIg9Nnur1PqTRS/WJne2PhACOZ8wAgp+tWr9y6OR
………………………………………………………………
RvWyLl8m3qj812HYzqFYvF4CdlhABRuTa1VnwUnIN6jZIpKdEYmKsDI2Kn3u7G3V
FZ1gSqD53JK9dFPAvvV+/t6S
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICsjCCAZoCCQCSSVTOp+Jc5DANBgkqhkiG9w0BAQUFADAbMRkwFwYDVQQDExBi
bG9nLmJsYW1iaW4ub3JnMB4XDTEyMTExOTA3MjExN1oXDTIyMTExNzA3MjExN1ow
GzEZMBcGA1UEAxMQYmxvZy5ibGFtYml……………………………………………………
pykI8KOp7Rc15QiyWxmadaRKWKPpyH41uBbw4Xh8hM9kEuW2D7aG2t8RqdJYb8C8
vXKUdN+uFpX8b9JA2ObUbT8UxV4TDwFwe+yKQZn32dZPYUijdG/a/+3VwP2SG2h0
AcCu6JcfKLlwXem6S2isUEqqbOQgxg==
-----END CERTIFICATE-----


到这里,我们将文件分成两部分 ,私钥 /etc/ssl/private/blog.key 和 自签名证书 /etc/ssl/certs/blog.pem

 

vi /etc/ssl/private/blog.key

 

在里面填入我们得到以上文件 的 -----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY---- 之间的部分 (包括)如:

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDDxJqZcSPKhMhE
+AEHBfRPwgM1+k3vUDye6KZzcIg9Nnur1PqTRS/WJne2PhACOZ8wAgp+tWr9y6OR
………………………………………………………………
RvWyLl8m3qj812HYzqFYvF4CdlhABRuTa1VnwUnIN6jZIpKdEYmKsDI2Kn3u7G3V
FZ1gSqD53JK9dFPAvvV+/t6S
-----END PRIVATE KEY-----


密钥必须设置为只有管理员才有权限访问

 

chmod 600 /etc/ssl/private/blog.key

 

同样 ,创建文件 blog.pem

 

vi /etc/ssl/certs/blog.pem

 

在里面填入得到的文件的下半部分 , -----BEGIN RSA PRIVATE KEY----- 跟 -----END RSA PRIVATE KEY----- 之间

-----BEGIN CERTIFICATE-----
MIICsjCCAZoCCQCSSVTOp+Jc5DANBgkqhkiG9w0BAQUFADAbMRkwFwYDVQQDExBi
bG9nLmJsYW1iaW4ub3JnMB4XDTEyMTExOTA3MjExN1oXDTIyMTExNzA3MjExN1ow
GzEZMBcGA1UEAxMQYmxvZy5ibGFtYml……………………………………………………
pykI8KOp7Rc15QiyWxmadaRKWKPpyH41uBbw4Xh8hM9kEuW2D7aG2t8RqdJYb8C8
vXKUdN+uFpX8b9JA2ObUbT8UxV4TDwFwe+yKQZn32dZPYUijdG/a/+3VwP2SG2h0
AcCu6JcfKLlwXem6S2isUEqqbOQgxg==
-----END CERTIFICATE-----


现在我们就可以把 /etc/ssl/private/blog.crt 删除了 。

rm -f /etc/ssl/private/blog.crt

 

-----------------------------------------------------------------------长长的分割线-----------------------------------------------------------

 

SSL 虚拟主机设置


 

下一步就是需要把 ssl 添加到 虚拟站点是去了

打开站点配置文件

 

vi /etc/nginx/site-enabled/blog

 

在  server {     和      } 之间 添加

 

listen 443 ssl;
listen [::]:443 ipv6only=on ssl;
ssl_certificate /etc/ssl/certs/blog.pem;
ssl_certificate_key /etc/ssl/private/blog.key;


或者

listen 443 ;
listen [::]:443 ipv6only=on ;


ssl on;
ssl_certificate /etc/ssl/certs/blog.pem;
ssl_certificate_key /etc/ssl/private/blog.key;


 

完成之后重启 nginx :

 

/etc/init.d/nginx reload

 

这个时候 用 ssl  方式打开 你的网站 会发现 警告 ,暂时先忽略掉。

 



 

创建一个证书签名请求


 

想要在 CAcert 上请求一个签名证书 ,我们必须从我们生成的私钥生成的证书签名请求 (CSR)拿到 CAcerts 上重新生成一个受认证的证书,用以替换我们的自签名证书。

创建一个新的工作目录 /etc/ssl/csr

 

mkdir /etc/ssl/csr

 

现在我们从我们的私钥里生成一个新的CSR

 

openssl req -new -key /etc/ssl/private/blog.key -out /etc/ssl/csr/blog.csr

 

接下来会要球你回答一些问题,需要注意的是 Common Name 字段 必须填上你的域名信息

 

Common Name (eg, YOUR name) [ ]: <-- blog.blambin.org
之后 将会生成一个 csr 文件

 

cat /etc/ssl/csr/blog.csr

 

获取受信认的证书


 

到 Cacert.org 上注册一个帐号 , 然后在右加的栏目 (Domains)里添加你的域名然后 还是到邮箱里认证它 。

 



 

要得到一个证书 ,点选  Server Certificates > New

然后把上一小节的内容粘贴到里面

 

-----BEGIN CERTIFICATE REQUEST-----
MIIC8jCCAdoCAQAwgZUxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdHdWFuZ3hpMQ8w
DQYDVQQHDAZZaXpob3UxEDAOBgNVBAoMB2JsYW1iaW4xEDAOBgNVBAsMB2JsYW1i
aW4xGTAXBgNVBAMM…………………………………………………………………………
wJ6yXyw19ydcH7FwDft5ovlosWiSA+HEdqZpbEkf7pDkdCNgLVg=
-----END CERTIFICATE REQUEST-----


 

点 Submit ,过一会就会生成证书内容啦

 



然后备份本地的 pem 文件 为pem_bak,再清空 pem 文件

 

cp /etc/ssl/certs/blog.pem /etc/ssl/certs/blog.pem_bak

 

清空

 

> /etc/ssl/certs/blog.pem

 

用上面网页上得到的证书填充

 

vi /etc/ssl/certs/blog.pem

 

重启 nginx :

 

/etc/init.d/nginx reload

 

这样下来 ssl 已经装好了 如果firefox 没有问你要认证的话。 有可能你还需要自行添加 CAcert 的根证书。