同步自個人博客javascript
以前在爲公司的應用添加 https 時,是在 nginx 上配置的,這樣不須要 node 作額外的開發,可是組內的開發同窗本地一直沒有配置,一直是採用 http 的方式開發和測試。最近發現有些 case 須要 https 來複現,好比 Android 5.0 以上的 app 內,使用 https 的網站訪問 http 的內容會阻止訪問,這種問題測試的時候本地就須要一個 https 的環境。因而花了點時間學習了下本地 https 的搭建,在這裏記錄一下。java
本地開發的證書能夠本身生成一個,能夠經過如下步驟生成一個簡單的證書:node
首先,進入你想建立證書和私鑰的目錄,例如:$ cd /usr/local/nginx/conf
nginx
建立服務器私鑰,命令會讓你輸入一個口令:$ openssl genrsa -des3 -out server.key 1024
git
建立簽名請求的證書(CSR):$ openssl req -new -key server.key -out server.csr
github
nginx 的 https 配置很簡答,就是監聽 443 端口,而且添加相關的 ssl 配置。chrome
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配置問題app
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
細心的朋友可能已經看出來了,這個配置有一點問題,由於開啓了ssl:on
,致使使用 http 訪問時會報錯
The plain HTTP request was sent to HTTPS port複製代碼
後續刪掉了ssl:on
這一行,而且對443端口的監聽作了一下修改
listen 443 ssl;複製代碼
配置完https後,mac 用 chrome 打開時一直顯示證書不受信任,須要點擊確認才能繼續往下進行,而且致使個人 https 的靜態資源沒法訪問,能夠用safari打開該網頁後點擊信任