Let's Encrypt之acme.sh

山本美月

前言

Let’s Encrypt 是一個證書頒發機構(CA)。是由互聯網安全研究小組(ISRG,Internet Security Research Group)主導並開發的一個新型數字證書認證機構(CA,Certificate Authority)。該項目旨在開發一個自由且開放的自動化 CA 套件,並向公衆提供相關的證書免費簽發服務以下降安全通信的財務、技術和教育成本。html

互聯網安全研究小組擬定了 ACME 協議。nginx

說到 ACME 協議,咱們不得不提一下傳統 CA 的認證方式。git

Let's Encrypt 服務所簽發的證書爲域名認證證書(DV,Domain-validated Certificate),簽發這類證書須要域名全部者完成如下至少一種挑戰Challenge以證實本身對域名的全部權:github

  • 驗證申請人對域名的 Whois 信息中郵箱的控制權;
  • 驗證申請人對域名的常見管理員郵箱(如以 admin@、postmaster@ 開頭的郵箱等)的控制權;
  • 在 DNS 的 TXT 記錄中發佈一條 CA 提供的字符串;
  • 在包含域名的網址中特定路徑發佈一條 CA 提供的字符串。

不難發現,其中最容易實現自動化的一種操做必然爲最後一條,ACME 協議中的 Simple HTTP 認證便是用一種相似的方法對從未簽發過任何證書的域名進行認證。該協議要求在訪問 http://域名/.well-known/acme-challenge/指定字符串 時返回特定的字符串。web

acme.sh實現了 acme 協議, 能夠從 letsencrypt 生成免費的證書.apache

acme.sh純用Shell(Unix外殼)語言編寫的ACME協議客戶端。支持ACME v1/ACME v2和ACME v2通配符證書api

安裝acme.sh

  • 普通安裝安全

    安裝很簡單, 一個命令(普通用戶和 root 用戶均可以安裝使用):服務器

    $ curl  https://get.acme.sh | sh
      $ alias acme.sh=~/.acme.sh/acme.sh
  • 高級安裝(可選)dom

    $ git clone https://github.com/Neilpang/acme.sh.git
      $ cd acme.sh
      $ ./acme.sh --install \
      --home ~/myacme \
      --config-home ~/myacme/data \
      --cert-home  ~/mycerts \
      --accountemail  "my@example.com" \
      --accountkey  ~/myaccount.key \
      --accountconf ~/myaccount.conf \
      --useragent  "this is my client."

經常使用的簽名方式

acme.sh 實現了 acme 協議支持的全部驗證協議.

更多範例請訪問: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert

下面是經常使用的兩種

  1. http方式

    • Webroot mode

      須要在你的網站根目錄下放置一個文件, 來驗證你的域名全部權,完成驗證. 而後就能夠生成證書了.

      $ acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

      只須要指定域名, 並指定域名所在的網站根目錄. acme.sh 會全自動的生成驗證文件, 並放到網站的根目錄, 而後自動完成驗證. 最後會聰明的刪除驗證文件. 整個過程沒有任何反作用.

    • Nginx/apache mode

      若是你用的 apache/nginx服務器, acme.sh 還能夠智能的從配置中自動完成驗證, 你不須要指定網站根目錄:

      Apache

      若是您的網站運行的是apache服務器,則acme.sh可使用apache服務器頒發證書。而且acme.sh會在證書頒發後恢復您的apache conf,不用擔憂。
        $ acme.sh --issue  -d mydomain.com  --apache

      Nginx

      若是您的網站運行的是nginx服務器,則acme.sh可使用nginx服務器頒發證書。頒發證書後,acme.sh會還原您的nginx conf,請放心。
      
        $ acme.sh --issue  -d mydomain.com  --nginx
      
        有時,沒法自動找到nginx conf文件,您能夠指定如下文件之一:
      
        $ acme.sh  --issue  -d example.com  --nginx /etc/nginx/nginx.conf
      
        你還能夠指定網站conf:
      
        $ acme.sh  --issue  -d example.com  --nginx /etc/nginx/conf.d/example.com.conf

      注意: 不管是 apache 仍是 nginx 模式, acme.sh在完成驗證以後, 會恢復到以前的狀態, 都不會私自更改你自己的配置.

    • Standalone mode

      若是你尚未運行任何 web 服務, 80 端口是空閒的, 那麼 acme.sh 還能僞裝本身是一個webserver, 臨時聽在80 端口, 完成驗證:

      $ acme.sh  --issue -d mydomain.com  --standalone
      
        $ acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
  2. dns 方式

    在域名上添加一條 txt 解析記錄, 驗證域名全部權.

    這種方式的好處是, 你不須要任何服務器, 不須要任何公網 ip, 只須要 dns 的解析記錄便可完成驗證. 壞處是,若是不一樣時配置 Automatic DNSAPI,使用這種方式 acme.sh 將沒法自動更新證書,每次都須要手動再次從新解析驗證域名全部權。

    $ acme.sh  --issue  --dns -d mydomain.com

    而後, acme.sh 會生成相應的解析記錄顯示出來, 你只須要在你的域名管理面板中添加這條 txt 記錄便可.

    等待解析完成以後, 從新生成證書:

    $ acme.sh  --renew   -d mydomain.com

    注意第二次這裏用的是 --renew

    dns 方式的真正強大之處在於可使用域名解析商提供的 api 自動添加 txt 記錄完成驗證.

    acme.sh目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數十種解析商的自動集成.

    以 dnspod 爲例, 你須要先登陸到 dnspod 帳號, 生成你的 api id 和 api key, 都是免費的. 而後:

    $ export DP_Id="1234"
     $ export DP_Key="sADDsdasdgdsf"
     $ acme.sh  --issue  --dns dns_dp  -d aa.com  -d www.aa.com

    證書就會自動生成了. 這裏給出的 api id 和 api key 會被自動記錄下來, 未來你在使用 dnspod api 的時候, 就不須要再次指定了. 直接生成就行了:

    $ acme.sh  --issue   -d  mydomain2.com   --dns  dns_dp
  3. 混合模式

    頒發包含多個域的單個證書。每一個域使用不一樣的驗證方法

    $ acme.sh  --issue  \
         -d aa.com  -w /home/wwwroot/aa.com \
         -d bb.com  --dns dns_cf \
         -d cc.com  --apache \
         -d dd.com  -w /home/wwwroot/dd.com

