Leo Code

主页 > 服务器 > Nginx 配置 SSL 实现 https

Nginx 配置 SSL 实现 https

最近一直心痒痒想把http搞成https,查阅了一些资料,百度也已经支持了https的收录,于是抽空申请了一个SSL证书,现在地址栏已经变成https。

作为一个个人博客,也没那么高的要求,于是在寻找了一个免费的证书签发机构,弄了一个DV的SSL。下面简单介绍一下我配置SSL的过程吧,给有兴趣的朋友一些参考。


一、SSL证书的种类

目前SSL证书主要分为 DV、OV 和EV 这几种,这几种证书安全层级也是主机递增,当然,价格也是越来越高,如果是简单的个人站对加密级别和认证要求不是很高的,可以申请DV这种。DV实际上就只是对域名的所有权进行审核,然后很快速的就可以签发,但是不对申请者的身份进行核实,所以这类的证书一般都比较便宜,而且还有几家免费签发的机构。所以,我就选择了这种SSL证书。如果是电子商务类型的或者金融类型的站点,建议还是选择安全级别比较高的OV和EV,而且EV证书还可以在地址栏显示绿条,显示公司名称。

说说几家可以免费申请到SSL的机构吧:

  1. Let's Encrypt

    这个大家应该都比较熟悉,最近挺火的,优点:免费,签发快。缺点:有效期只有3个月,到期需续签。

  2. StartSSL

    国外提供免费证书签发比较早的机构之一,优点:免费,一年有效期。缺点:一年到期后,续签需重新申请,比较麻烦。

  3. 沃通

    这是一家国内的证书签发机构,我没有对该签发机构的背景做太多查阅,但是他有一个最大的优点就是申请过程全中文,而且有效期2年,可申请5个域名,官方也宣称支持所有浏览器。既然这样那就试试这家吧,免费的就不要奢求太多了,呵呵。

    申请地址:https://buy.wosign.com/free/#ssl


二、申请证书

1.打开免费申请的地址,按要求填写表单,如果没有账户的话,可以再申请的同时申请账户。

ssl.jpg

2.表单填写完成后,要求验证域名的所有权,或者验证控制权,如果能自动通过whois获取到域名所有者邮箱的话,可以通过这种方式验证,如果whois信息是加密的,可以通过下载验证文件上传到网站根目录下的方式验证。

ssl2.png

3.验证通过后,可以选择两种证书的签发方式,第一种是沃通提供给你一个证书,你直接使用(比较简单,不需在服务器生成,直接把证书放到相应位置,NGINX配置即可,比较快速)。第二种是,从服务器生成一套证书,然后递交给沃通,沃通审核后再给签发一套证书。我选的是第一种方案。

ssl3.png

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即可。


大功告成,享受你地址栏里面的绿色小锁头吧。 ^_^