最近在做網(wǎng)站SSL升級,看似簡單的操作還是會遇到各種問題,現(xiàn)在和大家分享一下。
公司是創(chuàng)業(yè)公司,為了省成本準(zhǔn)備申請免費(fèi)證書,對比了一些證書商,最后選擇使用沃通wosign提供的證書服務(wù),發(fā)現(xiàn)有不同配置的證書可以選擇:
EV SSL: 擴(kuò)展驗證型SSL(Extended Validation SSL)
OV SSL: 機(jī)構(gòu)驗證型SSL(Organization Validation SSL)
DV SSL: 域名驗證型SSL(Domain Validation SSL)
證書配置不同瀏覽器信任級別也不同,低配證書在瀏覽器安全級別設(shè)置過高時可能會有安全警告。
沒有錢,先選免費(fèi)的DV型證書用著,等后續(xù)有財力后可以再提升配置,按流程申請好會有一個回執(zhí)訂單,下載即可。
https比 http 要消耗更多cpu資源(主要是在建立連接,之后還要對內(nèi)容加密),所以對普通網(wǎng)站,只需要對部分地方采用https即可,大部分開放內(nèi)容是沒必要的。不過我們的業(yè)務(wù)場景為了提高網(wǎng)站可信度,采用的是全站https方案。
應(yīng)用服務(wù)器用的Nginx + Tomcat,只需要針對nginx這一側(cè)實現(xiàn)ssl即可(nginx和tomcat處于同一個局域網(wǎng)內(nèi),安全問題暫時忽略)用戶首先和Nginx建立連接,完成SSL握手,而后Nginx 作為代理以 http 協(xié)議將請求轉(zhuǎn)給 tomcat 處理,Nginx再把 Tomcat的輸出通過SSL 加密發(fā)回給用戶,Tomcat只是在處理 http 請求而已。因此,這種情況下不需要配置 Tomcat 的SSL,只需要配置 Nginx 的SSL。
nginx詳細(xì)配置
上線之前先本地環(huán)境測試,證書和本地域名不一致可以先手工添加列外,先驗證功能。
upstream mytomcats { server 127.0.0.1:8080; } server { listen 80; server_name local.domain.com; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 443 ssl; ssl on; server_name local.domain.com; ssl_certificate D:\\workspace\\nginx-1.6.3\\security\\local.crt; ssl_certificate_key D:\\workspace\\nginx-1.6.3\\security\\local.key; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; client_max_body_size 10m; client_body_buffer_size 128k; 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; location ~* \.(jpg|gif|png|swf|svg|map|ttf|woff|woff2|eot|otf|ico|txt|jpeg|html|htm|css|js|json|bmp)$ { root D:\\workspace\\code\\main-server\\WebContent; } location / { proxy_pass http://mytomcats; 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 https; } }
本地服務(wù)運(yùn)行后,https可以訪問到站點(diǎn),但是發(fā)現(xiàn)很多樣式和圖片出不來,排查發(fā)現(xiàn)我們很多靜態(tài)文件有用到upyun提供的CDN服務(wù),upyun的訪問地址還是用的http,頁面中存在混很內(nèi)容,導(dǎo)致部分資源加載失敗。
混合內(nèi)容是指:在https的頁面中混合了非https的資源請求,比如圖片、css、js 等等。
(1)在http頁面混有https內(nèi)容時,頁面排版不會發(fā)生亂排現(xiàn)象
(2)在https頁面,只有包含以http方式引入的資源(如圖片,js等)時,才算作混合內(nèi)容
只有頁面本身和所有引用的資源都是 https 的瀏覽器才認(rèn)為是安全的,只要其中引用了非安全資源(即使圖片),瀏覽器都會給出不安全的提示,特別是有 js 的情況。如果瀏覽器提示不安全,那樣我們就達(dá)不到原來目的了。我們費(fèi)了半天功夫去申請 SSL 證書,配置Web服務(wù)器,最后如果因為混合內(nèi)容而前功盡棄就太不值了。火狐瀏覽器混合顯示內(nèi)容會這樣指示:
混合腳本執(zhí)行時整個原始頁面會受到影響,原因是瀏覽器阻止混合內(nèi)容的加載。
于是乎又要去解決這個混合內(nèi)容的問題,先配置好upyun https訪問,upyun地址我們添加的二級域名,發(fā)現(xiàn)之前申請的證書只能和主域名綁定用不了,重新針對這個二級域名再申請一個免費(fèi)的證書,然后在upyun側(cè)配置好SSL。
這里了解到證書對域名的支持有泛域名證書和多域名證書,
泛域名證書支持所有二級域名*.domain.com,
多域名證書可以支持www.domain.com、www.domain.cn、www.domain.net
混合內(nèi)容解決好后本地跑通OK,部署上線,打開網(wǎng)站發(fā)現(xiàn)訪問超時,檢查配置文件、查看端口監(jiān)聽,重啟服務(wù),排查了可能影響的設(shè)置后問題還是沒能找到,于是換了一臺同樣配置的測試服務(wù)器發(fā)現(xiàn)又是能工作正常。這時基本可以排是配置的問題。
繼續(xù)往上走看域名和阿里云ECS是否還要做什么配置,發(fā)現(xiàn)前兩天剛部署了一臺阿里云SLB,就是SLB在nginx之前做了一道攔截,443端口的監(jiān)聽都被它轉(zhuǎn)發(fā)了,重新配置好SLB的證書。
需要把之前nginx ssl的配置刪除掉,不然會沖突,再次訪問一切正常。
如果你的網(wǎng)站也有升級https的需求,那么一定要提前了可能對其他功能產(chǎn)生影響的點(diǎn),選擇合適自己的升級路線。
歷史文章: