Let's Encrypt 是一個新的憑證提供商,免費、自動、開放。

申請一個免費憑證非常簡單,下載他們的 acme-client 按提示操作即可,但是官方客戶端非常繁瑣,一堆依賴。

因此需要一個精簡版的客戶端:https://github.com/diafygi/acme-tiny,以下爲使用方法

Step 0. 前期準備

apt-get install git -y #如果未安裝git
git clone https://github.com/diafygi/acme-tiny
cd acme-tiny

Step 1. 創建帳戶private key

openssl genrsa 4096 > account.key

Step 2. 創建域名CSR

創建域名私有密鑰

 #聽講rsa4096非常消耗CPU
openssl genrsa 4096 > domain.key 
#創建單域名 csr,將domain.com更換爲你的域名
openssl req -new -sha256 -key domain.key -subj "/CN=domain.com" > domain.csr

#創建多域名 csr,將domain.com更換爲你的域名
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:domain.com,DNS:www.domain.com")) > domain.csr

Step 3. 創建 challenges 文件用於驗證

#創建一個新目錄
mkdir -p /home/challenges/

在你的nginx conf server下添加:

location /.well-known/acme-challenge/ 
     {
        alias /home/challenges/;
        try_files $uri =404;
     }

重啟nginx

service nginx restart

Step 4. 簽發憑證

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /home/challenges/ > ./signed.crt

此時有可能出現 Server failure at resolver 或 DNS query timed out 錯誤,重試幾次即可。

Step 5. 合併憑證鏈

wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

Step 5. 更改nginx設定使其生效

server {
    listen 443;
    server_name yoursite.com, www.yoursite.com;

    ssl on;
    ssl_certificate /path/to/chained.pem;  #更改爲 chained.pem 路徑
    ssl_certificate_key /path/to/domain.key; #更改爲 domain.key 路徑
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;

    #其他設定
}
 service nginx restart #重啟nginx後即可生效

Step 6. 更改網站將http資源改成https。

Final Step. 由於此憑證有效期只有90日,所以最好設定自動任務令其自動續期

新建一個 renew_cert.sh 文件

#!/usr/bin/sh
python /home/acme_tiny/acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /home/challenges/ > ./signed.crt
wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem
cat ./signed.crt intermediate.pem > ./chained.pem
#此處路徑應修改
service nginx restart

添加自動任務

crontab -e
0 0 1 * * /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log
service cron restart
   

已有 13 條評論

  1. Ryan 10 年前 (2016-04-19)
    @

    已经过期,唔该更新下个证书

    • JyLee 10 年前 (2016-07-06)
      @

      已更新. 🙂

  2. 小康 10 年前 (2016-04-14)
    @

    围观月董

  3. imlonghao 10 年前 (2016-03-14)
    @

    已经过期,唔该更新下个证书

    • JyLee 10 年前 (2016-07-06)
      @

      已更新 🙂

  4. ★Extreme★ 10 年前 (2016-01-14)
    @

    李大婶好厉害噢

  5. JyLee 10 年前 (2015-12-26)
    @

    test

  6. しら 10 年前 (2015-12-05)
    @

    我在centos上部署出现了这个错误,请问该如何解决呢

    • JyLee 10 年前 (2015-12-05)
      @

      什麼錯誤= =

      • しら 10 年前 (2015-12-05)
        @

        那个错误已经没了,不过,我是通过密钥登录vps的,看着你的方法弄完发现登录不了了。。

        • JyLee 10 年前 (2015-12-07)
          @

          = =不應該啊,這些命令應該沒動到密鑰

  7. しら 10 年前 (2015-12-05)
    @

    那么apache该怎么弄呢。

    • JyLee 10 年前 (2015-12-05)
      @

      Apache就自己搞了,我不喜歡Apache所以沒弄= =