所在位置:

给自己的网站添加一个免费https

SSL证书需要向国际公认的证书证书认证机构(简称CA,Certificate Authority)申请。CA机构颁发的证书有3种类型:

  1. 域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;
  2. 企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;
  3. 增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。

对于一般的个人网站或者对于安全不是很高的企业站来说,域名型SSL证书(DV SSL)已经够用了,在这里,我们选用免费的 Let's Encrypt,下面来说一下 Let's Encrypt 的 DV 证书的安装过程,整个操作都是用 管理员权限

创建Let's Encrypt私钥

我们要生成一个Let's Encrypt私钥,因为下面我们生成证书的时候要用到这个私钥的,可以用 openssl 来生成 account.key 私钥

mkdir -p /etc/ssl/mywebsite
cd /etc/ssl/mywebsite
openssl genrsa 4096 > account.key

创建域名的CSR(证书签名请求)

下面生成证书的时候也需要一个CSR文件,在创建CSR文件之前,用下面的命令给我们的域名创建一个私钥

cd /etc/ssl/mywebsite
openssl genrsa 4096 > domain.key

下面根据域名生成CSR

# 单个域名
cd /etc/ssl/mywebsite
openssl req -new -sha256 -key domain.key -subj "/CN=52gvim.com" > domain.csr
# 多个域名
cd /etc/ssl/mywebsite
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:52gvim.com,DNS:www.52gvim.com")) > domain.csr

配置域名验证

域名的验证主要是验证这个域名是不是属于你的,怎么确定这个是不是属于你的?Let's Encrypt会在指定的目录里随机生成一个文件, 如果能够通过CSR创建的指定域名去访问指定目录随机文件的话,那这个域名就是属于你的,现在先创建一个指定的目录:

mkdir -p /var/www/challenges

再配置一下能够访问的域名

server {
        listen                                  80;
        server_name                     www.52gvim.com 52gvim.com;

        # 增加这部分
        location ^~ /.well-known/acme-challenge/ {
                alias /var/www/challenges/;
                try_files $uri =404;
        }
        # 结束

        location /static/ {
                alias  /home/project/static/;
        }

        location / {
                proxy_pass http://127.0.0.1:9090;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

获取签名证书

cd /etc/ssl/mywebsite
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt

如果成功的话,会在当前目录生成一个 signed.crt 文件,这个文件就是证书

注意:如果操作失败了,要检查一下 /etc/hosts 文件里有没有把域名配置到 其它ip 了,或者上网找一下相关的内容

配置 DHE

使用openssl命令生成一个强壮的DH组

cd /etc/ssl/mywebsite
openssl dhparam -out dhparams.pem 2048

安装证书

把中间证书和网站的证书整合在一起:

cd /etc/ssl/mywebsite
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

注意:这里不能用 lets-encrypt-x1-cross-signed.pem,不然,后面的定时更新证书会一直生成不了 signed.crt 文件

下一步就是配置 nginx,把整合的证书和域名的私钥配置到 nginx 里, 完成要记得 重新一下nginx服务器

server {
        listen                                  80;
        server_name                     www.52gvim.com 52gvim.com;

        rewrite ^/(.*) https://www.52gvim.com/$1 permanent;
}


server {
        listen 443;
        server_name www.52gvim.com 52gvim.com;

        ssl on;
        # 启用HSTS
        add_header Strict-Transport-Security "max-age=31536000;includeSubDomains";
        add_header X-Frame-Options DENY;
        ssl_certificate /etc/ssl/mywebsite/chained.pem;
        ssl_dhparam /etc/ssl/mywebsite/dhparams.pem;
        ssl_certificate_key /etc/ssl/mywebsite/domain.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
        ssl_session_cache shared:SSL:50m;
        ssl_prefer_server_ciphers on;

        location ^~ /.well-known/acme-challenge/ {
                alias /var/www/challenges/;
                try_files $uri =404;
        }

        location /static/ {
                alias  /home/project/static/;
        }
        
        location / {
                proxy_pass http://127.0.0.1:9090;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

定时更新证书

Let's Encrypt的免费证书只有3个月的期限,但是可以用脚本自己更新,下面是操作步骤:

在用户的目录 /home/test 新建一个 update_cert.sh,内容如下:

#!/usr/bin/sh
python /etc/ssl/mywebsite/acme_tiny.py --account-key /etc/ssl/mywebsite/account.key --csr /etc/ssl/mywebsite/domain.csr --acme-dir /var/www/challenges/ > /tmp/signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat /tmp/signed.crt intermediate.pem > /etc/ssl/mywebsite/chained.pem
systemctl restart nginx

开时定时器,修改crontab配置,加入以下内容:

# 每个月执行一次
0 0 1 * * /home/test/update_cert.sh 2>> /var/log/acme.log

测试网站

可以到 https://www.ssllabs.com/ssltest/index.html 去查看网站的安全性

参考网站

【上一篇】父子漫画

【下一篇】广马前的训练