關於nginx+tomcat https的部署之前網上一直有2種說法:
1.nginx和tomcat都要部署ssl證書
2.nginx部署ssl證書,tomcat增加ssl支持
在實際的部署過程中nginx的配置和ssl證書部署很順利,但是tomcat用網上流傳的說法配置之后,發現非靜態內容無法正常使用。(項目用了dubbox,dubbox基於resteasy發布rest協議)
經過一系列折騰,最終總結出以下經驗,希望能幫到其他人。
一. 申請SSL證書
SSL證書其實可以自己生成,但是因為自己生成的證書不是瀏覽器廠商認可的受信機構頒發,所以瀏覽器會打紅叉!為了用戶體驗,所以
我們要到SSL證書廠商那里申請SSL證書。個人推薦 globalsign(淘寶用的) wosign.com(價格優惠) startssl(有免費版)。如果使用單域名DV證書,簽發只要15分鍾-2小時。廠商通常會把簽發好的證書以郵件形式發送過來。
1. 自己生成 證書簽名請求(CSR)和私鑰(KEY)。可以使用廠商提供的工具https://www.trustasia.com/tools/csr-generator/
也可以使用openssl生成 openssl req -new -nodes -newkey rsa:2048 -keyout domain.key -out domain.csr
2.把 證書簽名請求(CSR)和私鑰(KEY)提供給廠商。
3.收到廠商簽發好的證書。(私鑰還是自己的)
二.部署證書到nginx並配置
nginx的證書部署相對簡單。
1.確定nginx是否安裝了ssl模塊,如果沒有需要重新mark install。(建議 pcre-8.38 zlib-1.2.8 openssl-1.0.2g 版本太高可能導致編譯失敗)
2.把廠商提供的 x.crt 內容追加到 x.cer, 然后把 x.key 和 x.cer 放到Nginx服務器
3.nginx.conf 增加https支持。主要是配置 80 和 443 端口的監聽
server { listen 80; server_name x; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 443; server_name x; ssl on; ssl_certificate /etc/nginx/server.cer; ssl_certificate_key /etc/nginx/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { client_max_body_size 16m; client_body_buffer_size 128k; proxy_pass http://online/; 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; proxy_next_upstream off; proxy_connect_timeout 30; proxy_read_timeout 300; proxy_send_timeout 300; } }
我這里做了http強跳到https,不需要這個功能,可以去掉 rewrite ^(.*)$ https:
三.tomcat增加對https協議的支持
1.Connector節點加入 redirectPort="443" proxyPort="443"
2.加入新的Value節點 <Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"/>
