Nginx 配置 SSL 实现 https
最近一直心痒痒想把http搞成https,查阅了一些资料,百度也已经支持了https的收录,于是抽空申请了一个SSL证书,现在地址栏已经变成https。
作为一个个人博客,也没那么高的要求,于是在寻找了一个免费的证书签发机构,弄了一个DV的SSL。下面简单介绍一下我配置SSL的过程吧,给有兴趣的朋友一些参考。
一、SSL证书的种类
目前SSL证书主要分为 DV、OV 和EV 这几种,这几种证书安全层级也是主机递增,当然,价格也是越来越高,如果是简单的个人站对加密级别和认证要求不是很高的,可以申请DV这种。DV实际上就只是对域名的所有权进行审核,然后很快速的就可以签发,但是不对申请者的身份进行核实,所以这类的证书一般都比较便宜,而且还有几家免费签发的机构。所以,我就选择了这种SSL证书。如果是电子商务类型的或者金融类型的站点,建议还是选择安全级别比较高的OV和EV,而且EV证书还可以在地址栏显示绿条,显示公司名称。
说说几家可以免费申请到SSL的机构吧:
Let's Encrypt
这个大家应该都比较熟悉,最近挺火的,优点:免费,签发快。缺点:有效期只有3个月,到期需续签。
StartSSL
国外提供免费证书签发比较早的机构之一,优点:免费,一年有效期。缺点:一年到期后,续签需重新申请,比较麻烦。
沃通
这是一家国内的证书签发机构,我没有对该签发机构的背景做太多查阅,但是他有一个最大的优点就是申请过程全中文,而且有效期2年,可申请5个域名,官方也宣称支持所有浏览器。既然这样那就试试这家吧,免费的就不要奢求太多了,呵呵。
申请地址:https://buy.wosign.com/free/#ssl
二、申请证书
1.打开免费申请的地址,按要求填写表单,如果没有账户的话,可以再申请的同时申请账户。
2.表单填写完成后,要求验证域名的所有权,或者验证控制权,如果能自动通过whois获取到域名所有者邮箱的话,可以通过这种方式验证,如果whois信息是加密的,可以通过下载验证文件上传到网站根目录下的方式验证。
3.验证通过后,可以选择两种证书的签发方式,第一种是沃通提供给你一个证书,你直接使用(比较简单,不需在服务器生成,直接把证书放到相应位置,NGINX配置即可,比较快速)。第二种是,从服务器生成一套证书,然后递交给沃通,沃通审核后再给签发一套证书。我选的是第一种方案。
4.如果是选择的第二套方案的话,需要服务器生成一套证书命令如下:
openssl req -new -newkey rsa:2048 -sha256 -nodes -out example_com.csr -keyout example_com.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Inc./OU=Web Security/CN=example.com"
参数说明:
域名,也称为 Common Name,因为特殊的证书不一定是域名:example.com
组织或公司名字(Organization):Example, Inc.
部门(Department):可以不填写,这里我们写 Web Security
城市(City):Beijing
省份(State / Province):Beijing
国家(Country):CN
完成上述命令后,会在当前目录生成两个文件:example_com.csr 和 example_com.key
这个csr文件就是提供给签发机构的,然后,签发机构会通过这个文件,给你签发一套证书crt文件。之后要用到的就是crt和key文件。
OK,证书申请的过程就写到这里了。
三、Nginx配置SSL证书的过程
打开nginx的配置文件修改server部分
server { listen 443 ssl; server_name example.com; ssl on; ssl_certificate /etc/ssl/private/example_com.crt; ssl_certificate_key /etc/ssl/private/example_com.key; ... }
其中的crt和key文件就是之前提到的签发机构提供给的两个文件。
其实到这里,你重启nginx就可以实现https访问了,但是这是较为不安全的而且也是已经被淘汰的sha-1加密方式,这种形式的SSL,在访问的时候,浏览器可能会提示为不安全的站点。我们接下来就是要把它改成sha-2的加密方式。
cd /etc/ssl/certs
进入这个目录继续执行
openssl dhparam -out dhparam.pem 2048
根据服务器的配置,这个过程有点长,会生成一个dhparam.pem文件。接下来继续配置nginx
server { listen 443 ssl; server_name example.com; ssl on; ssl_certificate /etc/ssl/private/example_com.crt; ssl_certificate_key /etc/ssl/private/example_com.key; # 新加入部分 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的80端口,我们还需做个301跳转,让他们直接到https的地址。
server { listen 80; server_name example.com; return 301 https://example.com$request_uri; }
把这段server加到刚刚的那段代码下面即可。
2016年3月14日追加:
有的时候您申请的crt证书不是一级证书,可能会是三甚至四级证书,服务商会提供给你办法多个证书,需要串联这些证书,命令如下:
cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com.signed.crt
然后把最后的example_com.signed.crt文件,配置到nginx,替换example_com.crt即可。
大功告成,享受你地址栏里面的绿色小锁头吧。 ^_^