背景
- 證書可用在https,wss等需要tls加密認證的場景;
- 正式使用的環境一般都會使用收費的證書,但測試服或自己實驗環境大部分都用自簽名或免費的證書;
- webrtc相關的模塊標準要求必須加密且不能是自簽名證書;
先決條件
從背景上來看我們得想想辦法來薅一薅羊毛了,但爲了安全性也還是有一些准入門檻的,如下:
- 得下載一份 certbot-auto 腳本;
- 得有服務器的登錄ssh權限;
- 第一次安裝時得有root權限可以將腳本加入sudo list;
- 服務器必須有可用的域名已經預先解析到了本機上且能ping通,地址爲本服務器的公網地址;
- 服務器上的80或443端口是空閒的如果外圍有防火牆需要在防火牆上開放了公網的相應端口;
- 腳本在執行時爲了校驗域名被解析的主機就是你所操作的主機所以會自動開啓443端口進行現場認證, 防止綁定了非法域名,還有一個注意的點就是它只能提供具體域名無法對範域名進行綁定證書;
獲取證書
- 先下載可執行腳本: 詳見: <wget https://dl.eff.org/certbot-auto> ;
- 放到自己的一個固定的目錄如:
/home/yine/scripts
, 然後添加可執行權限:chmod a+x /home/yine/scripts/certbot-auto
; sudo -iu root
切換到root權限添加腳本到sudo列表中去,以方便後續普通用戶的證書自動更新操作;- 添加sudo列表:
echo 'popo ALL = NOPASSWD: ...(其它已有指令), /home/yine/scripts/certbot-auto' > /etc/sudoers.d/yine
; sudo -iu yine
切換到普通用戶;sudo /home/yine/scripts/certbot-auto certonly --standalone -d yourdomain.com --agree-tos --email [email protected]
;- 當執行成功後會在
/etc/letsencrypt
下生成相關臨時文件和證書文件; /etc/letsencrypt/live/yourdomain.com/fullchain.pem
爲證書文件;/etc/letsencrypt/live/yourdomain.com/privkey.pem
爲證書的私鑰;- 爲了應用能直接訪問可以修改
/etc/letsencrypt
目錄歸屬和權限chown -R yine:studio /etc/letsencrypt
chmod -R 744 /etc/letsencrypt
;
配置應用使用
- nginx
server {
listen 80;
server_name abc.com;
rewrite ^(.*) https://abc.com permanent;
}
server{
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
server_name www.yourdomain.com;
root /web/yourdomain.com/;
}
- kamailio 在 /etc/kamailio/tls.cfg
private_key = /etc/letsencrypt/live/yourdomain.com/privkey.pem
certificate = /etc/letsencrypt/live/yourdomain.com/fullchain.pem
配置自動更新
- 在 /home/yine/scripts 下新建腳本 corn-cerbot-auto.sh
- 添加:
#!/bin/bash
sudo /home/popo/scripts/certbot-auto renew --quiet
sudo /etc/init.d/kamailio force-reload
- 在計劃任務中添加(crontab -e):
0 4 1 */2 * /home/yine/scripts/corn-cerbot-auto.sh
#每兩個月的一號凌晨4點更新一次
其它生成方式
- 還有其它的依賴web的生成方式,比如nginx或apache等,需要有這樣的web應用在,直接使用認證文件的方式進行;
- 詳見: https://letsencrypt.org/zh-cn/getting-started/#