Nginx采用https协议反向代理tomcat容器项目

之前一直只是使用http协议给项目通信,但是由于谷歌大力推行https,https相比http来说也有着很多优点,比如说通信加密,抓包是抓不到具体通信信息的,而且在传统的http协议下,浏览器访问并发数有限,比如谷歌浏览器默认是开启6个信道并发访问,而https则不一样,它采用了信道复用,传输效率大大提升。这也是现今业内推荐的通信协议。

这里带来nginx采用https协议反向代理tomcat容器教程,因为自己的博客应用是java编写,部署在tomcat中,通过nginx反向代理,这次就顺便换成https吧。

首先https是需要ssl证书的,ssl证书通俗来讲就是一种公认的凭证,ssl证书通过在客户端浏览器和Web服务器之间建立一条ssl安全通道,证书讲道理是客户端和服务端双向的,但是现今主流的浏览器都集成了证书,也就是说,我们只需要在服务端部署ssl证书就行了。
ssl证书其实可以自己制作,也可以在知名的证书机构注册购买,两者的区分是自己制作的浏览器可能不认可,毕竟自己制作的公信力不够。


1.证书制作或购买

证书制作一般是使用openssl,可以在服务端中直接生成证书,具体不做概述。
这里推荐在知名机构中注册购买,如腾讯云的TrustAsia TLS RSA CA就能免费注册一年期的证书,还是很美丽的。
腾讯云的产品列表有ssl证书申请入口,注册选择TrustAsia TLS RSA CA免费的,过程很简单,注册完成后,还需要解析验证才能通过,其实过程也很简单,只需要在绑定的域名解析中,增加一条给定的解析信息,待600秒后机构扫描到解析成功,这个证书也就通过啦。
通过后如图显示:
20180825230140_385.png

现在我们就有了自己的证书啦。


2.部署证书(nginx端)

直接点击下载,下载证书到本机,下载后的文件如下:
20180825230533_600.png
因为我们需要部署nginx,所以需要nginx文件夹里的证书。
20180825230421_338.png

这里面分别是
SSL证书文件:1_www.domain.com_bundle.crt 和
私钥文件 :2_www.domain.com.key
这便是核心的东西,将两个文件拷贝至nginx的配置文件文件夹中,接下来就是部署至nginx中了。

接下来就是nginx的配置了,证书主要是配置在nginx配置文件nginx.conf中。配置文件是在conf文件夹内,配置如下:

   server { #此配置段将HTTP请求全部重定向为HTTPS请求
        listen 80;
        server_name www.listenlife.cn listenlife.cn;
        rewrite ^(.*) https://$server_name$1 permanent;
    }
    server {
        listen       443 ssl; #由80改成443
        #listen       [::]:80 default_server;
         #listen       [::]:443 ssl http2 www.listenlife.cn;
        server_name  www.listenlife.cn;
        
        #ssl证书配置开始
        ssl on;
        ssl_certificate 1_www.listenlife.cn_bundle.crt;
        ssl_certificate_key 2_www.listenlife.cn.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
        ssl_prefer_server_ciphers on;
        #ssl证书配置结束
        
        #rewrite ^(.*) https://$host$1 permanent; #http自动跳转https
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location /{
            proxy_pass http://127.0.0.1:8080;
            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 Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        
            proxy_set_header X-Forwarded-Proto $scheme;
        }
   
        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

要注意三点:
一是端口需要由80改成443,这是ssl的固定端口,而且还需要注意的是安全组需要开放443入站规则;二是配置在server中配置以下:

ssl on;
ssl_certificate 1_www.listenlife.cn_bundle.crt;
ssl_certificate_key 2_www.listenlife.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;

然后再项目location中还需要配置以下:

proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;

最后是配置中的第一个server,目的在于将HTTP请求全部重定向为HTTPS请求。这样输入http也能跳转至https。


3.tomcat端配置

还需要在tomcat的server.xml文件中做两处配置:
增加:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
        maxThreads="150" scheme="https" secure="true"
        keystoreFile="conf/www.listenlife.cn.jks"
        keystorePass="xxxxxxx"
        clientAuth="false" sslProtocol="TLS" />

此处的keystoreFile和keystorePass来自于之前证书文件中的tomcat文件夹,如下:

将keystoreFile拷贝至tomcat的conf目录下,然后引入,此处的keystorePass里只需要填写keystorePass.txt中的字符即可。

注意此处的8443端口是来自于8080端口的跳转:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

需要对应。

然后需要配置一处,在末尾HOST节点中加入:

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

4.结语
重启项目,重启nginx,访问项目->

然后就是喜闻乐见的https和浏览器标识的“安全”啦。

Last modification:November 26th, 2019 at 10:18 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment