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

1、背景

筆者所在團隊須要開發ios的APP,而apptstore應用商店審覈須要應用使用https,因此須要配置https證書,筆者將這次配置的過程與遇到的一些問題記錄下來,方便本身和讀者後續參考。前端

2、操做概要

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

3、申請證書與認證

要搭建https服務首先需有SSL證書,證書一般是在第三方申請,在阿里雲的安全服務中有SSL證書這一項,能夠在裏面申請免費的證書;ios

也能夠在本身電腦中生成,雖然也能完成加密,可是瀏覽器是不承認的,所以最好仍是去第三方申請

3.1 證書申請

阿里雲提供免費的證書,不須要人工審覈,用來作測試是很是不錯的選擇,申請地址以下URL。nginx

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

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

image

選擇以後,一直惦記下一步,即可購買完成,免費購買證書以後筆者須要回到證書控制檯,在控制檯有一個補全信息的連接地址,須要經過此地址補充申請人的聯繫信息,參考下圖填寫ajax

image

3.2 域名驗證

補全我的信息以後,筆者還須要給阿里雲驗證當前域名是屬於本人的,驗證方式有兩種,第一種是經過dns解析認證,第二種是經過上傳驗證文件認證,筆者這裏採用的是驗證文件認證,首先須要下載文件,以下圖vim

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/

如今筆者要驗證文件放置的位置是否正確,筆者經過兩種方式進行了驗證,分別是手動驗證,和阿里雲驗證。緩存

3.2.1 手動驗證

手動驗證的目的是首先確保文件位置放置是否正確,能夠經過訪問站點的url是否成功進行判斷,好比筆者能夠訪問以下URL,若是返回若是頁面可以正常打開,而且能夠看到某些值,則表明配置成功。安全

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

3.2.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

若是看到瀏覽器,展現安全,而且顯示綠色就說明大功告成了

5、問題分析與總結

到這裏,雖然已經成功部署了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

相關文章
相關標籤/搜索