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

環(huán)境說明

  • 域名為萬網注冊域名
  • 服務器Ubuntu 16.04

通過acme.sh方式獲取證書

  • 獲取acme.sh
curl https://get.acme.sh | sh
acme.sh
  • 如果acme.sh 命令未找到
source ~/.bashrc
# zsh 下
source ~/.zshrc
  • 申請簽發(fā) 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環(huán)境下報 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 有自動的配置讀取,并按域名劃分,下次你再次執(zhí)行的時候,它知道你之前是用的那個目錄,只需要告訴它域名就好了。

  • 安裝證書

    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 以上,否則根據提示調整問題

  • 一些注意事項
    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-;*
    如果你需要兼容老系統(tǒng)或老瀏覽器的話,你需要配置 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

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容