Nginx部署HTTPS服務過程與異常處理實踐

apache發表於2018-08-14
版權宣告:作者:湯青松 https://blog.csdn.net/u013431141/article/details/81674461

一、背景

筆者所在團隊需要開發ios的APP,而apptstore應用商店稽核需要應用使用https,所以需要配置https證書,筆者將此次配置的過程與遇到的一些問題記錄下來,方便自己和讀者後續參考。

二、操作概要

  1. 申請證書與認證
  2. 證書下載與配置
  3. 問題分析與總結

三、申請證書與認證

要搭建https服務首先需有SSL證書,證書通常是在第三方申請,在阿里雲的安全服務中有SSL證書這一項,可以在裡面申請免費的證書;

也可以在自己電腦中生成,雖然也能完成加密,但是瀏覽器是不認可的,因此最好還是去第三方申請

3.1 證書申請

阿里雲提供免費的證書,不需要人工稽核,用來做測試是非常不錯的選擇,申請地址如下URL。

https://common-buy.aliyun.com/?spm=5176.2020520163.cas.1.1aa12b7aWWn20O&commodityCode=cas#/buy

免費型的證書隱藏的比較深,想要申請免費證書需要先選擇 1個域名->Symantec->免費型 ,所以讀者這裡需要注意一下,如下圖參考。

image

選擇之後,一直惦記下一步,便可購買完成,免費購買證書之後筆者需要回到證書控制檯,在控制檯有一個補全資訊的連結地址,需要通過此地址補充申請人的聯絡資訊,參考下圖填寫

image

3.2 域名驗證

補全個人資訊之後,筆者還需要給阿里雲驗證當前域名是屬於本人的,驗證方式有兩種,第一種是通過dns解析認證,第二種是通過上傳驗證檔案認證,筆者這裡採用的是驗證檔案認證,首先需要下載檔案,如下圖

image

在下載驗證檔案完成之後,筆者需要把檔案放到伺服器中去,這裡提供一條複製命令

scp ~/Downloads/fileauth.txt  tangqingsong@192.168.43.34:~/

將驗證檔案複製到伺服器之後,筆者還需要將驗證檔案放到站點對應目錄,參考命令如下:

mkdir -p /website/.well-known/pki-validation  &&  cp  fileauth.txt  /website/.well-known/pki-validation/

現在筆者要驗證檔案放置的位置是否正確,筆者通過兩種方式進行了驗證,分別是手動驗證,和阿里雲驗證。

4.1.1 手動驗證

手動驗證的目的是首先確保檔案位置放置是否正確,可以通過訪問站點的url是否成功進行判斷,比如筆者可以訪問如下URL,如果返回如果頁面能夠正常開啟,並且可以看到某些值,則代表配置成功。

http://www.songboy.net/.well-known/pki-validation/fileauth.txt

4.1.2 通過阿里雲來驗證

在確保檔案放置正確之後,關鍵的是能讓阿里雲能訪問到,阿里雲這裡提供了一個檢查配置的功能,在下載驗證檔案頁面,有一個檢測配置的連結,單擊之後便可進行檢查,如下圖。

image

當點選 檢查配置 之後,如果阿里雲能夠正常訪問,則會在左側給出提示,現在可以返回證書列表,在列表中可以看到當前狀態為稽核中,如下圖

image

稽核因為不需要人為干預,所以很快就能下發證書,筆者下發證書的時間大約是2分鐘左右。

四 證書下載與配置

4.1 證書下載

證書籤發之後,可以在列表中可以看到狀態列中為 已簽發 ,同時操作欄可以下載以及檢視詳情等,如下圖所示

image

點選下載後,會跳轉到下載詳情頁面,在下載詳情頁可以選擇自己相對應的web服務,比如筆者使用nginx,當選擇nginx之後,下方還會很貼心的提示如何配置,現在筆者下載nginx配置檔案。

下載配置檔案之後,筆者需要將其解壓,解壓之後可以看見裡面包含了兩個證書檔案,如下圖所示

image

接著需要把這兩個證書檔案給複製到伺服器當中去,首先需要在伺服器建立對應的資料夾,參考命令如下

cd  /usr/local/nginx/conf/  &&  mkdir cert    #此命令在伺服器執行

