Nginx 從入門開始的網站架設 (4)

https 設定

一般在 IIS 上啟用 https 的步驟很簡單:先匯出憑證要求,接著在收到憑證之後完成憑證要求,在站台上設定新的繫結,將 443 指定到申請的憑證上的域名即可。

但是,利用 IIS 去向中華電信所申請到的憑證格式為 .cer,在 Nginx 的官網中,使用的卻是 .crt 格式,並且還多了一個一般流程中不會看到的 .key。網路上的教學大多是直接使用 openssl 去生產憑證,由於這個案子是已經有申請好的憑證,所以我們要透過一些方法來把申請到的憑證轉成 Nginx 可以使用的格式。

Nginx 官方文件對於 https 設定的說明

在 Nginx 中使用 cer 來設定 https

可以在上面那張圖片中觀察到,有兩個地方的值是粗體的黑字:ssl_certificatessl_certificate_key,這兩個部分要放的就是憑證的檔案和憑證的私密金鑰。而在這裡會有兩個問題:

  1. 如果是利用 IIS 去產生憑證要求所申請到的憑證,會沒有辦法直接得到私密金鑰,因為他會是加密過後的內容,而 Nginx 要求是不能加密的檔案。
  2. 申請所得到的憑證 .cer 沒有辦法直接使用在 Nginx 上。

在看這些問題之前,要先了解一下這幾個檔案的用途和差別:

名稱用途說明
crt憑證證書Lunix 系統上的檔案格式
cer憑證證書Windows 系統上的檔案格式
key金鑰存放公鑰或私鑰
pfx憑證證書及私鑰Windows 系統上會把 crt 和私鑰 key 放在同一個檔案內,需要有密碼才能提取

了解了這幾種不同的名詞之後,接下來就是要把我們手上有的 cer 憑證檔案轉換成 Nginx 可以接受的格式。

1. 匯出 pfx 檔案

第一個步驟,是要藉由 cer 來取得包含憑證證書和私鑰的 pfx 檔案。

  1. Windows + R 開啟 執行,輸入 mmc
  2. 檔案 > 新增或移除嵌入式管理單元,拉到最底下找到 憑證,點選後點擊中間的新增,會跳出另外一個視窗,選擇 電腦帳戶 > 本機電腦,按下完成後視窗會回到 嵌入式管理單元 這一層,確定憑證有被移動到右邊的視窗後就可以按下確定。

  1. 在憑證的目錄底下選擇 個人>憑證,如果有先在 IIS 完成憑證要求的話就可以看到原本匯入的憑證,沒有的話請先匯入。找到要匯出 pfx 檔案的憑證對他點選 右鍵 > 所有工作 > 匯出,選擇 是,匯出私密金鑰,點選兩次下一步進入 安全性 的頁面,輸入要存取 pfx 時的密碼。下一步輸入檔名後按下儲存就可以得到 pfx 檔案了。

2. 轉成 crt 檔案

有了 pfx 的下一步就是要轉換成 crtkey。轉換的方法很簡單,使用 openssl,輸入下面的指令,就可以得到這兩個檔案了:

1
2
3
4
5
# 輸出 crt
openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt

# 輸出 key
openssl pkcs12 -in server.pfx -nocerts -nodes -out server.rsa

3. 修改 nginx.conf

產出兩個檔案之後就可以進入 nginx.conf 的修改了。修改好記得要 nginx -s reload,防火牆 443 port 的部分也要記得開:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
events {
    worker_connections  4096;
}

http {
    upstream www.abc.com {
        server localhost:8082;
        server localhost:8083;
    }
	
    server {
        # 因為是正式的環境,防火牆也需要申請,所以改成監聽原本 IIS 監聽的 80 port
        listen              80;
        server_name         www.abc.com;
		
        location / {
            # 將 http 轉導到 https
            return          301     https://$host$request_uri;
        }
    }
	
    server {
	listen              443 ssl;
        server_name         www.abc.com;
        ssl_certificate     server.crt;
        ssl_certificate_key server.rsa;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
	
	location / {
            proxy_pass                 http://guideapp.npm.gov.tw;
            
            # 以下為 proxy 的詳細設置,可以參考下列網站的說明
            # https://www.cnblogs.com/kevingrace/p/8269955.html
            proxy_http_version         1.1;
            proxy_set_header           Upgrade $http_upgrade;
            proxy_set_header           Connection keep-alive;
            proxy_set_header           Host $host;
            proxy_cache_bypass         $http_upgrade;
            proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

參考資料

Built with Hugo
Theme Stack designed by Jimmy