NGINX配置TCP转发HTTPS请求,SSL证书装在应用

NGINX配置TCP转发HTTPS请求,SSL证书装在应用

接到个业务,在有负载均衡的http应用上,做https改造.
网上查到的实现,都是使用nginx安装ssl证书,此时的请求实际上是:
用户请求 --https–> nginx --http–> 应用
nginx此时为"7层协议负载均衡",在nginx处已经完成了ssl加密解密

但我这里的实际情况是,负载均衡不是我们管理,无权操作,而公网负载统一使用TCP层协议,即"4层协议负载均衡",ssl证书装在应用上,此时请求是:
用户请求–https-> 4层负载 --https-> 应用

因为没接触过这个方面,在买受信证书前,我用本地环境和自签名证书做了个测试,
该文仅用于记录,参考了一些大神的链接,感谢大佬们分享自己的知识

架构:
java-springboot应用在win10本地,nginx部署到linux虚拟机,https请求从win10本地请求到虚拟机niginx再转发请求到win10本地的java应用.
自签名证书绑定的是虚拟机ip,实际应用中相当于负载均衡所在的公网域名,而证书本身则安装在springboot应用中

以下是实现步骤:

1.自签名证书:
网上购买的受信任证书,绝大部分为仅绑定域名的证书,但是本地测试,域名局限性较大,因此将证书绑定ip是个比较好的选择

(1)使用jdk自带的keytool,生成自签名证书网上教程很多,但绑定ip的话需要一个额外参数-ext san=ip:127.0.0.1,其中127.0.0.1必须是你要绑定的ip,例如我虚拟机的ip地址为192.168.242.133,则下面CN=和san=ip:必须是这个ip

keytool -genkey -alias tomcat133 -keyalg RSA -keysize 1024 -keypass jksjks -storepass jksjks -dname “CN=192.168.242.133,OU=csoa,O=csoa,L=FZ,ST=FZ,C=CN” -ext san=ip:192.168.242.133 -validity 3650 -keystore jks133.keystore

(2)jks转cer(cer才能导入jdk的keystore或导入浏览器)
keytool -exportcert -alias tomcat133 -keystore jks133.keystore -file jks133.cer -rfc

(3)导入jdk的keystore中,无此操作的话,HTTPClient或HTTPUrlConnection会因验证非法而导致调用报错
(另一方法是重写HttpClient或HttpUrlConnection中的一个方法,使得其忽略证书验证,可自行百度,但该行为对代码有侵入行为,且对全体证书都忽略验证,并不推荐)

keytool -import -alias tomcat133 -file “jks133.cer” -keystore “%JAVA_HOME%\jre\lib\security\cacerts” -storepass “changeit”

(4)其他一些辅助指令:
//查看所有证书详细信息
keytool -list -rfc -keystore “%JAVA_HOME%\jre\lib\security\cacerts” -storepass “changeit”

//只查证书别名和指纹签名
keytool -list -keystore “%JAVA_HOME%\jre\lib\security\cacerts” -storepass “changeit”

//从jdk中删除指定别名为tomcat133的证书
keytool -delete -alias tomcat133 “%JAVA_HOME%\jre\lib\security\cacerts” -storepass “changeit”

此时证书已经生成好且加入了本机jdk的keytool,java发起该证书的https请求时会受信任

2.jks证书装入应用springboot应用
这一步很简单,配置一下yml/properties就行了

 ssl:
    key-store: classpath:jks133.keystore
    key-store-type: JKS
    key-store-password: jksjks
    key-alias: tomcat133

3.部署nginx到linux,注意这里有些非默认的安装参数
下载nginx到linux后安装,先说安装完之后的配置:
(1)nginx的配置

stream {
	server {
        	listen  9080;
        	ssl_preread on;
        	proxy_pass 192.168.242.1:8085;
        }
}

以上就能简单实现外部请求到linux-nginx的9080,nginx再将其转发到本地WIN10的8085端口(我的本地win10IP是192.168.242.1,springboot应用是8085端口)
但注意其中有个几个关键点:
stream:{}:实现4层协议负载,这个节点和默认的http:{}节点为同级,后者为7层协议负载
ssl_prepread on;是4层协议负载能够处理HTTPS(SSL)请求,不带这个参数,会提示"你使用了非https接口处理https请求"的错误

由于需要使用以上配置参数,而这里的某些参数并不在nginx默认安装模块中,因此需要指定安装的模块

(2)安装:
解压nginx后,运行
//后面三个模块就是上面配置文件中需要用到的模块,默认不会安装
./configure --with-stream --with-stream_ssl_preread_module --with-stream_ssl_module
//编译
make
//安装
make install

(3)装好之后启动即可
./nginx //(在nginx未处于启动状态的情况下,启动nginx,如果已经处于启动状态,则出错)
./nginx -s quit //此方式停止步骤是待nginx进程处理任务完毕进行停止。
./nginx -s stop //此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。
ps aux|grep nginx //查询nginx进程
./nginx -t //检测当前nginx配置文件语法是否正确
./nginx -s reload //热重启nginx
//冷重启nginx(先停再启)
./nginx -s quit
./nginx

4.此时整个安装结束,实测可行

参考链接,感谢以下大佬分享自己的东西
链接: https://blog.csdn.net/qin528032307/article/details/78706383.
链接: https://www.jianshu.com/p/25fb46965988.

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值