Nginx下配置SSL證書 調轉到IIS、tomcat二級站點

最近因爲客戶須要,購買了商業SSL證書須要配置!  css

因爲個人網站主域名是部署在IIS下,因此先講解下IIS下的配置過程; 後面因爲二級域名的系統在tomcat下,因此又將SSL遷移到了Nginx下!html

總體結構以下圖:java

  

先百度兩個名詞概念(具體能夠另行查閱):

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer):是以安全爲目標的HTTP通道;用於安全的HTTP數據傳輸!HTTPS存在不一樣於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)!HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL!它只能確保你的數據從客戶端發送到服務端的傳輸過程是安全的,並不能保障你的服務器安全性!nginx

SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通訊提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡鏈接進行加密算法

SSL證書:SSL證書是數字證書的一種,由於配置在服務器上,也稱爲SSL服務器證書。apache

ssl證書分類windows

擴展驗證型(EV:Extended Validation SSL)SSL證書瀏覽器

組織驗證型(OV:Organization Validation SSL)SSL證書tomcat

域名驗證型(DV:Domain Validation SSL)SSL證書安全

咱們買的是OV版 通配型 即支持二級域名使用!

 

先看下https和ssl證書的展示效果:

 

 

當網站使用SSL證書時,客戶端會自動識別 出現 安全鎖標識!告訴你這是個可信任站點!

 

 

這裏能夠看到 SSL證書的加密算法爲強度256位的RSA非對稱加密!並能夠看到證書的使用者、頒發者、有效期等相關的信息!

 

具體的配置過程

因爲是購買的商業證書,因此要配合代理商完成證書申請,並按照要求完成域名驗證!最終會下發SSL證書文件及密鑰文件

代理商會將各類環境下的文件都給你:

 

 

1、IIS下配置SSL證書

先看下IIS下的證書文件:

 

 

是一個後綴爲.pfx的 微軟平臺下的 包含公鑰和私鑰的證書文件!

 

1):進入Windows管理控制程序:開始->cmd->MMC/MMC.exe

2):在打開的控制檯窗口中:文件->添加/刪除管理單元

3):在新窗口的左邊 可用的管理單元 中 選擇 「證書」 點擊添加 ;在新彈出的窗口中選擇 「計算機帳戶」

  

 

完成後 ,點擊肯定,返回主控制檯;

4):在 主控制檯中 根節點下 選擇 證書->我的->證書 右鍵 ->全部任務->導入!

 

 

在彈出的證書導入嚮導中 點擊下一步 選擇 供應商提供給你的 .pfx文件!點擊 下一步 填寫你的私鑰密碼!

 

完成後 主控制檯的我的證書 裏面會包含你的證書!

 

5): IIS域名綁定控制

  

 

 

在IIS對應的站點下,添加綁定,選擇https填寫你的域名後,選擇剛纔添加的SSL證書;點擊完成既可!

 

至此你的SSL證書在IIS中就配置完成了!

 

值得注意的是 https默認的端口爲443端口,須要防火牆設置並在外網映射此端口;

 

 

二:nginx下配置SSL證書 跳轉到IIS站點

 最後因爲我向經過nginx反向代理到網站 並配置SSL證書,因此過程以下!

1:關閉IIS中配置的 80、443 兩個端口的綁定;只保留一個內網端口綁定!

2:從nginx官網下載最新的 安裝文件!能夠參考其它的配置手冊;

下載地址:http://nginx.org/en/download.html

 

  關於nginx版本的選擇: 這裏默認推薦最新版本的nginx-1.12.2版本,可是因爲客戶不少是使用IE8的羣體,可是nginx1.11.0以後的版本不支持SSL證書的 3DES弱安全配置;因此我這裏選擇了 1.10.3的版本!

 

3:將供應商提供的 xxx.key 和 xxx.crt 文件拷貝到 nginx的 conf配置文件目錄下

而後配置nginx.conf配置文件; 其它參照默認配置,此處增長 https server;

#門戶網站HTTPS配置

server {

    listen 443;

    server_name www.xxxdomain.com;

    ssl on;

    ssl_certificate _.xxxdomain.com_bundle.crt;

    ssl_certificate_key _.xxxdomain.com.key;

 

    ssl_session_cache shared:SSL:1m;

    ssl_session_timeout 5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers ECDH:AESGCM:HIGH:RSA+3DES:!RC4:!DH:!MD5:!aNULL:!eNULL;

    ssl_prefer_server_ciphers on;

 

    location / {

        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_pass http://192.168.1.35:88;

        client_max_body_size 1000m;

    }

}

 

 

