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
不難發現,其中最容易實現自動化的一種操做必然爲最後一條,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
普通安裝安全
安裝很簡單, 一個命令(普通用戶和 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
下面是經常使用的兩種
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
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
混合模式
頒發包含多個域的單個證書。每一個域使用不一樣的驗證方法
$ 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天自動更新一次。
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