Web開發必知必會,如何使用 Letsencrypt 為網站簽發 HTTPS 證書提供安全支援
在做 Web 開發中,對網站內容的基本安全加密就是使用 HTTPS,並且在一些重視安全性的軟體中,HTTPS 必不可少,微信開發中配置的域名強制使用 HTTPS,parse-dashboard
的配置連線必須使用 HTTPS,等等。
現在可以很方便的在各雲服務提供商購買證書,唯一的缺點就是需要 付費,那麼有沒有 免費、白嫖 的證書呢?
答案是 有的,今天介紹的就是使用比較知名的自簽名證書機構 Letsencrypt 來對自己的網站域名簽發證書了支援 HTTPS。
-
登入到伺服器
使用
ssh
登入到執行的網站的伺服器。 -
安裝
snapd
snapd
是目前各個Linux
發行版中很好用的包管理工具。示例中的安裝是基於
CentOS 7
系統來安裝的,如果你使用的是其他發行版的系統,那麼具體的安裝請參考snapd
的官網中的安裝文件,傳送門。-
新增 REPL
-
CentOS 8
$ sudo dnf install epel-release $ sudo dnf upgrade
-
CentOS 7
$ sudo yum install epel-release
-
-
安裝
snapd
-
配置了 REPL 之後,輸入下面命令即可安裝
snapd
$ sudo yum install snapd
-
安裝完成後,
systemd
enable
$ sudo systemctl enable --now snapd.socket
-
將
snapd
的檔案目錄連結到系統的路徑中snapd
安裝完成之後提供的命令是snap
, 預設安裝在/snap
的目錄中$ sudo ln -s /var/lib/snapd/snap /snap
-
-
-
檢視
snapd
版本執行命令安裝
snapd
核心庫,確保安裝的snapd
版本是最新的。sudo snap install core; sudo snap refresh core
-
移除
certbot-auto
和其他 Certbot 模組包使用不同系統自身的包管理工具解除安裝已經安裝的 Certbot 模組,常用的
apt
yum
dnf
等。sudo apt-get remove certbot, sudo dnf remove certbot, or sudo yum remove certbot
-
安裝 Certbot
Certbot 是生成 HTTPS 證書的主要工具,在之前的版本中 Certbot 使用 Python 來安裝,由於 Python 中安裝包總是出現版本不一致的問題導致安裝不成功,因此官方建議現在使用
snap
來安裝 Certbot。sudo snap install --classic certbot
-
將 certbot 連結到系統環境變數中
sudo ln -s /snap/bin/certbot /usr/bin/certbot
-
使用 Nginx 生成 HTTPS 證書
使用 Nginx 生成證書有兩種方式:
-
使用
certbot
生成證書並且使用certbot
更改 Nginx 的配置檔案sudo certbot --nginx
-
僅使用
certbot
生成證書sudo certbot certonly --nginx
在生成證書的過程中,
certbot
會提示你輸入郵箱來進行下一步的驗證,此時你可以在執行命令的時候新增--register-unsafely-without-email
跳過郵箱驗證步驟:sudo certbot --nginx --certonly --register-unsafely-without-email
然後在接下來的步驟中根據要生成證書的域名選擇就可以生成自己的 HTTPS 證書啦
-
-
配置自動更新證書
由於 Letsencrypt 提供的證書的有效期只有
90
天,所以我們需要對我們的證書及時續簽。通過執行
renew
命令來進行證書續簽操作,新增--dry-run
引數代表模擬續簽,檢視執行命令的結果輸出sudo certbot renew --dry-run
-
使用
crontab
新增定時續簽在
Linux
執行定時任務,離不開使用crontab
命令,在crontab
配置中新增以下配置0 0,12 * * * sudo certbot renew > /var/log/certbot.renew.log
以上指令碼代表在每天的 24 點和 12 點定時檢查證書是否到期,並執行續簽操作。
-
檢視 HTTPS 服務是否正確開啟
- 在瀏覽器中開啟配置 HTTPS 的域名,檢視是否已經切換成了 HTTPS 的標誌
- 在命令列中通過
curl
命令檢視 HTTPS 是否開啟
在命令列中輸入以下命令檢視域名的輸出:
```bash curl -vIL https://zi.pongj.com ```
輸出結果中,可以看到配置的 HTTPS 證書資訊,證書的簽署日期是
Dec 29 07:06:07 2020 GMT
,到期日期是Mar 29 07:06:07 2021 GMT
```bash * About to connect() to zi.pongj.com port 443 (#0) * Trying 49.235.105.234... * Connected to zi.pongj.com (49.235.105.234) port 443 (#0) * Initializing NSS with certpath: sql:/etc/pki/nssdb * CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 * Server certificate: * subject: CN=zi.pongj.com * start date: Dec 29 07:06:07 2020 GMT * expire date: Mar 29 07:06:07 2021 GMT * common name: zi.pongj.com * issuer: CN=R3,O=Let's Encrypt,C=US > HEAD / HTTP/1.1 > User-Agent: curl/7.29.0 > Host: zi.pongj.com > Accept: */* > < HTTP/1.1 200 OK HTTP/1.1 200 OK < Server: nginx/1.18.0 Server: nginx/1.18.0 < Date: Fri, 22 Jan 2021 05:40:37 GMT Date: Fri, 22 Jan 2021 05:40:37 GMT < Content-Type: text/html; charset=utf-8 Content-Type: text/html; charset=utf-8 < Content-Length: 219958 Content-Length: 219958 < Connection: keep-alive Connection: keep-alive < ETag: "35b36-TbUTbYgQ6yT1OJeOQSyX0F3IN9g" ETag: "35b36-TbUTbYgQ6yT1OJeOQSyX0F3IN9g" < Accept-Ranges: none Accept-Ranges: none < Vary: Accept-Encoding Vary: Accept-Encoding < * Connection #0 to host zi.pongj.com left intact ```
更多內容
前端開發轉全棧,目前的技術棧是 Node.js、Python,日常研究 C 和 Rust,孜孜啃食系統開發和網路設計中~
更多的內容請移步[email protected],知乎@孟太白,掘金,或者關注我的公眾號@全棧開發師,歡迎來撩~
學到老,寫到老,生命不停,程式設計不止~
加油,打工人~