只需頒發證書

例子:

  • Example 1: Single domain.

    $ acme.sh --issue -d example.com -w /home/wwwroot/example.com

    or:

    $ acme.sh --issue -d example.com -w /home/username/public_html

    or:

    $ acme.sh --issue -d example.com -w /var/www/html
  • Example 2: Multiple domains in the same cert.

    $ acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com

參數/home/wwwroot/example.com 和/home/username/public_html或是/var/www/html都是你託管網站文件的Web根文件夾。你必須具備write access該文件夾。

第二個參數「 example.com」是您要爲其頒發證書的域名。您必須在那裏至少有一個域名。

你必須將全部域指向並綁定到同一個webroot目錄:/home/wwwroot/example.com。

證書將被放置在 ~/.acme.sh/example.com/

證書每60天自動更新一次。

頒發ECC證書

Let's Encrypt如今能夠頒發ECDSA證書。

只需將keylength參數設置爲prefix便可ec-

例如:

  • Single domain ECC certificate

    $ acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
  • SAN multi domain ECC certificate

    $ acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256

keylength的參數

有效值爲:

ec-256 (prime256v1, "ECDSA P-256")
ec-384 (secp384r1, "ECDSA P-384")
ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)

其餘使用

  • 複製證書

    生成證書後,你可能但願將證書安裝/複製到Apache/Nginx或其餘服務器。你必須使用此命令將證書複製到目標文件,請勿使用〜/ .acme.sh /文件夾中的證書文件,這些文件僅供內部使用,未來文件夾結構可能會更改。

    • Apache example:

      $ acme.sh --install-cert -d example.com \
            --cert-file      /path/to/certfile/in/apache/cert.pem  \
            --key-file       /path/to/keyfile/in/apache/key.pem  \
            --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
            --reloadcmd     "service apache2 force-reload"
    • Nginx example:

      $ acme.sh --install-cert -d example.com \
            --key-file       /path/to/keyfile/in/nginx/key.pem  \
            --fullchain-file /path/to/fullchain/nginx/cert.pem \
            --reloadcmd     "service nginx force-reload"

    默認狀況下,證書將每60天更新一次(可配置)。證書更新後,將經過如下命令自動從新加載Apache / Nginx服務:service apache2 force-reload或service nginx force-reload。

    請注意:reloadcmd很是重要。該證書能夠自動更新,可是,若是沒有正確的「 reloadcmd」,該證書可能沒法刷新到您的服務器(如nginx或apache),那麼您的網站將沒法在60天內顯示更新的證書。

  • 發行通配符證書

    很簡單,只需提供一個通配符域做爲-d參數。

    $ acme.sh  --issue -d example.com  -d '*.example.com'  --dns dns_cf
  • 如何續訂證書

    你不須要手動續訂證書。全部證書將每60天自動更新一次。

    可是,你也能夠強制續訂證書:

    $ acme.sh --renew -d example.com --force

    或者,對於ECC證書:

    $ acme.sh --renew -d example.com --force --ecc
  • 更新 acme.sh

    目前因爲 acme 協議和 letsencrypt CA 都在頻繁的更新, 所以 acme.sh 也常常更新以保持同步.

    升級 acme.sh 到最新版 :

    $ acme.sh --upgrade

    若是你不想手動升級, 能夠開啓自動升級:

    $ acme.sh  --upgrade  --auto-upgrade

    以後, acme.sh 就會自動保持更新了.

    你也能夠隨時關閉自動更新:

    $ acme.sh --upgrade  --auto-upgrade  0

參考網站

官網

certbot

acme.sh

Let's Encrypt之acme

相關文章
相關標籤/搜索