记录搭建一台可域名访问的HTTPS服务器

一、背景

        近期公司业务涉及到微信小程序,即将开发完成需要按照微信小程序平台的要求提供带证书的域名请求服务器。

        资源背景介绍如下:

        1、域名

        公司已有一个二级域名,再次申请新的二级域名并且实现ICP备案不仅需要花重金重新购买,还需要等待备案将近一个月。于是决定借用已有的二级域名将请求绑定到443以外的端口,理想的最终访问形式为:https://erp.aikes.com:8066/xxx/xxx.html(微信小程序也支持该种配置)

        2、证书

        公司的二级域名上已经绑定证书,新部署的服务也需要有SSL证书认证,否则https请求无法通过。有背景一的担保,该服务复用证书亦是可行的。

        3、代理

        为安全起见,新部署的服务不再使用线上正在跑的服务器,仅通过代理将请求转发到新的服务器。我们将微信小程序涉及到的资源文件及后端服务部署到新服务器即可。

二、正文

        正文中将分为几个部分进行操作记录,尽可能完整的复述当时出现的问题已经整改方案

1、代理和证书的纠葛

        关于代理的使用,和同事沟通后初步拟定了两种方案:1、通过Nginx代理;2、通过netsh实现TCP端口转发。

        出于安全性以及独立性考虑,尽可能小的影响线上服务器的情况下选择了Nginx进行代理,完整流程:监听目标端口,配置SSL证书,转发请求到目标服务器。

        以下是Nginx的配置文件 nginx.conf,证书文件放到同级的conf目录即可:

worker_processes 5;events {worker_connections 1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;tcp_nopush     on;tcp_nodelay    on;keepalive_timeout  65;client_body_buffer_size 100m;client_max_body_size 100m;# HTTPS serverserver {listen 8066 ssl;server_name erp.aikes.com;ssl_certificate      cert/erp_aikes_com_integrated.crt;ssl_certificate_key  cert/erp_aikes_com.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {proxy_pass https://192.168.10.236:8066;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_connect_timeout 60;proxy_read_timeout 300;proxy_send_timeout 300;}}
}

        上述转发的配置中,跳转到内网的10.236机器正是我们新申请的服务器,8066端口为Tomcat使用,此处配置为https请求的话,Tomcat中也需要增加SSL证书实现https协议。

        也可以将其配置为http,则Tomcat也不需要增加证书。整个客户端请求的证书认证在Nginx端已经处理完毕。

        以下是新服务器(10.236:8066)上Tomcat增加SSL证书配置 server.xml (核心部分):

    <Connector executor="tomcatThreadPool"port="1001" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /><Connector port="8066" protocol="org.apache.coyote.http11.Http11Nio2Protocol" maxThreads="150" SSLEnabled="true"scheme="https"secure="true"keystoreFile="conf/erp_aikes_com.jks"keystoreType="JKS"keystorePass="cT6W2buDs4LEbKMV"clientAuth="false"SSLProtocol="TLSv1.1+TLSv1.2+TLSv1.3"	/>

        上述Tomcat配置中需要将生成的jks证书放到同级conf目录下,笔者除了8066的 https 端口还额外开放了1001的http端口用于前端调试。

        PS:需要注意的是,如果Tomcat服务集成到了windows服务中,在变动证书配置后需要将服务卸载重新装载到windows services才会生效,这是一个大坑,笔者调试一下午一直以为是证书不对,结果偶然点了startup.bat启动后正常了,进而才发现是services中配置未生效导致。

2、证书和域名的关系

        通过上述配置,整个流程已经可以跑同,通过域名+端口+路由可以访问到我们目标服务器的目标服务上。

        此时记录一个域名访问的小知识,我们的证书申请是通过域名进行绑定的,所以证书生效的前提是通过域名访问。如果使用域名背后的真是IP进行https访问仍会提示网站不安全。

        所以,证书的世界是因为有域名而多姿多彩,没有域名的访问,证书一律不认可。

