Tomcat + Nginx + SSL 实现 HTTPS 访问(Let’s Encrypt)

  因为信息安全的需要,最近需要给一台应用服务器上添加 SSL 以便开启 HTTPS 访问,服务器上的软件是 Tomcat ,对于 PHP 党来说当然是比较陌生的。

  根据网上的教程修改 Tomcat 的配置文件,倒腾了超久之后发现 HTTPS 的监听一直无法生效,而且每次重启都非常费时间,所以开始想用另一条道路:通过 Nginx 反向代理的方式上 HTTPS ,具体的步骤如下:

一、前置工作

配置好 Let’s Encrypt 的证书,安装 Nginx 。

二、Nginx 配置

1、将 /etc/nginx/conf.d 内的 default.conf 备份,并将内容修改如下并保存,注意将大写域名部分替换为实际的小写域名:

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

# HTTPS server
server {
    listen    443;
    server_name    www.wavelpc.com;

    ssl_certificate    /etc/letsencrypt/live/www.wavelpc.com/fullchain.pem;
    ssl_certificate_key    /etc/letsencrypt/live/www.wavelpc.com/privkey.pem;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_connect_timeout      240;
        proxy_send_timeout         240;
        proxy_read_timeout         240;
        # note, there is not SSL here! plain HTTP is used
        proxy_pass https://tomcat;
    }
}

2、重启 Nginx 服务。

三、Tomcat 配置

1、在 Tomcat 的 server.xml 的 Connector 修改为,主要是在末尾添加 proxyPory=”443″ :

<connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443"
proxyPort="443"></connector>

2、在Host 标签结束前添加以下内容:

<valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"></valve>

3、重启 Tomcat 服务。

4、若设定好之后仍抛出 502 Bad Gateway 错误,这是由于没有开放转发权限所致,运行以下命令即可:

setsebool -P httpd_can_network_connect=1

四、自动重定向

1、如果需要全站的 HTTP 访问都转向到 HTTPS,可以在 Nginx 的 /etc/nginx/conf.d/default.conf 文件中添加以下内容:

server {
    listen 80;
    server_name WWW.WAVELPC.COM;
    rewrite ^ https://$server_name$request_uri? permanent;
}

注意:本文中的代码和思路参考了这篇教程:https://juejin.im/post/5a5f0307518825732c539257