本文只是記錄下自已在給網站域名加上HTTPS的過程,不涉及到HTTS的具體原理,如要了解,請自行搜索相關信息。
我們知道,如果要給網站域名加上HTTPS,一般是通過購買證書或去找一些免費的證書來,花錢的這里就不說了,無非是購買證書后,配置就行了。這里說的是免費的,它就是 Let's Encrypt
,其實很久之前就聽過這個東西,只是一直沒有去弄過,這次剛好需要就去看了下,沒有想像中的那么麻煩,配合第三方的腳本,簽個證書如果順利的話,簡單是分分鍾的事。
其實,剛開始我是打算用其它第三方的平台的,比如freessl
這種,后面發現真搞起來,這個也麻煩,又要注冊,也要驗證域名文件或DNS解析,最主要的是還不能自動更新證書,到期后還得重新弄,於是放棄。
所以,這里還是說下用Let's Encrypt
來簽發證書和部署環境
安裝ACME
安裝之前,了解一個叫ACME(自動化證書管理環境)的東西,通過它就可以很方便的來頒發證書、驗證域名和管理證書的一些操作了,就是傻瓜化了。
有基於它實現的很多客戶端,比如
certbot
但是我在大概看了下后,覺得不是很簡單呀,於是在 Let's Encrypt找到了acme.sh
, 這個用起來更簡單,一個命令行的工具。
進入你的系統命令行,輸入下面的命令
curl https://get.acme.sh | sh
上面的操作主要干了這么幾件事:
- 把acme.sh安裝到了你的用戶主目錄 $HOME下的.acme.sh文件夾下,后面你對證書的操作都在這個目錄下面,它不會去破壞你系統的其它目錄的。
- 創建了一個別名
alias acme.sh=~/.acme.sh/acme.sh
, 后面就可以用acme.sh
來使用這個腳本了,注意如果你輸入acme.sh
找不到,那么重新刷下你的用戶環境source ~/.bash_profile
或開一個新的終端. - 它創建了一個每天檢測證書過期的Crontab, 因為證書的時效是60天,過期了就自動更新證書。這一切都是腳本在處理,我們不需要去處理這些。
安裝完成后,輸入acme.sh --version
來看下安裝好了沒,如果找不到命令,還是一樣刷一下環境變量配置文件
生成證書
這里就通過上面安裝的acme.sh
來操作了,如果要了解更多,可以去它的官網 acme.sh了解,其實,正常來說,這一步安裝的過程很簡單的,但是因為我當時趕時間要,在網上看了幾篇環境后我就操作,結果有幾個關鍵的步驟他們並沒有寫出來,導致我一直在試,一直安裝不成功,最后還觸發了Let's Encrypt
的Rate Limit限制,被鎖了好久。
我有一個主域名,兩個二級域名,一開始我的命令是類似下面這樣的,
acme.sh --issue -d ezone.com -d mc.ezone.com -d ag.ezone.com -w /home/wwwroot/ezone.com
上面這個命令的意思是說,我要給三個域名弄一個證書,他們的證書文件都是一樣的。網站主目錄都是一樣,在 /home/wwwroot/ezone.com
下面,一開始我沒有理解到,以為只要配置任何一個域名的主目錄就行了。因為我的這三個域名文件都是在一台機器上面的,所以它們的主目錄肯定不可能是一樣的.
所以第一個坑就是目錄這里我沒有做對。
第二個坑就是,因為上面的那種方式是通過http的方式來驗證的,也就是說腳本它會在你的網站目錄生成類似.well-known/acme-challenge/qsNtqqNOqcAIczvulbYtcd78jdd0GGYR6wZgCW6M-ao
這種的。這種是需要在你的Nginx中配置的。我一開始也沒有配置,導致一直不成功。於是在各個網站的Nginx配置中加上配置
location ~ /\.well-known/acme-challenge/ {
allow all;
root /home/www/web_data/ezone.com;
try_files $uri =404;
break;
}
第三個坑就是,開始沒有注意到,應該用他們的測試環境來做,雖然也有Rate Limit限制,但是寬松很多。用測試環境,就用 acme.sh --test --issue
這種方式來弄。
所以總結一下,就是如果要生成證書,那么首先你要配置你的Nginx目錄,然后如果是多域名,要注意你的網站主目錄,另外盡量用測試環境,等沒問題了,再用正式的來重新生成就行了。
不過,后面我找到一種更簡單的,它有種模式叫 Nginx mode
和Apache mode
這種,這種驗證不需要在你的網站上面寫入任何文件來驗證, 就是加了一個 --nginx
這種。
acme.sh --issue --nginx -d ezone.com -d mc.ezone.com -d agt.ezone.com
好了,如果沒什么問題,成功后證書就生成在你的用戶目錄~/.acme.sh/ezone.com下面了,但是這個目錄是acme.sh
腳本內部去控制的,也不知道那天會變,而且我們的Nginx也是讀不到這個目錄的。那么就只能將這些文件拷到Nginx能讀取的地方了。
安裝證書
將上面生成的文件,安裝拷貝到Nginx的某個目錄,比如 /etc/nginx/ssl
沒有這個就建一個,然后執行下面的語句,將文件拷過去,並加載Nginx
acme.sh --install-cert -d ezone.com \
--key-file /etc/nginx/ssl/ezone.com.key \
--fullchain-file /etc/nginx/ssl/ezon.com.cer \
--reloadcmd "systemctl reload nginx"
在/etc/nginx/ssl
下面就有上面的兩個文件了,然后我們再配置Nginx
server {
listen 443 ssl http2 default_server;
server_name ezone.com
root /home/web_data/ezonepay.com
index index.php index.html index.htm;
ssl_certificate /etc/nginx/ssl/ezone.com.cer;
ssl_certificate_key /etc/nginx/ssl/ezone.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
}
好了,經過上面的步驟,HTTPS證書就弄完了,可以用 https:// 來訪問你的網站了,通過acme.sh
這個還是挺方便的。而且,后續的更新也不要自已去維護。