最近因爲客戶須要,購買了商業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證書文件及密鑰文件
代理商會將各類環境下的文件都給你:
先看下IIS下的證書文件:
是一個後綴爲.pfx的 微軟平臺下的 包含公鑰和私鑰的證書文件!
1):進入Windows管理控制程序:開始->cmd->MMC/MMC.exe
2):在打開的控制檯窗口中:文件->添加/刪除管理單元
3):在新窗口的左邊 可用的管理單元 中 選擇 「證書」 點擊添加 ;在新彈出的窗口中選擇 「計算機帳戶」
完成後 ,點擊肯定,返回主控制檯;
4):在 主控制檯中 根節點下 選擇 證書->我的->證書 右鍵 ->全部任務->導入!
在彈出的證書導入嚮導中 點擊下一步 選擇 供應商提供給你的 .pfx文件!點擊 下一步 填寫你的私鑰密碼!
完成後 主控制檯的我的證書 裏面會包含你的證書!
5): IIS域名綁定控制
在IIS對應的站點下,添加綁定,選擇https填寫你的域名後,選擇剛纔添加的SSL證書;點擊完成既可!
至此你的SSL證書在IIS中就配置完成了!
值得注意的是 https默認的端口爲443端口,須要防火牆設置並在外網映射此端口;
最後因爲我向經過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做爲代理,因此爲了簡單部署就沒有在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部署完畢