Nginx ssl 雙向認證 正向代理 https

Nginx之SSL雙向認證的正向代理設定實例

陳膺傑 2020/12/30 18:05:25
3303

1. 正向代理與反向代理

正向代理與反向代理都是代理伺服器,所處的位置都是在於客戶端與真實伺服器之間,所做的事情也都是把客戶端的請求轉發給伺服器,再把伺服器的響應轉發給客戶端,但是二者之間還是有一定的差異的。

 

1.1 正向代理伺服器

是客戶端的代理,幫助客戶端存取無法直接訪問的目標伺服器資源,客戶端可明確知道要訪問的目標網址,通常架設在客戶端,主要是用來解決訪問上限制的問題。

 

1.2 反向代理伺服器

是伺服器端的代理,幫助伺服器做負載均衡、安全防護,客戶端無法得知真實伺服器所在,通常架設在伺服器端,主要是用來做負載均衡及安全防護。

 

 

2. 準備自簽測試憑證

2.1 下載OpenSSL工具

https://www.openssl.org/

 

2.2 OpenSSL設定
2.2.1 建立產生憑證所需目錄

◎ 請於安裝完成後之bin目錄下建立目錄demoCA

◎ 請於目錄demoCA建立目錄newcerts

◎ 請於目錄demoCA下建立2個檔案index.txt和serial

◎ 請編輯檔案serial,輸入自簽憑證之初始序號(請自編流水號,Ex.代號+yyyymmdd)

◎ 每次以根憑證簽發成功後,序號會自動+1,並記錄至index.txt和newcerts

 

2.3 建立CA根憑證

● -subj的參數請自行調整為單位適合的名稱

     ◎ C:國家或地區名稱

     ◎ ST:州/省

     ◎ L:州/省

     ◎ O:組織

     ◎ OU:組織單位

     ◎ CN:通用名稱

● 根憑證金鑰長度為4096,效期為10年

語法如下:

openssl req -x509 -subj "/C=TW/ST=Taipei/L=Taipei/O=TPI/OU=TPI/CN=Thinkpower Root CA" -new -sha256 -newkey rsa:4096 -keyout ThinkpowerCA.key -out ThinkpowerCA.cer -days 3650

 

2.4 建立伺服器憑證與憑證請求檔

● -subj的參數請自行調整為單位適合的名稱,欄位說明請參考【2.3建立CA根憑證】

● 語法如下:

openssl genrsa -out ThinkpowerServer.key 2048

openssl req -subj "/C=TW/ST=Taipei/L=Taipei/O=TPI/OU=TPI/CN=Thinkpower Server" -new -sha256 -key ThinkpowerServer.key -out ThinkpowerServer.csr

 

2.5 簽發自我憑證

● 語法如下:

openssl x509 -req -in ThinkpowerServer.csr -CA ThinkpowerCA.cer -CAkey ThinkpowerCA.key -CAcreateserial -out ThinkpowerServer.cer -days 730 -sha256

 

● 顯示憑證用途,語法如下:

openssl x509 -purpose -in ThinkpowerServer.cer -inform PEM

 

3. Nginx設定

Nginx需先升級為1.18版以上,方可支援此正向代理SSL憑證模組。(Nginx官方說明文件上標示「proxy_ssl_certificate」及「proxy_ssl_certificate_key」設定於1.7.8版本開始支援,但經實測,在1.12.2版上雖然可進行設定,但卻無法產生SSL雙向認證的結果,升級至1.18版後才可正常訪問SSL雙向認證之網站)

3.1 正向代理SSL憑證設定

# TPI Server

server {

        listen       8300; # 監聽port號

        location / {

            proxy_pass https://xxx.xxx.com.tw; # 代理位置

            proxy_ssl_certificate ./ThinkpowerServer.cer; # 自我憑證檔路徑

            proxy_ssl_certificate_key ./ThinkpowerServer.key; # 自我憑證檔密鑰路徑

        }

        error_page 404 /404.html;

            location = /40x.html {

        }

        error_page 500 502 503 504 /50x.html;

            location = /50x.html {

        }

    }

 

 

4. 參考連結

● https://www.openssl.org/

● https://kknews.cc/tech/k66p2gb.html

● http://nginx.org/en/docs/http/ngx_http_proxy_module.html

陳膺傑