0%

免费的SSL证书

Let’s Encrypt是一个公共且免费的SSL项目。SSL,英文全称Secure Sockets Layer,为Netscape所研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)的技术,可确保数据在网络上的传输过程中不会被截取及窃听。简单的说,就是使用SSL加密http,来保证网站安全性和防止信息泄露。

安装 certbot获取证书

注意:安装证书之前要保证网站能通过http域名访问,不然申请过程会报错。

yum install certbot
certbot certonly --webroot -w /var/test/ralap -d ralap.net -d www.ralap.net

/var/test/ralap为网站根目录,后面跟多个域名。根据提示输入邮箱等确认信息。

Let’s Encrypt证书的生成之后,在“/etc/letsencrypt/live/ralap/”域名目录下有4个密钥证书相关文件,我们需要配置其中两个到nginx。

fullchain.pem - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件

安装certbot可能报错,可以在网上找到解决方法。

ImportError: No module named 'requests.packages.urllib3'

解决方法:

pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3

修改nginx配置

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  www.ralap.net ralap.net;
    root         /var/test/ralap;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    #增加的部分
    location / {
        rewrite ^(.*) https://$host$1 permanent;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

# Settings for a TLS enabled server.
server {
    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
    server_name  www.ralap.net ralap.net;
    root         /var/test/ralap;

    ssl_certificate "/etc/letsencrypt/live/ralap.net/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/ralap.net/privkey.pem";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    ssl_prefer_server_ciphers on;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    
    #增加的部分
    location ~ /.well-known {
        allow all;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

在原来http的server中修改

#将http的连接重定向到https
location / {
    rewrite ^(.*) https://$host$1 permanent;
}

在https的server中修改

ssl_certificate "/etc/letsencrypt/live/ralap.net/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/ralap.net/privkey.pem";

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 

location ~ /.well-known {
    allow all;
}

重新启动nginx

systemctl restart nginx

再打开网站就可以看到网站是加密过的了。

证书自动续期

Let’s Encrypt的证书只有3个月有效期,可以设置任务自动续期。

crontab -e

crontab执行时可能会报错,继续执行就可以了。

在打开的文件中输入

30 4 * * 1 certbot renew --renew-hook "systemctl restart nginx" --quiet > /dev/null 2>&1 &

设置了每周一凌晨4点30自动更新证书,如果更新成功就自动重启nginx服务,证书在到期前30天内才能更新,多余的更新会自动忽略掉的,每周更新还有一个好处是更新可能会失败,这样最多还有4次的尝试机会来保证不会过期。

参考:永久免费的SSL证书 - Let’s Encrypt 证书部署 HTTPS 并自动续