3、域名和代理的清白

        域名可以作为IP的别称,而代理只是作为不同IP的相同或不同端口之间的请求转发,所以一定程度上来看,域名和代理是清清白白没有任何关系。

        在上述配置中使用Nginx进行端口代理,最终效果使用域名访问时,会先通过DNS解析到具体IP,然后请求到IP+端口后发现是一个代理,进而通过代理跳转到真实服务器,获取请求结果返回客户端。

        此时需要记录下代理的调整。在实际使用中并没有按照Nginx进行代理,而是采用了Windows服务器自带的netsh命令实现了TCP端口转发,其原因有二:1、Nginx体量过大,不适合单纯的请求转发;2、线上服务器使用Nginx频繁出现502请求异常,系Nginx关于请求转发的超时配置等问题。

        所以最终决定使用netsh进行转发,此时担心的另一个问题出现:netsh需不需要携带SSL证书转发。查阅资料显示,netsh仅转发请求,目标服务器处理证书认证也是可以的。

        具体netsh使用指南可以查看笔者另一篇博客:Windows服务器基于netsh命令实现请求转发

        于是最终方案为:域名+端口+路由访问——>线上服务器netsh实现请求跳转——>目标服务器接收https请求并验证SSL证书——>处理请求将数据返回客户端浏览器

三、总结

        在配置微信小程序涉及的资源文件和后端服务时,域名和代理的关系是相对独立且清晰的。域名在网络中充当IP地址的别称,而代理则是在不同IP或不同端口之间进行请求转发的工具。在实际操作中,通过Nginx进行端口代理可以有效实现请求的转发和SSL证书的管理,但考虑到服务器性能和稳定性,有时会选择使用Windows服务器自带的netsh命令来进行TCP端口转发。

        关于域名,它的重要性在于SSL证书的有效性和安全性。SSL证书通常通过域名来绑定,只有通过正确的域名访问才能确保HTTPS连接的安全性,否则会出现浏览器提示网站不安全的情况。因此,域名在HTTPS访问中扮演了关键角色。

        总结来说,域名和代理在微信小程序开发中的应用各有其重要性和功能,通过合理的配置和管理,可以确保系统的安全性和稳定性,提供良好的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker实现Redis主从,以及哨兵机制

Docker实现Redis主从,以及哨兵机制 目录 Docker实现Redis主从,以及哨兵机制准备Redis镜像创建Redis主节点配置文件启动Redis从节点确认主从连接哨兵主要功能配置哨兵文件创建Redis哨兵的Docker容器 要通过Docker实现Redis的主从&#xff08;master-slave&#xff09;复制&#…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的终极指南

SOCKS5是什么以及它如何工作&#xff1f; 在网络和互联网协议领域&#xff0c;有多种工具和技术在确保安全高效的通信方面发挥着至关重要的作用。 SOCKS5 就是这样一个工具&#xff0c;它代表套接字安全版本 5。 在这篇博文中&#xff0c;我们将深入探讨 SOCKS5 的细节&…

CoAtNet(NeurIPS 2023, Google)论文解读

paper&#xff1a;CoAtNet: Marrying Convolution and Attention for All Data Sizes third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/maxxvit.py 背景 自AlexNet以来&#xff0c;ConvNets一直是计算机…

【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点

我们现在继续对于群体遗传学进行统计建模&#xff0c;书接上回&#xff0c;我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子&#xff0c;那我们现在来看多于两个等位基因的情况的计算。 如果没有看过之前文章的同学&#xff0c;可以先去看一下之前的文章&#xff1a; …

开源租房项目

项目名称项目地址描述体验地址后端代码前端代码小程序端代码gitHubstart租房或房屋交易项目https://github.com/saysky/manland?tabreadme-ov-filePC端 管理端http://manland.liuyanzhao.com/有有无房适–房屋租赁管理平台https://github.com/LiuXIn011/rightHouse开源房屋管理…

非对称加密算法原理与应用1——秘钥的生成

作者:私语茶馆 1.前言 非对称算法有非常多的用途,实现license管控,数字签名,加密内容等等,由于涉及场景和标准非常多,因此实际使用过程中还是存在一定门槛,这里记录一下利用非对称算法RSA的应用关键点,并提供实现license管理的案例。预计拆分为以下几个章节: (1)秘…

【分布式数据仓库Hive】HivQL的使用

