为你的网站配置SSL证书

背景

看着别人的博客/网站一般都支持https协议,看着自己的域名在微信上面每次点击就弹出安全提示,心理有点不平衡了.

自己给站点开启HTTPS吧!而且之前没做过,可以实践一次.

我的运行环境

  • 操作系统: Linux Debian 9
  • Web服务器: Nginx
  • 证书生成工具: Certbot(Let's Encrypt官方推荐)
  • 定时任务: crontab
  • 远程登录: ssh

NOTE: Let's Encrypt的证书有效期是90天,幸运的是一旦过期可以重新获取

需要的文档

步骤

  1. 在服务器上面安装certbot,输入指令
    apt-get update && apt-get install certbot
  2. 选择插件类型(这里是standalone,你可以选择nginx来进行操作,我是选错了,不过没关系)获取证书,

    certbot certonly –standalone -d darksalt.me -d www.darksalt.me
    其中 -d 指定的是想要开启HTTPS的服务器域名,可以多个 -d 指定.如果生成类似如下信息的话就证明成功

    IMPORTANT NOTES:
    - If you lose your account credentials, you can recover through
    e-mails sent to licess@vpser.net.
    - Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/darksalt.me/fullchain.pem. Your cert will
    expire on 2017-XX-XX. To obtain a new version of the certificate in
    the future, simply run Let's Encrypt again.
    - Your account credentials have been saved in your Let's Encrypt
    configuration directory at /etc/letsencrypt. You should make a
    secure backup of this folder now. This configuration directory will
    also contain certificates and private keys obtained by Let's
    Encrypt so making regular backups of this folder is ideal.
    - If like Let's Encrypt, please consider supporting our work by:
    
    Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le
    
  3. 可以 生成的证书的相关说明 中找到你的证书位置,我这里的就是/etc/letsencrypt/live/darksalt.me下面
  4. 根据 生成的证书的相关说明 关于证书密钥的说明和 Nginx配置HTTPS的说明 可以得出以下的配置

    # 本文件路径 /etc/nginx/sites-avaliable/default,内容如下
    server {
        listen 80;
        listen [::]:80;
        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /etc/letsencrypt/live/darksalt.me/fullchain.pem;
        # 指定证书位置
        ssl_certificate_key /etc/letsencrypt/live/darksalt.me/privkey.pem;
        # 指定证书私有密钥位置
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        # 指定SSL的协议,这个值是默认的,可以不用设置
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        # [[https://en.wikipedia.org/wiki/Cipher]]Ciphers指加密的算法,指定用什么加密算法.有默认值,这里我还是跟着别人copy了一下
        # `ssl_protocols' 和 `ssl_ciphers' 可以用来限制链接的SSL/TLS的版本和加密算法
        ssl_session_cache shared:SSL:10m;
        # Nginx workpers 之间共享SSL session的时间长度
        root /home/saltb0rn/site;
        index index.html;
        server_name darksalt.me www.darksalt.me;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    
  5. 重启Nginx
    nginx -s reload
  6. 自动更新证书,用crontab来实现,在/etc/crontab底部中加入一行

    0 0 1 * * root certbot renew
    这样证书就会每一个月的一号尝试地更新更新一次.

    Updated at 2018-5-29: 因为Nginx占用443端口的缘故,直接更新会失败,所以要先关闭Nginx然后更新,最后启动Nginx

    0 0 1 * * root service nginx stop && certbot renew && service nginx start

    Updated at 2018-9-7: 最好不要直接在/etc/crontab下面加入命令,直接用 crontab -e 新增用户级任务,新增后可以 crontab -l 查看和用 crontab -r 删除.

    Updated at 2019-6-8: acme.h 的工具也可以获得证书,并且可以自动完成上面所有的工作,更加方便使用,具体浏览官方文档.

引用

Author: saltb0rn (asche34@outlook.com)

Date: 2017-11-09

Emacs 28.2 (Org mode 9.5.5)

Validate