在伺服器建立完成對應資料夾之後,執行命令將證書檔案複製到伺服器中,參考命令如下:

scp ~/Downloads/214905423420461/*  tangqingsong@192.168.43.34:/usr/local/nginx/conf/cert

4.2 證書配置

證書複製完成之後,可以對nginx配置檔案進行更改,使用vim命令編輯nginx配置檔案,參考命令如下:

vim /usr/local/nginx/conf/nginx.conf

在vim介面把之前http的配置部分複製一份,複製之後修改監聽的埠(listen)為443,並在其後面新增ssl的資訊,參考配置如下:

    listen 443;
    ssl on;
    ssl_certificate   cert/214905423420461.pem;
    ssl_certificate_key  cert/214905423420461.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

4.3 重啟Nginx

修改配置檔案之後,筆者需要測試nginx配置檔案是否正確,參考命令如下:

nginx -t 

當nginx如果沒有出現error相關資訊,基本配置沒有問題,下面是我的nginx返回結果:

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

nginx配置沒有問題之後,筆者需要重啟nginx讓其生效,參考命令如下

nginx -s reload

4.4 檢驗效果

現在所有該做的工作都做好了,筆者可以通過瀏覽器來訪問可以正常訪問,開啟如下URL。

https://www.xxx.com

瀏覽器位址列顯示如下圖所示

image

如果看到瀏覽器,展示安全,並且顯示綠色就說明大功告成了

五、問題分析與總結

到這裡,雖然已經成功部署了https,但是依然會產生很多附帶的問題,下面是筆者後續所遇到的幾個問題,以及解決方案。

5.1 重定向405錯誤

在部署https後,筆者很急切讓http全部重定向到https上來,這個時候可能會在nginx的配置檔案中加入下面的程式碼

return    301 https://$server_name$request_uri;

這段程式碼實際上是有缺陷的,他只能幫你重定向get請求,如果客戶端是以post請求,經過301重定向後會變成get請求,最終導致伺服器返回405的問題;

除了405問題以外,還有一個隱患,301重定向是永久重定向,在部署https的時候容易出現坑,如果使用了永久重定向,伺服器出現問題需要回滾的情況下,即使伺服器回滾了,瀏覽器依然會跳轉到https,因為有重定向快取,所以不建議使用301重定向,而應該使用302;但是302也不好去處理post請求,所以還是用307把,配置程式碼如下:

return    307 https://$server_name$request_uri;

5.2 跨域問題

啟用https證書後,會發現很多瀏覽器會存在跨域的問題,下面附帶兩種解決方法。

5.2.1 自適應協議

在http域下載入https資源瀏覽器是允許的,但是https載入http的資源,瀏覽器會阻止,所以在前端頁面中的地址最好不要指定協議,可以吧”http://”或者”https://” 使用自適應協議來替換 “//”,這樣瀏覽器將會自動呼叫對應域的資源,而不會出現https站點不能載入http資源問題,而https請求http卻出現跨域問題。

5.2.2 作用域設定

http和https並不在同一個作用域,所以當一些ajax請求時,會出現跨域問題,這個時候可以修改nginx配置檔案,將其資源的作用域擴大,把以下程式碼放到http的配置項如下:

需要注意,如果讓網站的資源讓任意作用域都可以呼叫,那麼會存在一個安全隱患,所以最好是指定幾個作用域,而不要全部放開。

    add_header `Access-Control-Allow-Origin` `*`;
    add_header `Access-Control-Allow-Credentials` `true`;
    add_header `Access-Control-Allow-Headers` `Origin, X-Requested-With, Content-Type, Accept, Connection, User-Agent, Cookie,Content-Type, Authorization`;
    add_header `Access-Control-Allow-Methods` `PUT,POST,GET,DELETE,OPTIONS`;

5.3 同時支援,分批上線

在部署https證書的時候,會遇到很多小問題,一開始筆者打算將其一步到位,後來發現小問題不斷,比如前面的跨域問題,以及301重定向問題;

這些問題看似不大,但是小問題卻比較多,因此我建議大家在上線https的時候,最好分批上線,滿足當前需求即可,不要一下子把所有http都切換過來需要注意https載入http資源被阻止的問題。


作者: 湯青松

微信:songboy8888


相關文章