一、軟件版本:html
nginx-1.15+nginx
tomcat-8.0+apache
二、先解決一個疑問:Tomcat到底需不須要配置SSL?tomcat
答案:不須要服務器
三、SSL申請session
使用騰訊雲、阿里雲的服務器,會更加方便申請。(申請過程略)dom
申請完之後會獲得兩個文件:測試
1_www.domain.com_bundle.crt 證書文件
2_www.domain.com.key 私鑰文件
將這兩個文件拷貝到 Nginx 服務器的 /usr/local/nginx/conf 目錄下。網站
四、前提:nginx安裝了ssl模塊,若是沒有安裝,點下面的連接:阿里雲
http://www.javashuo.com/article/p-rgkaoepy-cb.html
五、nginx證書部署
server { #SSL 訪問端口號爲 443 listen 443 ssl; #填寫綁定證書的域名 server_name www.domain.com; #證書文件名稱 ssl_certificate 1_www.domain.com_bundle.crt; #私鑰文件名稱 ssl_certificate_key 2_www.domain.com.key; ssl_session_timeout 5m; #請按照這個協議配置 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #請按照這個套件配置,配置加密套件,寫法遵循 openssl 標準。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { #網站主頁路徑。此路徑僅供參考,具體請您按照實際目錄操做。 root /var/www/www.domain.com; index index.html index.htm; } }
六、部署完畢之後進行測試
./sbin/nginx -t
七、有人會出現這個問題:NGINX報錯 : [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
緣由是:新版本nginx須要這樣配置
#將 listen 443 ssl on #改爲: listen 443 ssl
問題解決,SSL部署完畢!
八、如何在應用中取https正確的協議
問題:
request.getScheme() #老是 http,而不是實際的http或https request.isSecure() #老是false(由於老是http) request.getRemoteAddr() #老是 nginx 請求的 IP,而不是用戶的IP request.getRequestURL() #老是 nginx 請求的URL 而不是用戶實際請求的 URL response.sendRedirect( 相對url ) #老是重定向到 http 上 (由於認爲當前是 http 請求)
解決辦法:只須要分別配置一下 Nginx 和 Tomcat
(1)配置 Nginx 的轉發項:
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;
(2)配置Tomcat server.xml 的 Engine 模塊:
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>
問題解決!