Let's Encrypt 是一個新的憑證提供商,免費、自動、開放。
申請一個免費憑證非常簡單,下載他們的 acme-client 按提示操作即可,但是官方客戶端非常繁瑣,一堆依賴。
因此需要一個精簡版的客戶端:https://github.com/diafygi/acme-tiny,以下爲使用方法
Step 0. 前期準備
1 2 3 |
apt-get install git -y #如果未安裝git git clone https://github.com/diafygi/acme-tiny cd acme-tiny |
Step 1. 創建帳戶private key
1 |
openssl genrsa 4096 > account.key |
Step 2. 創建域名CSR
創建域名私有密鑰
1 2 |
#聽講rsa4096非常消耗CPU openssl genrsa 4096 > domain.key |
1 2 |
#創建單域名 csr,將domain.com更換爲你的域名 openssl req -new -sha256 -key domain.key -subj "/CN=domain.com" > domain.csr |
或
1 2 |
#創建多域名 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 文件用於驗證
1 2 |
#創建一個新目錄 mkdir -p /home/challenges/ |
在你的nginx conf server下添加:
1 2 3 4 5 |
location /.well-known/acme-challenge/ { alias /home/challenges/; try_files $uri =404; } |
重啟nginx
1 |
service nginx restart |
Step 4. 簽發憑證
1 |
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. 合併憑證鏈
1 2 |
wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.pem |
Step 5. 更改nginx設定使其生效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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; #其他設定 } |
1 |
service nginx restart #重啟nginx後即可生效 |
Step 6. 更改網站將http資源改成https。
Final Step. 由於此憑證有效期只有90日,所以最好設定自動任務令其自動續期
新建一個 renew_cert.sh 文件
1 2 3 4 5 6 |
#!/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 |
添加自動任務
1 2 3 |
crontab -e 0 0 1 * * /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log service cron restart |
已经过期,唔该更新下个证书
已更新. 🙂
围观月董
已经过期,唔该更新下个证书
已更新 🙂
李大婶好厉害噢
test
我在centos上部署出现了这个错误,请问该如何解决呢
什麼錯誤= =
那个错误已经没了,不过,我是通过密钥登录vps的,看着你的方法弄完发现登录不了了。。
= =不應該啊,這些命令應該沒動到密鑰
那么apache该怎么弄呢。
Apache就自己搞了,我不喜歡Apache所以沒弄= =