Nginx 安装SSL证书步骤

发布于 2015-10-19 作者 [重庆SEO]

更新于 2015-10-25

我之前使用过wosign免费DV证书,也使用过comodo免费和付费DV证书,之前wosign可以一次性免费使用3年,现在只能免费1年了,不过现在3年也才3.98美元,换成人民币25元左右,比comodo的似乎还便宜一些。以下是SSL证书相关知识以及SEONOCO的SSL主要配置过程。你可以访问https://seonoco.com试试,浏览器地址栏有个小锁。

一、HTTPS 是什么?

可以查看维基百科了解。

二、使用 OpenSSL 生成 SSL Key 和 CSR

由于只有浏览器或者系统信赖的 CA 才可以让所有的访问者通畅的访问你的加密网站,而不是出现证书错误的提示。所以我们跳过自签证书的步骤,直接开始签署第三方可信任的 SSL 证书吧。

同时,普通的 SSL 证书认证分两种形式,一种是 DV(Domain Validated),还有一种是 OV (Organization Validated),前者只需要验证域名,后者需要验证你的组织或公司,在安全性方面,肯定是后者要好。当然价格相差还是比较多的。

无论你用 DV 还是 OV 生成私钥,都需要填写一些基本信息,这里我们假设如下, 本例以seonoco.com为例,请根据实际情况更换为自己相应信息:

你可以在系统的任何地方运行这个命令,会自动在当前目录生成seonoco.com.csr和seonoco.com.key这两个文件,使用 OpenSSL 生成 key 和 csr 的命令如下

# openssl req -new -newkey rsa:2048 -nodes -keyout seonoco.com.key -out seonoco.com.csr
Generating a 2048 bit RSA private key
..+++
...........................................+++
writing new private key to 'seonoco.com.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Chongqing
Locality Name (eg, city) [Default City]:Chongqing
Organization Name (eg, company) [Default Company Ltd]:SEONOCO
Organizational Unit Name (eg, section) []:SEONOCO
Common Name (eg, your name or your server's hostname) []:*.seonoco.com //泛域名证书
Email Address []:[email protected] Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []://不输入直接回车
An optional company name []://不输入直接回车 

查看CSR文件内容, 这个 CSR 文件就是你需要提交给 SSL 认证机构的,当你的域名或组织通过验证后,认证机构就会颁发给你一个seonoco.com.crt

而seonoco.com.key是需要用在 Nginx 配置里和seonoco.com.crt配合使用的,需要好好保管,千万别泄露给任何第三方。

# cat seonoco.com.csr 
-----BEGIN CERTIFICATE REQUEST-----
MIIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX seonoco.com XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX+02D8A==
-----END CERTIFICATE REQUEST----- 

站长使用的是wosign证书,在后台根据提示验证域名和提交CSR后,很快就生成了证书并下载到服务器进行稍后的配置。

三、Nginx 配置 HTTPS 网站以及增加安全的配置

前面已经提到,你需要提交 CSR 文件给第三方 SSL 认证机构,通过认证后,他们会颁发给你一个 CRT 文件,我们命名为example_com.crt

同时,为了统一,你可以把这三个文件都移动到/etc/ssl/private/目录。

然后可以修改 Nginx 配置文件

server { 
 listen 80;
 listen [::]:80 ssl ipv6only=on; 
 listen 443 ssl;
 listen [::]:443 ssl ipv6only=on;
 server_name seonoco.com www.seonoco.com;

 ssl on;
 ssl_certificate /etc/ssl/private/seonoco.com.crt;
 ssl_certificate_key /etc/ssl/private/seonoco.com.key;
} 

检测配置文件没问题后重新读取 Nginx 即可,这里基本上就完成了,后面只是扩展知识。

nginx -t && nginx -s reload 

但是这么做并不安全,默认是 SHA-1 形式,而现在主流的方案应该都避免 SHA-1,为了确保更强的安全性,我们可以采取迪菲-赫尔曼密钥交换

首先,进入/etc/ssl/certs目录并生成一个dhparam.pem

cd /etc/ssl/certs 
openssl dhparam -out dhparam.pem 2048 # 如果你的机器性能足够强大,可以用 4096 位加密 生成完毕后,在 Nginx 的 SSL 配置后面加入 
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m; 

同时,如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问

add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff; 

同时也可以单独开一个 Nginx 配置,把 HTTP 的访问请求都用 301 跳转到 HTTPS

server { 
 listen 80;
 listen [::]:80 ssl ipv6only=on;
 server_name seonoco.com;
 return 301 https://seonoco.com$request_uri;
} 

四、可靠的第三方 SSL 签发机构

众所周知,前段时间某 NIC 机构爆出过针对 Google 域名的证书签发的丑闻,所以可见选择一家靠谱的第三方 SSL 签发机构是多么的重要。

目前一般市面上针对中小站长和企业的 SSL 证书颁发机构有:

StartSSL

Comodo / 子品牌 Positive SSL

GlobalSign / 子品牌 AlphaSSL

GeoTrust / 子品牌 RapidSSL

五、针对企业的 EV SSL

EV SSL,是 Extended Validation 的简称,更注重于对企业网站的安全保护以及严格的认证。

最明显的区别就是,通常 EV SSL 显示都是绿色的条。


参考与扩展阅读

[1] https://s.how/nginx-ssl/