文章目录
前言
最近客户要把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就蛮试一下了,大家也就蛮看下(。・ω・。)
总结
这里其实大部分网上都是可以找的到的,不过这边还是做了个简单的整合吧,也方便自己以后找,如果有哪里写错的地方还请大家告知( ̄. ̄)