網頁

2014年6月26日 星期四

Nginx 啟用 SSL 並與 Tomcat 作銜接

在注重網路安全的這個年代
免不了的會需要 SSL 加密來做傳輸
而在我們架設的 Nginx Server 中,預設是不開啟 SSL 模式的
在此次文章中分為兩個階段

一為單獨啟動 Nginx 的 SSL
二為透過 Nginx SSL 內轉 Tomcat 上的專案


單獨啟動 Nginx SSL

我們知道要走 SSL 必要的就是需要金鑰(key)和證書(certificate)
所以先把 key 和 certificate 建立出來吧

sudo mkdir /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

新增 443 port 的監聽事件

sudo vi /etc/nginx/sites-available/ssl
server {
        listen 443 ssl;
        ssl on;
        root /var/www;
        index index.html index.htm index.php index.jsp;
        server_name localhost;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  10m;
        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
        ssl_prefer_server_ciphers on;
}

完成後作 soft link ,這邊注意:Nginx真正吃 server 監聽事件的是在 sites-enabled
所以我們將我們寫好的部份作連結過去

sudo ln -s /etc/nginx/sites-available/ssl /etc/nginx/sites-enabled/ssl 

如此一來,基本的 Nginx SSL 就完成了
可以透過 https 來讀取 /var/www 底下的 html 網站了
當然!如果要可以讀取 php 或 jsp 等等的其他網站 必須也在 ssl 中設定

location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
        }

詳細可看我的 Nginx 上一篇文章 傳送門

透過 Nginx SSL 執行 Tomcat 專案


還記得上一次,Nginx 內轉 Tomcat 的狀況嗎
假設如果我們想透過 Nginx 來讀取 Tomcat manager 的頁面
一般情況在 80 port 的監聽事件中是這樣寫的

location /manager/  {
                proxy_pass      http://localhost:8080;
                proxy_redirect  off;
                proxy_pass_request_headers on;
                proxy_set_header X-Forwarded-Proto $scheme;
                include proxy_params;
        }

恩.......好吧 其實在 443 port 的監聽其實也是這樣寫
但我們在 tomcat 的 server.xml 需要在 Host 中增加一些參數,如下

<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

注意

這邊請注意一件事情
有些人可能有透過 Tomcat 直接跑 SSL
他是跑在 8443 port,而我們透過 Nginx 是完全吃 Nginx 的 SSL
所以 Tomcat 本身是不跑 SSL 的,這邊切記
但是為了安全需求,既然 Tomcat 本身不跑 SSL 那我們就得避免他人直接存取 8080 port
所以可能還得配合一些 tools 來阻擋 port 如 iptables 或是 ufw  


沒有留言:

張貼留言