本地HTTPS環境搭建

zhe.zhang發表於2017-05-07

同步自我的部落格

之前在為公司的應用新增 https 時,是在 nginx 上配置的,這樣不需要 node 做額外的開發,但是組內的開發同學本地一直沒有配置,一直是採用 http 的方式開發和測試。最近發現有些 case 需要 https 來複現,比如 Android 5.0 以上的 app 內,使用 https 的網站訪問 http 的內容會阻止訪問,這種問題測試的時候本地就需要一個 https 的環境。於是花了點時間學習了下本地 https 的搭建,在這裡記錄一下。

生成證照

本地開發的證照可以自己生成一個,可以通過以下步驟生成一個簡單的證照:

首先,進入你想建立證照和私鑰的目錄,例如:
$ cd /usr/local/nginx/conf

建立伺服器私鑰,命令會讓你輸入一個口令:
$ openssl genrsa -des3 -out server.key 1024

建立簽名請求的證照(CSR):
$ openssl req -new -key server.key -out server.csr

配置https

nginx 的 https 配置很簡答,就是監聽 443 埠,並且新增相關的 ssl 配置。

    server {
            listen  80;
            listen  443;

            ssl on;
            ssl_certificate ssl/server.crt;
            ssl_certificate_key ssl/server.key;

    }複製程式碼

再配置好你自己的 upstream 和 location 後就可以用 https 訪問了。

這裡踩了一個坑,因為我需要新增 https 的域名是配了虛擬主機的,但是我的 ssh 卻沒有在虛擬主機裡新增,導致一開始並不能訪問,這時候學習了一下如何去查 nginx 的問題。

先確認不是瀏覽器的問題,確實是nginx配置問題

wget local.xxx.com ok
wget local.xxx.com:443 cant receive複製程式碼

然後查了一下,nginx有兩種日誌,access log 和 error log。
其中 access log 日誌記錄了哪些使用者,哪些頁面以及使用者瀏覽器、ip和其他的訪問資訊,error log 則是記錄伺服器錯誤日誌。

我先查了一下nginx的access.log 沒有日誌,再查nginx的error.log 有報錯

2017/04/18 14:07:10 [error] 18614#0: *168 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.2.1, server: 0.0.0.0:443
2017/04/18 14:07:10 [error] 18614#0: *169 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.2.1, server: 0.0.0.0:443複製程式碼

最後發現是虛擬主機中沒配ssh

無法使用http訪問

細心的朋友可能已經看出來了,這個配置有一點問題,因為開啟了ssl:on,導致使用 http 訪問時會報錯

The plain HTTP request was sent to HTTPS port複製程式碼

後續刪掉了ssl:on這一行,並且對443埠的監聽做了一下修改

listen  443 ssl;複製程式碼

mac信任證照的問題

配置完https後,mac 用 chrome 開啟時一直顯示證照不受信任,需要點選確認才能繼續往下進行,並且導致我的 https 的靜態資源無法訪問,可以用safari開啟該網頁後點選信任

相關文章