Nginx部署HTTPS服務過程與異常處理實踐
一、背景
筆者所在團隊需要開發ios的APP,而apptstore應用商店稽核需要應用使用https,所以需要配置https證書,筆者將此次配置的過程與遇到的一些問題記錄下來,方便自己和讀者後續參考。
二、操作概要
- 申請證書與認證
- 證書下載與配置
- 問題分析與總結
三、申請證書與認證
要搭建https服務首先需有SSL證書,證書通常是在第三方申請,在阿里雲的安全服務中有SSL證書這一項,可以在裡面申請免費的證書;
也可以在自己電腦中生成,雖然也能完成加密,但是瀏覽器是不認可的,因此最好還是去第三方申請
3.1 證書申請
阿里雲提供免費的證書,不需要人工稽核,用來做測試是非常不錯的選擇,申請地址如下URL。
https://common-buy.aliyun.com/?spm=5176.2020520163.cas.1.1aa12b7aWWn20O&commodityCode=cas#/buy
免費型的證書隱藏的比較深,想要申請免費證書需要先選擇 1個域名->Symantec->免費型 ,所以讀者這裡需要注意一下,如下圖參考。
選擇之後,一直惦記下一步,便可購買完成,免費購買證書之後筆者需要回到證書控制檯,在控制檯有一個補全資訊的連結地址,需要通過此地址補充申請人的聯絡資訊,參考下圖填寫
3.2 域名驗證
補全個人資訊之後,筆者還需要給阿里雲驗證當前域名是屬於本人的,驗證方式有兩種,第一種是通過dns解析認證,第二種是通過上傳驗證檔案認證,筆者這裡採用的是驗證檔案認證,首先需要下載檔案,如下圖
在下載驗證檔案完成之後,筆者需要把檔案放到伺服器中去,這裡提供一條複製命令
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 通過阿里雲來驗證
在確保檔案放置正確之後,關鍵的是能讓阿里雲能訪問到,阿里雲這裡提供了一個檢查配置的功能,在下載驗證檔案頁面,有一個檢測配置的連結,單擊之後便可進行檢查,如下圖。
當點選 檢查配置 之後,如果阿里雲能夠正常訪問,則會在左側給出提示,現在可以返回證書列表,在列表中可以看到當前狀態為稽核中,如下圖
稽核因為不需要人為干預,所以很快就能下發證書,筆者下發證書的時間大約是2分鐘左右。
四 證書下載與配置
4.1 證書下載
證書籤發之後,可以在列表中可以看到狀態列中為 已簽發 ,同時操作欄可以下載以及檢視詳情等,如下圖所示
點選下載後,會跳轉到下載詳情頁面,在下載詳情頁可以選擇自己相對應的web服務,比如筆者使用nginx,當選擇nginx之後,下方還會很貼心的提示如何配置,現在筆者下載nginx配置檔案。
下載配置檔案之後,筆者需要將其解壓,解壓之後可以看見裡面包含了兩個證書檔案,如下圖所示
接著需要把這兩個證書檔案給複製到伺服器當中去,首先需要在伺服器建立對應的資料夾,參考命令如下
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
瀏覽器位址列顯示如下圖所示
如果看到瀏覽器,展示安全,並且顯示綠色就說明大功告成了
五、問題分析與總結
到這裡,雖然已經成功部署了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
相關文章
- 異常處理過程
- 某次BW 異常處理過程
- 異常處理最佳實踐
- Android 異常處理最佳實踐Android
- [翻譯]-異常處理最佳實踐
- Node.js + Nginx 部署 HTTPS 服務Node.jsNginxHTTP
- MySQL儲存過程的異常處理方法MySql儲存過程
- 從 node服務部署,到https配置與nginx轉發HTTPNginx
- .NET中異常處理的最佳實踐
- 20個異常處理的最佳實踐
- Java中的異常處理最佳實踐Java
- 異常處理與異常函式函式
- 處理Java異常的9個最佳實踐Java
- Java異常處理的9個最佳實踐Java
- React Error Boundary 元件異常處理方案實踐ReactError元件
- 處理Java異常的10個最佳實踐Java
- .NET中異常處理的最佳實踐(譯)
- MVC使用異常過濾器處理異常MVC過濾器
- Java 異常表與異常處理原理Java
- 異常處理機制(二)之異常處理與捕獲
- 深入理解 HTTPS 原理、過程與實踐HTTP
- 服務端執行部署好的CLR儲存過程時出現如下異常服務端儲存過程
- 一次資料庫異常的處理過程資料庫
- fastHttp服務端處理請求的過程ASTHTTP服務端
- Java異常處理最佳實踐及陷阱防範Java
- Spring Boot統一異常處理最佳實踐Spring Boot
- Windows平臺Nginx部署https網站的過程WindowsNginxHTTP網站
- windows核心程式設計---未處理異常,向量化異常處理與C++異常Windows程式設計C++
- 異常篇——異常處理
- MySQL 儲存過程定義條件和異常處理MySql儲存過程
- https理論與實踐HTTP
- 異常處理
- 異常處理與推導式
- 異常處理遇到過的那些坑
- oracle 儲存過程遊標中處理並記錄異常Oracle儲存過程
- java專案部署異常解析及處理方案Java
- 實踐探討Python如何進行異常處理與日誌記錄Python
- Java 理論與實踐: 關於異常的爭論Java