Nginx配置HTTPS,Tomcat把HTTP切换至HTTPS


前言

最近客户要把http升级成https,有两个方案,一个是改Nginx,一个是改代码。虽然最终选择的是改代码的方案 ̄へ ̄,但是还是在这边记录一下改Nginx和Tomcat的方案吧(〃‘▽’〃)


一、Nginx配置HTTPS

1.下载Nginx

    这一步已经下载好的或者安装完的小伙伴可以直接忽略,首先保证环境可以联网,执行命令:

wget http://nginx.org/download/nginx-1.19.3.tar.gz

注:这里用的版本是1.19.3

2.解压安装包并配置SSL

    首先解压下载好的Nginx

tar -zxvf nginx-1.19.3.tar.gz

进入解压好的目录

 cd nginx-1.19.3

执行Nginx配置

 ./configure --prefix=/usr/local/nginx --with-http_ssl_module
  • 如果出现./configure: error: C compiler cc is not found错误,说明没有安装gcc,如下:
    在这里插入图片描述
    先安装下gcc,执行如下命令:

    yum -y install gcc-c++
    
  • 如果出现./configure: error: the HTTP rewrite module requires the PCRE library.错误,说明缺少pcre包,如下:
    在这里插入图片描述
    安装下pcre的devel包,执行如下命令(以下命令还带有ssl、zlib等依赖的安装):

    yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
    
  • 如果出现./configure: error: SSL modules require the OpenSSL library.错误,说明缺少openssl 环境,如下:
    在这里插入图片描述
    安装下ssl环境,执行如下命令:

      yum -y install openssl openssl-devel
    


成功执行完配置命令后,继续执行编译命令,如下:

make install

注:make install会重新安装Nginx,如果不需要安装的小伙伴,可以直接用make命令,然后把objs文件夹下的nginx文件复制出来覆盖原来的就可以了

接下来就是配置证书了,这里我是直接生成证书的。如果有证书的小伙伴也可以直接使用

进入Nginx文件夹

cd /usr/local/nginx/

创建证书文件夹

mkdir cert

进入证书文件夹

cd cert

创建私钥

openssl genrsa -des3 -out https.key 1024

创建签名请求证书

openssl req -new -key https.key -out https.csr

这里会出现一堆东西,下边放出来给大伙参考,如下:
在这里插入图片描述
在加载SSL支持的Nginx并使用上述私钥时除去必须的口令

cp https.key https.key.org
openssl rsa -in https.key.org -out https.key

标记证书有效期

openssl x509 -req -days 365 -in https.csr -signkey https.key -out https.crt

注:365是证书的有效期,可以自行设置

3.修改Nginx HTTPS配置

    弄好了上边的步骤后,接下来要对Nginx进行配置了、Nginx默认是带https的配置的,不过被注释掉了,如下:

在这里插入图片描述
放开这里的注释,然后修改下证书的路径,再加上和代理的地址就可以了,如下:
在这里插入图片描述

修改之后,重启Nginx

/usr/local/nginx/sbin/nginx -s reload

打开浏览器输入https://+IP验证一下,如下:
在这里插入图片描述
这样就配置成功了,只不过我们生成的证书不受浏览器信任

4.修改Nginx HTTP配置

    配置好了HTTPS,现在我们的Nginx同时支持HTTP和HTTPS,如果我们不需要HTTP访问,只需要把HTTP的请求重定向到HTTPS即可,先注释掉原理的HTTP配置:
在这里插入图片描述
在添加如下配置:
在这里插入图片描述

server {
        listen       80;
        server_name  192.168.236.130;
        location / {
            return 301 https://$server_name$request_uri;
        }
   }

重启一下Nginx

/usr/local/nginx/sbin/nginx -s reload

这样就可以将HTTP重定向到HTTPS了

二、Tomcat配置阀门

