開啓全站HTTPS時代-Nginx SSL+tomcat集羣

目錄:
1、憑證申請 Let’s Encrypt
2、Nginx支持多域名ssl證書
3、Nginx強制使用https訪問(http跳轉到https)
4、配置 Tomcat

SSL For Free 免費 SSL 憑證申請 Let’s Encrypt

什麼是Let’s Encrypt

可以看看簡書上的這篇文章寫得比較詳細《Let’s Encrypt SSL證書配置》

文章中詳細介紹了使用如何手動生成SSL證書。但是我個人覺得還是比較麻煩,下面我來介紹一個簡單的生成SSL證書方案。

使用sslforfree生成Let’s Encrypt證書

https://www.sslforfree.com

填寫域名創建免費的SSL證書

下載文件上傳到服務器驗證並下載證書

文件上傳目錄

驗證文件

配置好Nginx,點擊第5步中的鏈接看看能不能訪問到,如果訪問正常就可以點擊Download SSL Certificate 按鈕下載證書了。

Nginx 主配置nginx.conf如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    server_tokens off;
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include conf.d/*.conf;
}

Nginx web配置web.conf如下:

upstream tomcat {
   server 127.0.0.1:8080;
}

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
    access_log  /home/dev/logs/nginx/web.access.log  main;

    #  error_page  500 502 503 504  /service/tomcat/nginx/504/504.html;
    location /static/{
        alias /home/dev/www/;
    }
    location ~/.well-known/{
        add_header Content-Type text/plain;
                allow all;
        root /home/dev/www/;
    }

     location / {
        proxy_redirect          off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $remote_addr;
        client_max_body_size      20m;
        client_body_buffer_size 128k;
        proxy_connect_timeout   600;
        proxy_send_timeout      600;
        proxy_read_timeout      900;
        proxy_buffer_size       4k;
        proxy_buffers           4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        proxy_pass http://tomcat;
        }
}

總結
1、相比較從服務器中命令行獲取腳本部署方法簡單很多,至少這邊可以圖形化操作,這樣對於一般的用戶不用擔心是否影響服務器的安全和穩定性。
2、通過獲取到的Let’s Encrypt SSL證書,我們可以部署到虛擬主機、VPS、服務器中,根據各種需要的WEB環境自行部署。
3、因爲Let’s Encrypt證書90天有效期,我們在SSL FOR FREE註冊過賬戶,所以到期前會提醒我們,我們需要根據提示重新續約時間和重新替換證書部署。

Nginx支持多域名ssl證書

要讓nginx支持多證書,nginx必須支持TLS SNI。可以使用如下命令查看

./sbin/nginx -V 或者 /usr/local/nginx/sbin/nginx -V

查看Nginx是否支持TLS SNI

如果顯示TLS SNI support disabled可以參考這篇文章進行配置

Nginx強制使用https訪問(http跳轉到https)

SSL FOR FREE 上下載的證書的zip包含如下內容:

下載的證書

這裏我們要將ca_bundle.crt以及certificate.crt 整合到一個文件中cert_chain.crt

 cat certificate.crt ca_bundle.crt >> cert_chain.crt

整合到一個文件需要手動處理一下換行,不然啓動Nginx會出現”PEM_read_bio:bad end line” 的問題

合併文件需要換行

Nginx 配置SSLhttps.conf如下:

1、指定域名80端口強制使用https
2、配置https監聽

[root@localhost conf]# cat conf.d/https.conf
upstream tomcats {
   server 127.0.0.1:8088;
}

server
    {
        listen 80;
        #listen [::]:80;
        server_name ngrok.javen205.1mfy.cn static.javen205.1mfy.cn frp.javen205.1mfy.cn ijpay.javen205.1mfy.cn;

        return 301 https://$host$request_uri;
        #rewrite ^(.*)$  https://$host$1 permanent;
    }

server {
        listen 443;
        server_name  ngrok.javen205.1mfy.cn static.javen205.1mfy.cn frp.javen205.1mfy.cn ijpay.javen205.1mfy.cn;
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/cert_chain.crt;
        ssl_certificate_key /usr/local/nginx/conf/ssl/private.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        access_log  /home/dev/logs/nginx/https.access.log  main;

    #  error_page  500 502 503 504  /service/tomcat/nginx/504/504.html;
    location /static/{
        alias /home/dev/www/;
    }
    location ~/.well-known/{
        add_header Content-Type text/plain;
                allow all;
        root /home/dev/www/;
    }

     location / {
        proxy_redirect          off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $remote_addr;
        client_max_body_size      20m;
        client_body_buffer_size 128k;
        proxy_connect_timeout   600;
        proxy_send_timeout      600;
        proxy_read_timeout      900;
        proxy_buffer_size       4k;
        proxy_buffers           4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        proxy_pass http://tomcats;
        }
}
[root@localhost conf]#

配置Tomcat

配置Tomcat server.xml 的 Engine 模塊下配置一個 Valve:

<Engine name="Catalina" defaultHost="localhost"> 
<Valve className="org.apache.catalina.valves.RemoteIpValve" 
remoteIpHeader="X-Forwarded-For" 
protocolHeader="X-Forwarded-Proto" 
protocolHeaderHttpsValue="https" httpsServerPort="8088"/>  #非80端口時,必須增加httpsServerPort配置,不然request.getServerPort()方法返回 443. 
</Engine>

在Tomcat的webapps/ROOT目錄下添加test.html測試如下圖:
image.png

參考資料
Installing a certificate on Nginx
Nginx支持多域名ssl證書
解決配置SSL證書出現”PEM_read_bio:bad end line”問題
Nginx+Tomcat+HTTPS 配置不需要在 Tomcat 上啓用 SSL 支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章