之前在度娘搜尋資料,無意間看到一些個人站點的部落格都用了https協議,在瀏覽器位址列中被標記為綠色的“安全”,前些天特地給自己負責的小專案升級成https協議,其優點這裡不再贅述,小夥伴們可以自行百度,今天把整合部署分享在這裡,希望小夥伴們少走彎路~
效果如下:
軟體版本如下:
System | Centos 6.5 |
Nginx | Tengine/2.1.2 (nginx/1.6.2) |
SSL證照 | Let's Encrypt 免費SSL證照 |
Tomcat | Apache-tomcat-8.0.47 |
CDN | Cloudflare.com |
一、生成SSL證照
首先我們建立一個用來存放letsencrypt生成證照專案的路徑並進入:
cd /usr/local/letsencrypt複製程式碼
接下來我們克隆letsencrypt專案:
git clone https://github.com/letsencrypt/letsencrypt複製程式碼
開始生成SSL證照:
./letsencrypt-auto certonly --standalone --email test@qq.com -d www.test1.com -d www.test2.com --agree-tos複製程式碼
這裡一定注意:
(1). 域名繫結在國內DNS伺服器無法生成,需要先將DNS伺服器切換到DNS服務商,例如ClouldFlare、Godaddy、Dnsever後才能正常生成!
(2). web服務需要處於關閉狀態,注意關閉nginx和80埠的佔用!(不間斷服務方式生成可以自行百度)
(3). -d 代表domain 可以同時生成多個域名對應證照,生成後我們可以在預設目錄中看到:
/etc/letsencrypt/live/www.test.com/
cert.pem(使用者證照)
chain.pem(中間證照)
fullchain.pem(證照鏈)
privkey.pem(證照私鑰)複製程式碼
最後我們生成Perfect Forward Security(PFS)鍵值,具體作用可以自行百度:
mkdir /etc/ssl/private/ -p
cd /etc/ssl/private/
openssl dhparam 2048 -out dhparam.pem複製程式碼
二、Nginx配置SSL證照及Tomcat代理
#Tomcat 8080埠
upstream tomcat_8080{
server 127.0.0.1:8080 weight=1;
}
#將所有http協議內容重定向到https協議
server {
listen 80;
server_name www.test.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
#https協議
server {
listen 443;
server_name www.test.com;
# letsencrypt生成的檔案
ssl on;
ssl_certificate /etc/letsencrypt/live/www.test.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.test.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_dhparam /etc/ssl/private/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 一般推薦使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
ssl_prefer_server_ciphers on;
# 代理tomcat
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_pass http://tomcat_8080;
#proxy_redirect default;
}
access_log /home/wwwlogs/www.test.com_access.log;
error_log /home/wwwlogs/www.test.com_error.log;
}
複製程式碼
三、Tomcat的SSL配置:
1. Connector節點將redirectPort="8443"修改為 redirectPort="443" proxyPort="443"最終為:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" proxyPort="443" />複製程式碼
2. 找到Engine節點,在最後一個Host標籤後加入:
<Host name="www.test.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"/>
<Context docBase="/www/java/projectName" path="" crossContext="true" debug="3" privileged="true" reloadable="false" deubt="true" />
</Host>複製程式碼
四、CloudFlare CDN設定(這裡很重要):
我們將域名解析到自己伺服器後,點選Crypto選項卡,將SSL狀態修改為Full(strict)模式,在這種模式下會使用你伺服器中的ssl證照,否則會導致頁面無限301跳轉,導致chrome提示重定向次數過多,請求失敗!
五、參考文獻:
1. Nginx+SSL整合 http://blog.csdn.net/sheng119/article/details/72956717
2. Tomcat+SSL整合 https://www.cnblogs.com/zhanghaoh/p/5293158.html
3. 解決CloudFlare CDN無限301重定向問題 答案在9樓 https://www.v2ex.com/t/188230#r_2026842
六、搜尋引擎優化建議:
如果是外網專案,建議到百度站長平臺,全站HTTPS協議申請,HTTPS協議也在排名演算法之一。
以上為個人總結,希望對大家有所幫助,如果有不對的地方大家可以指出,歡迎拍磚:)