上一期寫了 使用Let's Encrypt實現網站https化 ,隨著二級域名的增多,每個二級域名需要一張 SSL 證書,這可太不優雅了,泛域名錶示我可以更優雅。
作者:IT王小二
部落格:https://itwxe.com
本來 Let's Encrypt 泛域名使用、Nginx 配置拆分是準備分成兩篇文章來寫的,可是兩篇文章又感覺篇幅過短和冗餘。
所以最後決定寫在一篇裡面吧,同時把整個流程寫明白,之前有人問有了證書怎麼搭配 Nginx 來配置,這篇從域名對映到Nginx配置完成的保姆級教程,小二求個點贊不過分吧。
一、SSL證書獲取
寫在最前面,使用過程中如有問題參考 acme官方文件 ,文件有中文說明,如果有報錯可以檢視 Issuse,當然也可以留言你碰到的問題。
如果你已經有證書了,直接訪問第二步 域名對映配置 開始閱讀即可。
由於 Let's Encrypy 申請的 SSL 證書只有三個月的有效期,泛域名申請只能DNS驗證,可以使用使用 acme.sh 指令碼來獲取且自動續期,前提是你的 DNS 服務商支援 DNS 呼叫,支援的服務商在 https://github.com/acmesh-official/acme.sh/wiki/dnsapi 中自行檢視。
雖然 DNSPod.cn 支援 DNS 介面呼叫,不過個人結合了百度雲加速 CDN 的嚴格加密模式,不用 CDN 來加速,那載入個圖片估計都能卡成 PPT,就我伺服器那小水管頻寬,而百度雲加速 CDN 沒有可以能夠自動上傳證書的介面,故我沒有使用自動 DNS 驗證,使用了手動 DNS 驗證。
手動的話每三個月就要手動更新一次證書,當然如果你沒有配合其他 CDN 使用的話,可以使用 DNS 自動驗證模式,每個服務商的使用方式也很簡單,官方文件寫的很明白了。
當然你不知道什麼是自動 DNS 或者手動 DNS 也沒關係,看文件或者按照我的操作一步一步來都是可以成功滴。
1. 什麼是泛域名
比如使用者的域名是abc.com,那麼我們將主機名設定為"",IP解析到比如:218.104.78.100,大家都知道是萬用字元,他表明abc.com之前的所有子域名都將解析到218.104.78.100,這就意味著例如輸入bbs.abc.com或者123.abc.com或者123.234.abc.com都將解析到218.104.78.100,這裡需要說明的是,在我們系統裡面如果單獨設定一個子域名解析,比如將主機名設定為mail,單獨解析到218.104.78.79,那麼該解析記錄優先。 -- 摘自百度百科
而泛域名證書就是一張證書可以用來驗證所有同級子域名的證書,例如 *.itwxe.com
的證書,那麼 www.itwxe.com
、images.itwxe.com
、waline.itwxe.com
都是可以使用 *.itwxe.com
來驗證的,當然 主域名itwxe.com
和三級域名 www.aa.itwxe.com
就不適用了。
不過大部分人二級域名就已經夠用了,這樣就避免了一個二級域名申請一張 SSL 證書,真是個優雅的方案啊。
2. 下載指令碼並安裝
下載指令碼並安裝,將郵箱設定成自己的。
wget -O - https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m itwxe@qq.com
重新整理使用者變數,任意目錄可以使用 acme.sh。
source /root/.bashrc
重新整理配置後,輸入命令 acme.sh -v
檢視 acme.sh 的版本,要是正常列印版本就代表安裝成功。
這裡除了安裝了指令碼,同時還自動配置了個定時任務,這個定時任務每天會檢查你的證書是否需要自動續期,可以使用 crontab -l
檢視,因為使用的是手動 DNS 模式,這個定時任務意義不大,所以可以直接刪除掉,當然不刪除也沒問題。
3. 手動申請泛域名證書
附上一段官方文件原話截圖,免得有些小夥伴沒法訪問 GitHub 說我給的文件地址是假的,畢竟 GitHub 時不時抽風,這麼貼心的小二不值得你的一個點贊嗎,嘿嘿。
下面開始自己的操作,為了一張 SSL 證書能夠同時使用主域名 itwxe.com
和 二級域名 *.itwxe.com
,所以,申請證書時命令如下,其中域名換成自己的。
acme.sh --issue --dns -d itwxe.com -d *.itwxe.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
因為我的泛域名還有兩個多月過期,所以我這裡演示增加引數 --force
強制更新,沒有申請過證書則不需要 --force
引數,過程如圖:
登入域名控制檯,我的是騰訊雲,手動新增 DNS 驗證域名所有權,內容是上圖中的兩個圈中的內容。需要注意的是,內容主機域名填寫 _acme-challenge,記錄型別選擇 TXT, 記錄值填寫上面命令生成的內容。
新增後的結果如圖。
新增後過個30秒時間,執行如下命令如下,其中域名替換為自己的域名,特別注意的是 --renew
而不是 --issue --dns
。
acme.sh --renew -d itwxe.com -d *.itwxe.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
看到如上圖的日誌,就代表 SSL 證書生成成功了,可以看到 SSL 證書放在 /root/.acme.sh/itwxe.com/
目錄下,檢視一下生成的證書,主要用到的是下圖這兩個證書。
二、域名對映
同樣在域名服務商後臺配置對映,我這裡還是騰訊雲啦。配置泛域名對映到自己的主機 IP,假如我的 IP 是 192.168.5.11,可能有人要吐槽了,你這明顯是個內網 IP,配置成這樣能訪問我..我...倒立喝可樂。
我說的是假如哈,不要較真,小夥伴們自己操作記得換成自己的公網 IP。
配置好了之後騰訊雲免費解析大概要十分鐘生效,趁這個時間剛好可以去配置一下 Nginx,美滋滋。
看解析是否生效的辦法就是開啟終端 ping 一下自己的二級域名,如果響應的是你的IP,那麼就OK啦。
三、Nginx配置拆分
這裡我使用的是 Nginx 作為反向代理,又不知道怎麼安裝 Nginx 的小夥伴可以訪問 https://www.itwxe.com/posts/1334c88e/ 來安裝 Nginx。
1. 複製證書檔案
建立 /usr/local/nginx/ssl/any
目錄並複製證書到建立的目錄下,下面的命令就不用小二解釋了吧,相信小夥伴們都明白,Linux常用的命令,注意把路徑改成自己的就可以啦。
mkdir -p /usr/local/nginx/ssl/any
cp /root/.acme.sh/itwxe.com/{fullchain.cer,itwxe.com.key} /usr/local/nginx/ssl/any/
2. 配置Nginx
既然使用了泛域名,一般來說子域名就比較多了,目前我都已經 5 個子域名,後面還會不斷增加,所以需要對 Nginx 配置檔案進行一個拆分,拆分也很簡單,以配置 www.itwxe.com
為例開始操作。
預設 Nginx 是用 /usr/local/nginx/conf/nginx.conf
檔案啟動的,那麼為了拆分配置,在 /usr/local/nginx/conf
目錄下新建一個 conf.d
資料夾,然後裡面放我們拆分的配置。
進入 conf 目錄後使用 mkdir conf.d
建立資料夾後,進入建立的資料夾,我的目錄及檔案如下。
vi common.conf
寫入如下SSL通用配置後儲存退出,ssl_certificate 和 ssl_certificate_key 分別是證書的路徑。
ssl_certificate /usr/local/nginx/ssl/any/fullchain.cer;
ssl_certificate_key /usr/local/nginx/ssl/any/itwxe.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 30m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
ssl_prefer_server_ciphers on;
vi www.itwxe.conf
中配置如下,使用 include
關鍵字來引用 SSL 通用配置。
# itwxe.com 強制跳轉 www.itwxe.com,按個人需求更改
server {
listen 443 ssl;
server_name itwxe.com;
include /usr/local/nginx/conf/conf.d/common.conf;
return 301 https://www.itwxe.com$request_uri;
}
server {
listen 443 ssl;
server_name www.itwxe.com;
# 引用通用域名配置common.conf
include /usr/local/nginx/conf/conf.d/common.conf;
location / {
root /itwxe/blogSite/public;
index index.html;
}
# 網站圖示
location = /favicon.ico {
alias /itwxe/dockerData/lskypro/public/images/site-info/favicon.png;
log_not_found off;
access_log off;
}
# 404頁面
error_page 404 /404.html;
location = /404.html {
root html/404-26;
}
}
www為示例,其他的同級子域名也類似配置。拆分出來的配置還要在主配置檔案 /usr/local/nginx/conf/nginx.conf
中引用。
同時為了防止別人惡意解析到我們的泛域名,我們需要配置 Nginx 中未配置的二級域名預設返回 404 或者 444 ,這樣配置也對 SEO 比較友好,當時我沒配置導致百度收錄了好幾個沒用的域名連結。
下面是我的配置,其中最重要的部分如圖:
下面是方便大家複製修改成自己的配置文字。
server{
listen 80 default_server;
server_name _;
access_log off;
return 404;
}
server{
listen 443 default_server;
server_name _;
ssl_certificate /usr/local/nginx/ssl/any/fullchain.cer;
ssl_certificate_key /usr/local/nginx/ssl/any/itwxe.com.key;
access_log off;
return 404;
}
server {
listen 80;
server_name *.itwxe.com;
# 將http請求轉變為https
return 301 https://$host$request_uri;
#rewrite ^(.*) https://$host$1 permanent;
#location / {
# root /itwxe/blogSite/public;
# index index.html;
#}
charset utf-8;
}
include /usr/local/nginx/conf/conf.d/*.itwxe.conf;
配置完成後,校驗 Nginx 配置 和重新載入 Nginx 配置。
./nginx -t
./nginx -s reload
至此,就完成了泛域名的使用和 Nginx 配置拆分,這時候可以看下網站是否可以正常訪問,可以看到證書正常部署生效了。
當然如果使用了 CDN 還在 CDN 控制檯上傳證書,我的就是百度雲加速了,下篇來說說 CDN 是啥,國內和國外有哪些免費的 CDN 可以使用,感興趣的小夥伴可以來個關注啦。
都讀到這裡了,來個 點贊、評論、關注、收藏 吧!