最近由於客戶需要,購買了商業SSL證書需要配置!
由於我的網站主域名是部署在IIS下,所以先講解下IIS下的配置過程; 后面由於二級域名的系統在tomcat下,所以又將SSL遷移到了Nginx下!
整體結構如下圖:
先百度兩個名詞概念(具體可以另行查閱):
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer):是以安全為目標的HTTP通道;用於安全的HTTP數據傳輸!HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)!HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL!它只能確保你的數據從客戶端發送到服務端的傳輸過程是安全的,並不能保障你的服務器安全性!
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密
SSL證書:SSL證書是數字證書的一種,因為配置在服務器上,也稱為SSL服務器證書。
ssl證書分類
擴展驗證型(EV:Extended Validation SSL)SSL證書
組織驗證型(OV:Organization Validation SSL)SSL證書
域名驗證型(DV:Domain Validation SSL)SSL證書
我們買的是OV版 通配型 即支持二級域名使用!
先看下https和ssl證書的展現效果:
當網站使用SSL證書時,客戶端會自動識別 出現 安全鎖標識!告訴你這是個可信任站點!
這里可以看到 SSL證書的加密算法為強度256位的RSA非對稱加密!並可以看到證書的使用者、頒發者、有效期等相關的信息!
具體的配置過程
由於是購買的商業證書,所以要配合代理商完成證書申請,並按照要求完成域名驗證!最終會下發SSL證書文件及密鑰文件
代理商會將各種環境下的文件都給你:
一、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部署完畢