一、背景
外网项目按要求欲添加SSL,虽然在 http 三次握手的基础上增加了 SSL 的安全级别的握手,性能上打了点小折扣,并且对服务器性能增加了一点点小压力,但是这些都是安全性的代价,是物有所值的体现。
项目背景:项目是 SpringBoot 项目,运行是以 jar 包的形式运行的。
</p>
二、项目配置
1、在 resources 下添加证书
位置如下图所示
2、application.properties 添加配置(证书信息)
1 | server.port=443 |
3、applications.properties 端口配置
在第二点里面,我们将端口设置成了 443(https 默认端口),但是我们项目希望同时接受 http 请求,遂打算添加 80 端口,并将 80 端口的 http 请求全部转发至 443 端口的 http 请求,所以又添加了一条配置:
1 | server.port2=9090 |
4、启动类配置
启动类内需要添加相关 bean 配置:
① 支持 https
1 | @Bean |
② 请求转发
1 | @Value("${server.port2}") |
三、nginx 配置
项目配置完成,但是请求是由 nginx 转发过来的,所以 nginx 的配置还需要进行一点点小调整,配置如下:
1 | server { |
配置里面的 .pem 和 .key 文件是 SSL 的证书和秘钥。
四、采坑记
1、关于 nginx 服务器上的 SSL 证书存放路径,文件夹请逐层 mkdir,因为发现当我一次性嵌套新建的时候,文件配置不生效,ps:此坑和权限也没关系。
至今未解之谜,叹气。
2、新增证书重启nginx,大概报如下错误:
NGINX SSL: error:0200100D:system library:fopen:Permission denied
很明显是权限问题,但是 ll 发现已经给了文件777的权限,文件权限没问题,所以后来想到了selinux,想到了文件策略问题,于是我们查看了 nginx 内置的 html 文件的策略:
ls -lrtZ /usr/share/nginx/html
而我们自己的 SSL 证书的 selinux 策略为:
于是尝试着修改策略:
chcon -R -u system_u /xxxx/
chcon -R -t usr_t /xxxx/
当然,如我所愿,问题解决。