acme.sh + Let's Encrypt + nginx 配置通配符HTTPS

环境说明

  • 域名为万网注册域名
  • 服务器Ubuntu 16.04

通过acme.sh方式获取证书

  • 获取acme.sh
curl https://get.acme.sh | sh
acme.sh
  • 如果acme.sh 命令未找到
source ~/.bashrc
# zsh 下
source ~/.zshrc
  • 申请签发 SSL 证书
    acme.sh强大之处在于,可以自动配置DNS,不用去域名后台操作解析记录了。下面以万网域名的操作为例

    # 替换成从阿里云后台获取的密钥
    export Ali_Key="xxx"
    export Ali_Secret="xxxxxxxx"
    # 换成自己的域名
    acme.sh --issue --dns dns_ali -d xxx.com -d *.xxx.com
    

    获取Ali_Key 和 Ali_Secret的方法
    其他地方注册的请参考这里
    如果在zsh环境下报 zsh: no matches found: *.xxx.com 的错误

    vim ~/.zshrc
    # 在文件上追加 setopt no_nomatch
    source ~/.zshrc
    

    证书申请成功之后会出现如下的信息

    [Mon Apr 30 15:35:14 CST 2018] Your cert is in  /root/.acme.sh/xxx.com/xxx.com.cer
    [Mon Apr 30 15:35:14 CST 2018] Your cert key is in  /root/.acme.sh/xxx.com/xxx.com.key
    [Mon Apr 30 15:35:14 CST 2018] The intermediate CA cert is in  /root/.acme.sh/xxx.com/ca.cer
    [Mon Apr 30 15:35:14 CST 2018] And the full chain certs is there:  /root/.acme.sh/xxx.com/fullchain.cer
    

    申请的证书会放到 ~/.acme.sh/ 目录里面,所有的 acme.sh 配置都记录在 ~/.acme.sh/ 目录里面,acme.sh 有自动的配置读取,并按域名划分,下次你再次执行的时候,它知道你之前是用的那个目录,只需要告诉它域名就好了。

  • 安装证书

    acme.sh --installcert -d xxx.com \
                 --keypath       /data/nginx/ssl/xxx.com.key  \
                 --fullchainpath /data/nginx/ssl/xxx.com.key.pem \
                 --reloadcmd     "/data/nginx/sbin/nginx -s reload"
    # /data/nginx/ssl/ 是证书安装目录
    # reloadcmd 是nginx 的reload 命令
    

    这个比较重要,因为它会让 acme.sh 记住重启 Nginx 的命令,以后自动更新证书的动作需要重启 Nginx,然后你会看到结果

    [Mon Apr 30 16:19:32 CST 2018] Installing key to:/data/nginx/ssl/xxx.com.key
    [Mon Apr 30 16:19:32 CST 2018] Installing full chain to:/data/nginx/ssl/xxx.com.key.pem
    [Mon Apr 30 16:19:32 CST 2018] Run reload cmd: /data/nginx/sbin/nginx -s reload
    [Mon Apr 30 16:19:32 CST 2018] Reload success
    
  • 配置nginx
    生成 dhparam.pem 文件

    openssl dhparam -out /data/nginx/ssl/dhparam.pem 2048
    

    修改 Nginx 启用 SSL

    http {
      # 新增
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
      # 兼容其他老浏览器的 ssl_ciphers 设置请访问 https://wiki.mozilla.org/Security/Server_Side_TLS
    
      server {
        listen 80 default_server;
        # 新增
        listen 443 ssl;
        ssl_certificate         /data/nginx/ssl/www.xxx.com.key.pem;
        ssl_certificate_key     /data/nginx/ssl/www.xxx.com.key;
        # ssl_dhparam 
        ssl_dhparam             /data/nginx/ssl/dhparam.pem;
    
        # 其他省略
      }
    }
    

    检查 Nginx 配置是否正确后重启

    /data/nginx/sbin/nginx -t
    # 检查无误后,重启nginx
    /data/nginx/sbin/nginx -s reload
    
  • 验证 SSL
    访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常:
    https://ssllabs.com/ssltest/analyze.html?d=xxx.com
    确保验证结果有 A 以上,否则根据提示调整问题

    acme.sh + Let's Encrypt + nginx 配置通配符HTTPS_第1张图片

  • 一些注意事项
    ssl_dhparam 未配置,将导致 ssllabs.com 的评分降到 B,并给 This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B. 的警告。
    ssl_prefer_server_ciphers on 也是一个必要的配置,否则会 A+ 变成 A-;*
    如果你需要兼容老系统或老浏览器的话,你需要配置 ssl_ciphers,详见 Mozilla Server_Side_TLS 的介绍,Nginx 里面 ssl_ciphers 默认值是 HIGH:!aNULL:!MD5; ref

  • 参考
    https://github.com/Neilpang/acme.sh
    https://my.oschina.net/kimver/blog/1634575
    https://ruby-china.org/topics/31983

你可能感兴趣的:(acme.sh + Let's Encrypt + nginx 配置通配符HTTPS)