Nginx配置好HTTPS之后,接下来就得配置Tomcat,Tomcat如果不配置的话,原本页面返回去的URL全是HTTP,导致页面无法正常加载。问题如下:在这里插入图片描述
这里全部是http请求


1.配置Nginx

    本来这个应该写在上边,但是考虑到有些小伙伴只想单纯的配置个Nginx,所以这边就放到这里了,还请大家谅解(`・ω・´)

打开nginx的配置文件

vim /usr/local/nginx/conf/nginx.conf

添加如下配置
在这里插入图片描述

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_pass http://192.168.236.130:8080/;

然后重启一下Nginx

/usr/local/nginx/sbin/nginx -s reload

2.配置Tomcat

    Tomcat的下载解压这里就不赘述了。首先进入Tomcat目录

 cd /usr/local/project/apache-tomcat-9.0.41

注:这里用的Tomcat是9,Tomcat8也测试过

打开server.xml配置文件

vim conf/server.xml

添加如下配置
在这里插入图片描述

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

这里配置的属性其实就是我们在Nginx上加的配置了,看下结果:
在这里插入图片描述

注:这里的配置也可以加在Engine节点下,Engine是全局的,Host是虚拟主机,一旦有配置其他虚拟主机需要另外再加上配置

3.最后的最后

    这里多啰嗦一个方法,还有一个就是自己实现Tomcat的Valve接口,打成jar包植入到Tomcat里边去。我们只要把协议改成HTTPS,把端口改成443就可以了,代码如下:

package org.hqd.valve;

import org.apache.catalina.Valve;
import org.apache.catalina.comet.CometEvent;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.tomcat.util.buf.MessageBytes;

import javax.servlet.ServletException;
import java.io.IOException;
import java.lang.reflect.Field;

public class TestValve implements Valve {
    private Valve next;

    @Override
    public String getInfo() {
        return "自定义阀门";
    }

    @Override
    public Valve getNext() {
        return next;
    }

    @Override
    public void setNext(Valve valve) {
        this.next = valve;
    }

    @Override
    public void backgroundProcess() {

    }

    @Override
    public void invoke(Request request, Response response) throws IOException, ServletException {
        System.out.println("=====================start===================");
        System.out.println("=====================修改前===================");
        System.out.println("=====================Scheme:" + request.getScheme() + "=====================");
        System.out.println("=====================URL:" + request.getRequestURL() + "=====================");
        MessageBytes schemeMB = MessageBytes.newInstance();
        schemeMB.setString("https");
        request.setServerPort(443);
        Class<org.apache.coyote.Request> clazz = (Class<org.apache.coyote.Request>) request.getCoyoteRequest().getClass();
        try {
            Field field = clazz.getDeclaredField("schemeMB");
            field.setAccessible(true);
            field.set(request.getCoyoteRequest(), schemeMB);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        System.out.println("=====================修改后===================");
        System.out.println("=====================Scheme:" + request.getScheme() + "=====================");
        System.out.println("=====================URL:" + request.getRequestURL() + "=====================");
        System.out.println("==================end======================");

        getNext().invoke(request, response);
    }

    @Override
    public void event(Request request, Response response, CometEvent cometEvent) throws IOException, ServletException {

    }

    @Override
    public boolean isAsyncSupported() {
        return true;
    }
}

进入编译目录,将编译好的Class文件打成jar包

jar -cvf test.jar org

最后在把jar包扔到Tomcat的lib目录下,修改server.xml

在这里插入图片描述

<Valve className="org.hqd.valve.TestValve"/>

最后测试一下,效果如下:
在这里插入图片描述

在这里插入图片描述
    这里和上面的方法一样,如果上边可以,这个方法就显得太多余了。不过正巧最近在看Tomcat就蛮试一下了,大家也就蛮看下(。・ω・。)


总结

    这里其实大部分网上都是可以找的到的,不过这边还是做了个简单的整合吧,也方便自己以后找,如果有哪里写错的地方还请大家告知( ̄. ̄)

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穷儒公羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值