Nginx https反向代理web應(yīng)用服務(wù)器

在平時的開發(fā)過程中,為web應(yīng)用添加https訪問能提高一定的安全性。Https是http的安全版本,即在http協(xié)議中加入SSL認(rèn)證,主要區(qū)別有以下幾點(diǎn):

  • https協(xié)議需要引入CA申請證書(測試時可以自認(rèn)證),一般免費(fèi)證書很少,需要交費(fèi)。
  • http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的加密傳輸協(xié)議。
  • http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
  • http的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。

關(guān)于SSL安全認(rèn)證的詳細(xì)概念,參考SSL 與 數(shù)字證書 的基本概念和工作原理

SSL證書生成

申請SSL證書的時候,發(fā)行機(jī)構(gòu)會要求你提供一個CSR(Certificate Signing Request)文件,這個文件包含了發(fā)行機(jī)構(gòu)需要的所有信息。在生成CSR之前,我們必須先創(chuàng)建密鑰對,這個過程可以使用多種工具完成,例如Jdk自帶的keytool或者openssl:

openssl req -new -newkey rsa:2048 -sha256 -nodes -out myan.csr -keyout myan.key

以上命令通過openssl生成csr和key文件,其中csr用于證書申請,key文件用于證書認(rèn)證。具體參數(shù)含義:

  1. RSA算法加密強(qiáng)度是2048位
  2. 證書的數(shù)字摘要算法使用Sha2
  3. 這個命令還有一個subj參數(shù),不加這個參數(shù)的情況下會使用交互命令的形式提示輸入機(jī)構(gòu)的基本信息:
Generating a 2048 bit RSA private key
................................................................................  
........................................+++
.....................................+++
writing new private key to 'myan.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:XA
Locality Name (eg, city) []:XA
Organization Name (eg, company) [Internet Widgits Pty Ltd]:myan Org
Organizational Unit Name (eg, section) []:myan
Common Name (e.g. server FQDN or YOUR name) []:myan.org
Email Address []:myanzhcn@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:******
An optional company name []:

challenge password是一個二次認(rèn)證密碼,不是加密證書的密碼,需要證書發(fā)行廠商支持。
現(xiàn)在我們持有了csr和key文件,有兩種方式獲得可用的安全證書:提交給CA廠商認(rèn)證,或者自己認(rèn)證。測試情況下,使用openssl自認(rèn)證即可:

 openssl req -x509 -days 1024 -key myan.key -in myan.csr > myan.crt

這個crt文件即可用于Nginx服務(wù)器進(jìn)行SSL認(rèn)證。

Nginx基本配置

Nginx是一個高性能的http和反向代理服務(wù)器,由于我們的應(yīng)用一般部署在web服務(wù)器上,nginx不支持直接執(zhí)行應(yīng)用程序,因此需要啟用nginx的反向代理。這樣,只需要nginx啟用https即可,應(yīng)用服務(wù)器與nginx之間的通訊使用普通http協(xié)議即可。
假設(shè)我們的web應(yīng)用在8080端口啟動,則nginx需要監(jiān)聽443端口來反向代理8080端口,使用的版本是1.10.3,核心配置如下:

server {
        listen 443 ssl;
        ssl on;
        listen [::]:443 ssl;
        server_name  www.example.com;

        ssl_certificate D:/myan.crt;
        ssl_certificate_key D:/myan.key;
       
        location / {
            proxy_pass http://localhost:8080;

            #ssl settings
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;

            #settings
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_max_temp_file_size 0;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

值得注意的是,nginx將https請求轉(zhuǎn)為http請求發(fā)送給web應(yīng)用服務(wù)器,因此需要指定特殊的頭消息來告訴應(yīng)用服務(wù)器已經(jīng)被https代理。

Web應(yīng)用服務(wù)器配置

本文使用Spring boot的內(nèi)嵌tomcat作為應(yīng)用服務(wù)器,由于已經(jīng)被nginx代理,因此協(xié)議基本信息需要從http頭信息中去獲取,而不是解析HttpServletRequest。在application.properties文件中添加配置:

server.tomcat.remote_ip_header=x-forwarded-for
server.use-forward-headers=true

需要注意的是, Spring boot在啟動應(yīng)用服務(wù)器時如果不指定server.address屬性,則默認(rèn)使用0.0.0.0,此時外部客戶端還是可以通過8080端口訪問web應(yīng)用。因此,需要額外指定這個屬性,禁掉外部訪問:

server.address=127.0.0.1
https.png

在訪問網(wǎng)站時,會提示安全證書不受信任(證書是自己認(rèn)證的,瀏覽器當(dāng)然不認(rèn)識)。導(dǎo)入這個證書到受新任的安全證書列表中,再訪問網(wǎng)站就不會有紅色標(biāo)記提示了。


import.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 摘要 本文主要是在測試https服務(wù)時對搭建https服務(wù)器的一些實(shí)踐總結(jié)。TLS協(xié)議的介紹部分來源于對RFC52...
    東方胖閱讀 8,636評論 0 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • WWDC 16 中,Apple 表示將繼續(xù)在 iOS 10 和 macOS 10.12 里收緊對普通 HTTP 的...
    小如99閱讀 6,384評論 0 25
  • 轉(zhuǎn)載:https://help.aliyun.com/knowledge_detail/5974693.html?...
    meng_philip123閱讀 1,742評論 1 12
  • 找找以前寫的一些文字, 發(fā)出來以后不用再找一次。 有些人, 一生注定只能見一次。 1、 人是人非,曾經(jīng)的不忘。 人...
    天下醉丶閱讀 202評論 0 0

友情鏈接更多精彩內(nèi)容