1. 程式人生 > >Windows下Nginx配置支援HTTPS協議(已申請正式的SSL證書和私鑰的,前三步可以跳過)

Windows下Nginx配置支援HTTPS協議(已申請正式的SSL證書和私鑰的,前三步可以跳過)

以Windows 10系統為例。

一、安裝OpenSSL

然後安裝在C:\OpenSSL-Win64下。

然後配置環境變數。在系統環境變數中新增環境變數:

變數名:OPENSSL_HOME

變數值:C:\OpenSSL-Win64\bin;

(變數值為OPENSSL安裝位置下的bin目錄)

並在Path變數結尾新增一條: %OPENSSL_HOME%

二、安裝Nginx

Nginx官網下載Nginx,我這裡下載的是 nginx/Windows-1.12.0 這個版本。

把下載好的壓縮包解壓出來,拷貝其中的nginx-1.12.0目錄到c:\下。並將資料夾名字修改為nginx。這樣,Nginx就被安裝到了c:\nginx目錄下。

進入到C:\nginx目錄下,雙擊nginx.exe檔案即可啟動伺服器。在瀏覽器位址列輸入http://localhost,如果可以成功訪問到Nginx的歡迎介面,則說明安裝成功。

三、生成證書  

1、首先在Nginx安裝目錄中建立ssl資料夾用於存放證書。比如我的檔案目錄為 C:\nginx\ssl

在控制檯中執行:

cd C:\nginx\ssl

2、建立私鑰

在命令列中執行命令:

openssl genrsa -des3 -out test.key 1024     # test檔名是自己隨便起即可

輸入密碼後,再次重複輸入確認密碼。記住此密碼,後面會用到。

3、建立csr證書

在命令列中執行命令:

openssl req -new -key test.key -out test.csr

其中key檔案為剛才生成的檔案。

執行上述命令後,需要輸入一系列的資訊。輸入的資訊中最重要的為Common Name,這裡輸入的域名即為我們要使用https訪問的域名 ,比如我輸入的是localhost。其它的內容隨便填即可。

以上步驟完成後,ssl資料夾內出現兩個檔案:test.csr 和 buduhuis.key

4、去除密碼。

在載入SSL支援的Nginx並使用上述私鑰時除去必須的口令,否則會在啟動nginx的時候需要輸入密碼。

複製test.key並重命名為test.copy.key。

在命令列中執行如下命令以去除口令:

openssl rsa -in test.copy.key -out test.key

然後輸入密碼,這個密碼就是上文中在建立私鑰的時候輸入的密碼。

5、生成crt證書

在命令列中執行此命令:

openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt

至此,證書生成完畢。我們發現,ssl資料夾中一共生成了4個檔案。下面,配置https伺服器的時候,我們需要用到的是其中的test.crt和test.key這兩個檔案。

四、修改Nginx的nginx.conf配置檔案

我的這個檔案在C:\nginx\conf目錄下。用任意一個編輯器(如Sublime Text之類)開啟這個nginx.conf檔案。

找到HTTPS server配置的那一段(即包含有listen 443 ssl配置那一段)。我們發現這段程式碼被註釋掉了。所以,首先我們把該段程式碼前面的#號去掉。然後分別修改其中的ssl_certificate和ssl_certificate_key配置項為剛才所生成的test.crt和test.key這兩個檔案的目錄。並配置server_name為localhost。修改後的該段配置如下:

server {
    listen       443 ssl;
    server_name  localhost;

    ssl_certificate      C://nginx//ssl//test.crt;  # 這個是證書的crt檔案所在目錄
    ssl_certificate_key  C://nginx//ssl//test.key;  # 這個是證書key檔案所在目錄

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
      root   html;                  # 這個是指定一個專案所在目錄
      index  index.html index.htm;  # 這個是指定首頁的檔名
    }
}

注意一下那兩個證書的檔案路徑的寫法。

五、Nginx的常用操作

在繼續後面的內容之前,先簡單介紹下Windows命令列中操作Nginx的幾個常用的語句:

start nginx               # 啟動Nginx
nginx.exe -s stop         # 快速停止Nginx,可能並不儲存相關資訊
nginx.exe -s quit         # 完整有序的停止Nginx,並儲存相關資訊
nginx.exe -s reload       # 重新載入Nginx,當配置資訊修改,需要重新載入這些配置時使用此命令。
nginx.exe -s reopen       # 重新開啟日誌檔案
nginx -v                  # 檢視Nginx版本

因為修改了配置檔案,所以需要退出控制檯,並重新開啟一個控制檯。執行如下命令:

cd c:\nginx
nginx.exe -s quit
start nginx

即退出Nginx,然後再重新啟動它。這時候,在瀏覽器位址列輸入https://localhost並回車。

這時候,你可能看到“您的連線不是私密連線”的提示,單擊頁面中的“高階”,並接著單擊“繼續前往m.test.com(不安全)”,就可以看到Nginx的歡迎介面了。說明https伺服器已經配置成功了。

如果你只想用https://localhost訪問這個https伺服器,那麼下面的內容你就不用接著往下看了。

但是,也許你可能還想要用一個別的域名(例如:https://m.test.com)來訪問這個伺服器。那麼怎麼做呢?這就需要繼續往下看了。

六、修改hosts配置,實現域名對映

要想用別的域名來訪問上文配置好的https伺服器,也很簡單,修改hosts配置就可以了。你可以到這裡下載一個hosts管理工具——SwitchHosts。安裝號好之後,以管理員身份執行它。並新增上一個hosts項:

127.0.0.1  m.test.com

順便提一下,關於Mac環境下如何對映一個http路徑到一個https路徑,可以通過Charles工具來實現。參見這裡

七、可能遇到的問題及其解決辦法

1、埠被佔用

完成上述工作之後,在啟動nginx的時候,可能提示埠被佔用或者雖然沒有出錯提示,但是訪問https頁面卻訪問不到的情況,這時候,你需要檢查一下443埠是否已經被佔用了。

可以用如下命令檢視:

netstat -ano | findstr 443

一般來說,如果有程式在佔用的話,輸出的第一行的最後一列就是佔用了443埠的PID。

找到這個PID之後,我們就用如下命令強制結束它:

taskkill /F /IM 這裡輸入上面找出來的PID

2、出現錯誤提示:“您的連線不是私密連線”

點選頁面最底部的“高階”,然後點“繼續前往WALLET.WALLET.COM(不安全)”

3、靜態的頁面資源在開發者工具的Network中顯示的Status為failed

可以在開發者工具的Network中的該資源上右鍵單擊它,然後選擇“Open in new tab”,接著會提示“您的連線不是私密連線”,然後按照上面的問題2的處理方式進行處理就可以了。本質上與上一個問題是同樣的問題,只不過因為你的靜態資源域名和頁面域名用的不是同一個罷了。

4、忘記配置hosts,導致訪問到的不是你本機上的服務的問題

只需要配置好host就可以了。注意,如果你的頁面域名、靜態資源域名兩者是不一樣的話,那麼兩者都需要配置hosts中,比如:

127.0.0.1 m.paian.com 127.0.0.1 static.pain.com

5、出現許可權不足的問題

這時候,你只需要以管理員身份開啟命令列工具,再正常進行操作即可。