创建并部署自签名的 SSL 证书到 Nginx

自签名的 SSL 证书(self-signed SSL certificate),就是未经过权威第三方认证的 SSL 证书,常常用作测试 https 连接之用。当用户访问使用这种 SSL 证书的网站时,往往会被提示“该网站的 SSL 证书未被认证!”。使用 CloudFlare 的 CDN 加速可以解决这个问题,CloudFlare 可以将你的网站的内容缓存到其分布全球的 CDN 节点上,而当用户访问你的网站时,CloudFlare 会将已经缓存的网站内容以 https 的传输方式发送到用户的浏览器,这时使用的 SSL 证书是 CloudFlare 的 SSL 证书,是经过第三方权威认证的证书。而 CloudFlare 抓取你的网站内容时并不会验证你的网站 SSL 证书是否经过权威第三方认证。这对于那些对于 SSL 证书不是特别了解仅仅是想做一些尝试的人来说是一个不错的选择。

创建自签名 SSL 证书

创建自签名的 SSL 证书需要用到 openssl,在 Windows,Mac OS X,以及 Linux 平台上都可以安装使用 openssl,在这里以 Linux 系统为例,一般来说 openssl 被默认安装在各大 Linux 发行版当中。

首先,确认系统中安装了 openssl:

which openssl

如果系统中已经安装了 openssl,当执行这条命令后,终端会返回一条 openssl 命令的路径,如果提示未安装,可以使用系统中安装的包管理软件来安装。对于 Ubuntu 系统:

sudo apt-get install openssl

接下来,我们先生成一个名为“ssl.key”的 RSA key文件:

openssl genrsa -des3 -passout pass:x -out ssl.pass.key 2048
openssl rsa -passin pass:x -in ssl.pass.key -out ssl.key

执行完这两条命令后,当前目录下应该新增了两个文件:ssl.pass.key 和 ssl.key,ssl.pass.key 是为了生成 ssl.key 产生的中间文件,此时已经不再被需要,可以删除:

rm ssl.pass.key

接着,利用已经生成的 ssl.key 文件,进一步生成 ssl.csr 文件:

openssl req -new -key ssl.key -out ssl.csr

执行此行命令会提示输入密码,按回车即可,因为前面我们在生成 ssl.key 时选择了密码留空。

最后我们利用前面生成的 ssl.key 和 ssl.csr 文件来生成 ssl.crt 文件,也就是自签名的 SSL 证书文件:

openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt

这一步之后,我们得到一个自签名的 SSL 证书文件 ssl.crt,有效期为 365 天。此时,ssl.csr 文件也已经不再被需要,可以删除掉了:

rm ssl.csr

部署自签名的 SSL 证书到 Nginx

在这里我们仍然假设 Nginx 服务器运行在 Linux 系统之上。我们在 /etc/nginx 目录下创建 ssl 文件夹用以保存相关 SSL 证书文件:

sudo mkdir /etc/nginx/ssl

通过 FTP 或者 SFTP 等协议将我们在本地生成的 ssl.key 和 ssl.crt 文件上传到 /etc/nginx/ssl 目录下(我们也可以直接在 Nginx 运行的服务器上进行上一步生成 SSL 证书的操作,这样就省去了从本地上传到服务器的操作)。修改对应 Nginx 中网站的配置文件,如下:

server {
 listen 80;
 server_name 你的域名;
 return 301 https://$server_name$request_uri;
}
server {
 listen 443 ssl spdy;
 server_name 你的域名;
 ssl_certificate /etc/nginx/ssl/ssl.crt;
 ssl_certificate_key /etc/nginx/ssl/ssl.key;
 ssl_session_cache shared:SSL:20m;
 ssl_session_timeout 60m;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 #其他配置内容
}

其中第四行 return 301 https://$server\_name$request\_uri; 是将所有指向该网站的 http 链接自动重定向到 https 链接,从而避免了 404 错误。

配置文件修改完毕后,重启 Nginx 服务:

service nginx restart

此时,直接使用 https 协议访问你的网站时会提示“网站证书不被信任”错误。别忘了开启 CloudFlare 的 CDN 服务,并在 CloudFlare 后台开启 SSL 功能。