记录一下域名化以及http转https的改造过程。
应用背景:
前端+后端+tongweb+nginx
域名化
多服务器使用负载IP申请,单服务器使用服务器地址申请。
验证域名是否开通成功,使用win+R录入cmd打开命令窗口,使用ping 域名访问已申请好的服务器
调整前端以及后端配置文件中的跳转地址:将访问地址中的本服务器IP调整为域名地址(只改127.0.0.1以及该域名对应的服务器IP)
http转https
1.自签名证书申请(内网访问应用)
使用访问服务的域名/IP申请,用什么申请就用什么访问。
申请好的证书包含.crt文件(公钥)以及.key文件(私钥)。
2.配置https请求以及证书配置
a. 上传证书到服务器,/opt/ssl/包含.crt(公钥)以及.key(私钥)
b. 检查防火墙是否放行443端口:firewall-cmd --query-port=443/tcp
我的没有开,没有放行的话执行以下:
# 允许443端口sudofirewall-cmd --zone=public --add-port=443/tcp --permanent# 重新加载防火墙规则sudofirewall-cmd --reloadc. 备份后端yml配置文件,将yml中的http修改为https
注:只改改过域名的位置
d. 备份前端js配置文件,将http修改为https
注:只改改过域名的位置
e. 备份nginx.conf
找到nginx的配置文件位置(可能在/usr/local/nginx或者/etc/nginx)
将原文件备份并修改配置为:
# 指定启动用户user xxxx;worker_processes1;error_log logs/error.log;events{worker_connections1024;}#HTTP自动跳转到HTTPS(关键)server{listen80;# 这里修改为:你的域名 + 原有IP(兼容旧访问方式)server_name aaa.com xx.xx.xx.xx;client_max_body_size 900M;# 所有HTTP请求都跳转到HTTPSreturn301https://$host$request_uri;}# HTTP自动跳转到HTTPS(关键)server{listen443ssl;server_name xx.xx.xx.xx aaa.com;client_max_body_size 900M;root"/home/xxx/";# 1. 配置服务器证书(certificate.crt)ssl_certificate /opt/ssl/certificate.crt;# 2. 配置服务器私钥(private.key)ssl_certificate_key /opt/ssl/private.key;# 3. 配置CA证书链(ca-certificates.crt)ssl_trusted_certificate /opt/ssl/ca-certificates.crt;# 安全配置:仅启用TLS1.2/TLS1.3,禁用不安全协议ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256;ssl_session_timeout 10m;# 后端location /app{proxy_set_header X-Real-IP$remote_addr;# 传递HTTPS标识给后端,以及Host头(解决后端跳转/回调问题)proxy_set_header Host$host;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;# 告诉后端是HTTPS请求proxy_set_header X-Forwarded-Proto$scheme;proxy_pass http://127.0.0.1:端口号/;proxy_connect_timeout60;proxy_send_timeout60;proxy_read_timeout540;proxy_buffering on;}......}f. 停nginx:ps -ef|grep nginx查看进程号(进程一般在root下,需要在.conf文件中指定启动用户才行)kill -9 主进程号 工作进程号。
g. 启动nginx/usr/local/nginx/sbin/nginx启动nginx是否报错?
nginx:[emerg]the"ssl"parameter requires ngx_http_ssl_modulein/usr/local/nginx/conf/nginx.conf:45(行号,不重要) (1)不报ssl错,nginx启动成功。
(2)报错。
检查是否有ssl模块:nginx -v
没有的话将原来的nginx服务停止并将原来的nginx文件夹修改为备份名称nginx_bk用yum命令重新下载:yum install nginx -y
再次检查是否有ssl模块:nginx -v,查看是否包含--with-http_ssl_module,包含说明ssl模块已存在。
(3)修改权限:
chown-R webapps:webapps /etc/nginx/chown-R webapps:webapps /usr/share/nginx/chown-R webapps:webapps /var/lib/nginx/ (4)建文件夹:/usr/share/nginx/路径下新建logs文件夹,所有者为webapps
(5)修改新的nginx的配置文件:在/etc/nginx/下将默认的配置文件重命名,将步骤e中编辑好的配置文件(备份的nginx_bk里面的conf下的nginx.con)复制到/etc/nginx/下
(6)检查nginx配置文件:nginx -t并启动systemctl start nginx
h. 重启应用服务。
i. 进行浏览器访问验证,发现控制台跨域报错。
原因为前端配置的跳转接口路径为域名路径,以域名访问时,前端配置文件跳转地址为域名地址,不会产生跨域。但以IP访问时依旧会跳转到域名路径,这样就跨域了。
修改思路:动态配置前端到后端的请求路径,用什么访问就拼接什么跳转。
注:如果修改完还是报访问错误,建议检查下是否服务器上使用的前端配置文件时隔离出来放置在其他位置的。
j. 重新访问验证:访问后端接口时报错找不到证书
[systemout][java.lang.RuntimeException: 接口调用异常:I/O error on GET requestfor"https://jjxtc.ho.ncits/taishanApi/tsSecApi/getRoleDataAuth":sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable tofindvalid certification path to requested target;nested exception is[javax.net](https://javax.net).ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable tofindvalid certification path to requested target] 解决方案:把证书配置到jdk的cacert下面。
# 1. 查看java命令的路径(查找java新任库的路径)whichjava# 示例输出:/usr/bin/java(这是软链接,需要追根溯源)# 2. 追踪软链接的实际路径ls-l /usr/bin/java# 示例输出:/usr/bin/java -> /usr/lib/jvm/java-11-openjdk-amd64/bin/java# 3. 提取JDK根路径:/usr/lib/jvm/java-11-openjdk-amd64# 4.把证书加入java证书信任库:keytool -import -alias jjxtc-server -file /opt/ssl/certificate.crt -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.ky10.x86_64/jre/lib/security/cacerts -storepass changeit再次使用浏览器访问,成功访问!!!