此配置爲支持xp系統下ie8的https訪問; 若拋棄xp系統下的ie8可 使用最新的nginx版本 並配置ssl_ciphers以下:

ssl_ciphers AWSGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;

 

注意此時必定要檢查80、443端口的防火牆開啓狀況!在入站規則中進行配置!

 

4:nginx將http請求強制轉到https地址

在nginx中 增長server以下:

#http請求強行轉到https

server {

    listen 80 default_server;

    server_name www.xxxdomain.com xxxdomain.com;

    rewrite ^/(.*) https://$server_name$request_uri? permanent;

}

 

三:nginx配置https跳轉到tomcat二級域名站點

  由於使用了nginx做爲代理,因此爲了簡單部署就沒有在tomcat上部署ssl證書了!由nginx和用戶創建連接,並完成ssl握手,而後將請求以http協議轉發給tomcat;tomcat響應內容經過nginx進行ssl加密返回給客戶端!

  按照nginx的配置,增長如下server內容:

server {
    listen 443;
    server_name AA.xxxdomain.com;
    ssl on;
    ssl_certificate _.xxxdomain.com_bundle.crt;
    ssl_certificate_key _.xxxdomain.com.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH:AESGCM:HIGH:RSA+3DES:!RC4:!DH:!MD5:!aNULL:!eNULL;
    ssl_prefer_server_ciphers on;

    location / {
        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_set_header X-Forwarded-Proto $scheme; 
        proxy_pass http://192.168.1.32:8181;
    }
}
    

  

tomcat配置

在tomcat的server.xml 的 Engine 模塊下配置一個 Value:

<Engine name="Catalina" defaultHost="localhost">

    <Valve className="org.apache.catalina.valves.RemoteIpValve"

        remoteIpHeader="X-Forwarded-For"

        protocolHeader="X-Forwarded-Proto"

        protocolHeaderHttpsValue="https" />

</Engine>

#X-Forwarded-For 得到實際用戶的 IP

#X-Forwarded-Proto 識別實際用戶發出的協議是 http 仍是 https    

這樣配置後就能夠經過https方式訪問二級域名站點了;https://AA.xxxdomain.com

 

部署過程當中遇到的問題:

1):http的js,css 等靜態資源被瀏覽器攔截沒法訪問

由於經過代理 模式,tomcat沒法區分用戶是經過https仍是http訪問的!默認使用了http響應了靜態資源,就出現了沒法訪問的現象!

解決方法:tomcat 和nginx 雙方都增長配置X-Forwarded-Proto ;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;#實際用戶的 IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #實際用戶的 IP

proxy_set_header X-Forwarded-Proto $scheme; #實際的協議 http還 https

這些配置能夠保障代碼中request對象可以獲取到用戶的真實請求信息

 

2):端口使用問題

須要tomcat中配置redirectPort、proxyPort爲443端口;若是使用非443端口則須要在上面的Value中增長httpsServerPort指定端口

<Connector port="8181" protocol="HTTP/1.1"

    connectionTimeout="20000"

    redirectPort="443"

    proxyPort="443" />

<Engine name="Catalina" defaultHost="localhost">

<Valve className="org.apache.catalina.valves.RemoteIpValve"

    remoteIpHeader="X-Forwarded-For"

    protocolHeader="X-Forwarded-Proto"

    protocolHeaderHttpsValue="https" httpsServerPort="443"/>

    若是非443端口 須要添加httpsServerPort 指定對應端口

</Engine>

 

3):nginx upstream timed out 問題

在部署好以後,系統能夠訪問,可是很是慢,須要幾十秒,可是http返回狀態仍然是200!

錯誤日誌:

upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after
a period of time, or established connection failed because connected host has failed to respond)
while reading response header from upstream, client: 115.193.163.195, server: AA.domain.com,
request: "POST /dataTrans/translogList HTTP/1.1", upstream: "http://[::]:8181/dataTrans/translogList",
host: "AA.domain.com", referrer: "https://AA.domain.com//dataTrans/index"

 

查了下具體是由於:nginx配置代理地址:proxy_pass http://localhost:8181;windows 把 localhost 解析爲 ipv6 地址 ::1 用於本地迴路測試了,因此會致使超時,若是使用ipv4的地址,速度就能夠了!

將 proxy_pass http://localhost:8181; 改成 proxy_pass http://127.0.0.1:8181;

 

至此全部站點HTTPs部署完畢

相關文章
相關標籤/搜索