如何用certbot申請 Let’s Encrypt 的憑證

介紹如何使用certbot來申請Let’s Encrypt的憑證,還有使用AWS Route53 plugin來自動更新憑證

1. 安裝certbot

sudo apt install certbot

2. 使用certbot申請SSL憑證

手動驗證(manual)

sudo certbot certonly -d <DOMAINNAME> --manual
  • certonly:表示只需要申請憑證即可。certbot還有支援一些常見的server替換SSL的功能,如apache、nginx等
  • --manual:表示要使用互動界面來申請憑證。

注意:使用–manual的方式申請的憑證,除非有配合使用其它驗證插件,否則無法自動renew。

這個方式申請的憑證有提供兩種預設方式驗證

  1. 會產生一個challenge檔案,然後讓我們放到要使用這個憑證的機器(至少是這個domain name會連到的機器)的根目錄下指定的資料夾,讓ACME驗證可以使用申請的domain name加上給定的ACME資料夾,拿到申請的檔案。
  2. 直接會在目標機器上加上一個短暫的server,做到在指定的網址回傳上述的challenge檔案。

另外certbot其實還提供了其它的驗證方式,例如DNS

sudo certbot certonly -d <DOMAINNAME> --preferred-challenges dns --manual
  • certbot會在申請的互動界面,產生一個申請憑證網域的challenge key和value,申請人要到DNS託管服務,例如GoDaddy、AWS Route53等服務上,對要申請憑證的網域使用certbot產出的key value來建立一筆TXT設定,讓Let’s Encrypt確定要申請的網域是屬於你的。

使用Route53插件驗證

其實就是藉由Route53的API,讓插件替我們做完把ACME Chellenge TXT設定到DNS Server上的這段流程。所以需要設定AWS的access client到申請憑證的機器上。

1. 安裝certbot-dns-route53

 sudo apt install python3-certbot-dns-route53

其它plugin的名稱也是使用相同的pattern: python3-certbot-dns-<PLUGIN>

2. 設定AWS的access client

  1. 到AWS設定一個Policy
{
  "Version":"2012-10-17",
  "Id": "certbot-dns-route53 sample policy",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "route53:ListHostedZones",
        "route53:GetChange"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect" : "Allow",
      "Action" : [
        "route53:ChangeResourceRecordSets"
      ],
      "Resource" : [
        "arn:aws:route53:::hostedzone/YOURHOSTEDZONEID"
      ]
    }
  ]
}
  • Version的值不能改,這是告訴AWS要用這版的規則來看這個Policy

  • YOURHOSTEDZONEID:去Route53點選要設定的domain name,就會寫出它的host zone ID(託管區域ID)了。

  1. 建立一個IAM account,並且授予它上面的policy權限

  2. 在要執行certbot的機器上建立一個config檔,叫~/.aws/config內容如下

[default]
aws_access_key_id=<IAM的ID>
aws_secret_access_key=<IAM的secret key>

注意,如果執行certbot需要使用sudo來執行,這個config必須改放到/root/.aws/config

  1. 執行certbot
sudo certbot certonly --dns-route53 -d rd2.team.araliadata.io
  • 如果有要申請wildcard網域,需要多加上*.rd2.team.araliadata.io才需要有這段

  • —-post-hook:當certbot完成執行後,會在本地執行的動作。

  1. 設定排程執行sudo certbot renew,它會自行檢查是否有憑證快要到期了,如果快要到期才會真的再次申請新的憑證下來。
sudo certbot renew --cert-name <憑證名稱> --post-hook "docker compose -f /home/bigobject/data-planet-testbed/ambrose/docker-compose.yml down & /home/bigobject/data-planet-testbed/ambrose/docker-compose.yml up -d"
  • 憑證名稱:可以使用certbot certificates來查看

  • certbot renew:當憑證會在30天內到期時,真的去申請新的憑證,還未到期不會真的去申請新的憑證。

ex: 每週一檢查一次

#sudo crontab -e
0 0 * * 1 sudo certbot renew --cert-name rd2.team.araliadata.io --post-hook "docker compose -f /home/bigobject/data-planet-testbed/ambrose/docker-compose.yml down & /home/bigobject/data-planet-testbed/ambrose/docker-compose.yml up -d"

提醒

  • 可以先加上 --dry-run ,用來測試server申請憑證是否能成功,以防操作太多次,超過額度,不給申請。

  • 使用--manual的憑證申請,不能使用renew功能,除非有加上authentication hook,例如上面提到的route-53 plugin。

  • route-53 plugin其實就是用script連到route-53服務,新增對應的ACME challenge TXT。

  • ACME的驗證(--preferred-challenges),如果選擇使用DNS的方式驗證,需要使用--manual才能做。除非加上DNS插件驗證(如route53)。

Licensed under CC BY-NC-SA 4.0