目录 一、Hive的基本操作 1. 使用Hive创建数据库test 2. 检索数据库&#xff08;模糊查看&#xff09;&#xff0c;检索形如’te*’的数据库 3. 查看数据库test详情 4. 删除数据库test 5. 创建一个学生数据库Stus&#xff0c;在其中创建一个内部表Student&#xff0c;表格…

【kafka】可视化工具cmak(原kafka-manager)安装问题解决

众所周知&#xff08;反正不管你知不知道&#xff09;&#xff0c;kafka-maneger更名了&#xff0c;现在叫cmak&#xff01;原因是什么呢&#xff1f;据不可靠小道信息说&#xff0c;原kafka-manager这个名字涉及到kafka商标使用问题&#xff0c;应该是被律师函警告了&#xff…

如何批量创建、提取和重命名文件夹!!!

你是否还在一个一个手动创建文件名&#xff01; 你是否还在一个一个手动提取文件名&#xff01; 你是否还在一个一个手动修改文件名&#xff01; 请随小生一起批量自动创建、提取、重命名&#xff01; 1、批量创建文件夹 【案例】创建1日-31日共31个文件夹 【第一步】在A列…

Gradle学习-5 发布二进制插件

注&#xff1a;以下示例基于Gradle8.0 1、发布插件 复制一分 buildSrc&#xff0c;执行命令行&#xff0c;生成一个新目录 leon-gradle-plugin cp -rf buildSrc leon-gradle-plugin在 leon-gradle-plugin 目录下的 build.gradle 中引入maven plugins{// 引用 Groovy 插件&…

(五十二)第 8 章 动态存储管理(边界标识法)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strr…

Linux环境下的字节对齐现象

在Linux环境下&#xff0c;字节对齐是指数据在内存中的存储方式。字节对齐是为了提高内存访问的效率和性能。 在Linux中&#xff0c;默认情况下&#xff0c;结构体和数组的成员会进行字节对齐。具体的对齐方式可以通过编译器选项来控制。 在使用C语言编写程序时&#xff0c;可…

【Linux】线程——线程的概念、线程的特点、线程的优点和缺点、线程和进程、线程函数的使用

文章目录 Linux线程1. 线程的概念1.1 什么是线程 2. 线程的特点2.1 线程的优点2.2 线程的缺点2.4 线程和进程 3. 线程函数的使用pthread_create() 创建线程pthread_self() 获取线程IDpthread_exit() 线程终止pthread_cancel() 线程取消pthread_join() 线程等待pthread_detach()…

茗鹤 | 如何借助APS高级计划排程系统提高汽车整车制造的效率

在我们做了详尽的市场调研及头部汽车制造企业排程需求沟通后&#xff0c;我们发现尽管企业有很多的业务系统做支撑&#xff0c;在计划排程领域&#xff0c;所有的汽车制造总装厂仍旧使用人工“Excel”做排产规划&#xff0c;其中少部分也会借助MRP、第三方辅助排产工具。鉴于我…

JVM原理(十一):JVM虚拟机六种必需对类进行初始化的情况

Java虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这个过程被称作虚拟机的类加载机制。Java天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态链接这个特…

104.二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

每日两题 / 20. 有效的括号 155. 最小栈(LeetCode热题100)

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 遇到左括号入栈 遇到右括号判断栈顶是否为匹配的左括号 最后判断栈是否为空 func isValid(s string) bool {var stk []runefor _, value : range s {if value ( || value { || value [ {stk append(stk, value)}…

阿里巴巴图标库iconfont的使用方式

文章目录 什么是 iconfong创建一个自己的项目如何使用Unicode 使用方法Font class 使用方式Symbol 使用方式还有一种使用方式 在线链接&#xff08;不推荐&#xff0c;但可用于测试&#xff09; 什么是 iconfong Iconfont 是一种图标字体服务。它将各种图标设计转换为字体格式…

【设计模式】行为型-状态模式

在变幻的时光中&#xff0c;状态如诗篇般细腻流转。 文章目录 一、可调节的灯光二、状态模式三、状态模式的核心组件四、运用状态模式五、状态模式的应用场景六、小结推荐阅读 一、可调节的灯光 场景假设&#xff1a;我们有一个电灯&#xff0c;它可以被打开和关闭。用户可以…