很多人申请域名之余,为了正常访问,还要选择SSL证书颁发机构(CA)来申请证书,
正常情况下是这样的:
生成CSR(证书签名请求): 由申请平台自动生成CSR,并自行留存,以备后续使用。 提交申请: 按照指引提交申请,还有对IP地址或域名的所有权进行验证。 这些验证可能需要通过映射外网端口或提供其他所有权证明。 支付费用: 所选CA可能还会要求支付费用,所以每年都要按照指示完成支付。
目前互联网上绝大多数的情况下都是使用https加密方式数据传输,那么在局域网内提供的服务如何实现这种打开方式呢?
我在一台安装了CentOS 9的系统上,将原本只能通过HTTP+IP+端口访问的内置服务器,改造为支持HTTPS+IP+端口在局域网内方式访问。
本篇内容,可解决开源项目:公众号文章导出( wechat-article-exporter )(见下图),需要https支持,在此抛砖引玉,也可将次应用到其他需要https的服务中。

CentOS 9默认无自带的应用服务器,通常用Nginx做反向代理是最通用、稳定的方案。
一、环境前置检查(CentOS 9)
首先确认系统基础环境,执行以下命令:
# 1. 更新系统(可选,确保依赖最新)
sudo dnf update -y
# 2. 检查防火墙状态(CentOS 9默认用firewalld)
sudo systemctl status firewalld
# 若未启动,执行:sudo systemctl start firewalld && sudo systemctl enable firewalld
# 3. 关闭SELinux(避免权限干扰,测试环境推荐;生产环境可微调规则)
sudo setenforce 0 # 临时关闭
sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config # 永久关闭(需重启生效)
二、步骤1:安装OpenSSL并生成自签名证书
CentOS 9默认已安装OpenSSL,直接生成证书(核心:Common Name填服务器内网IP,本处以192.168.1.100为例)。
1. 创建证书存放目录
# 创建专属目录,避免和系统证书混淆
sudo mkdir -p /etc/nginx/ssl # 后续Nginx会用这个路径,统一管理
sudo chmod 700 /etc/nginx/ssl # 提高安全性,仅root可访问
cd /etc/nginx/ssl
2. 生成自签名证书(一步到位,无需手动填信息)
执行以下命令(替换192.168.1.100为你的服务器内网IP):
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \\
-keyout server.key \\
-out server.crt \\
-subj "/C=CN/ST=Province/L=City/O=Local/CN=192.168.1.100"
参数说明:
-
-x509:直接生成自签名证书(无需CSR中间步骤);
-
-nodes:私钥不加密(避免启动Nginx时需要输入密码);
-
-days 3650:证书有效期10年;
-
CN=192.168.1.100:核心!必须填服务器内网IP,否则浏览器提示证书不匹配;
-
其他字段(C/ST/L/O)可自定义,不影响局域网访问。
3. 验证证书文件
ls /etc/nginx/ssl/
# 应输出:server.key(私钥) server.crt(证书)
sudo chmod 600 /etc/nginx/ssl/* # 权限加固,仅root可读,本处可不做
三、步骤2:安装并配置Nginx(反向代理实现HTTPS)
CentOS 9的AppStream仓库包含Nginx,直接安装即可,通过Nginx反向代理将HTTPS请求转发到你的原有HTTP服务。
1. 安装Nginx
# 安装Nginx
sudo dnf install -y nginx
# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
# 验证Nginx启动状态
sudo systemctl status nginx
# 看到 "active (running)" 即为成功
2. 配置Nginx反向代理(核心)
假设你的原有HTTP服务运行在127.0.0.1:3000(替换为你的实际HTTP服务端口,比如3000/80等),配置Nginx监听13000端口的HTTPS请求,并转发到原有HTTP服务。
# 备份默认配置(避免冲突),如系统没有,可不用做此步骤
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
# 创建自定义HTTPS配置文件
sudo vim /etc/nginx/conf.d/https-proxy.conf
将以下内容粘贴到文件中(重点替换标注的两处配置):
# 监听13000端口的HTTPS请求(IP访问)
server {
listen 13000 ssl; # 核心:13000端口 + SSL(HTTPS)使用13000避免与3000冲突
listen [::]:13000 ssl; # 兼容IPv6(可选)
server_name _; # 匹配所有IP,无需域名
# 加载自签名证书(路径和之前生成的一致)
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置(CentOS 9推荐)
ssl_protocols TLSv1.2 TLSv1.3; # 仅支持安全的TLS版本
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
# 反向代理到你的原有HTTP服务(★替换为你的实际端口★)
location / {
proxy_pass http://127.0.0.1:3000; # 比如原有服务是8080端口
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; # 告诉后端服务是HTTPS
}
}
3. 验证Nginx配置并重启
# 检查配置语法是否正确(关键!避免配置错误导致Nginx启动失败)
sudo nginx -t
# 输出 "nginx: configuration file /etc/nginx/nginx.conf test is successful" 即为正确
# 重启Nginx使配置生效
sudo systemctl restart nginx
四、步骤3:放行防火墙端口(CentOS 9)
CentOS 9默认防火墙会拦截3000端口,需要手动放行:
# 放行3000/TCP端口(HTTPS用TCP协议)
sudo firewall-cmd –add-port=3000/tcp –permanent
# 重新加载防火墙规则
sudo firewall-cmd –reload
# 验证端口是否放行
sudo firewall-cmd –list-ports
# 应看到 "3000/tcp"
五、步骤4:测试局域网HTTPS访问
1. 服务器本地测试
# 用curl测试(-k忽略自签名证书的安全提示)
curl -k https://192.168.1.100:3000
# 若返回原有HTTP服务的内容,说明配置成功
2. 局域网其他设备测试
在同一局域网的电脑/手机浏览器中访问:
https://你的服务器内网IP:13000(比如https://192.168.1.100:13000)
浏览器提示处理:
-
Chrome/Edge:点击「高级」→「继续访问xxx(不安全)」;
-
Firefox:点击「高级」→「添加安全例外」→「确认例外」;
-
手机浏览器:同理,选择「继续访问」即可(仅局域网测试用,无安全风险)。
六、常见问题排查
访问超时:检查防火墙是否放行3000端口、Nginx是否启动、原有HTTP服务是否正常;
证书不匹配:重新生成证书,确保CN=后是服务器内网IP;
Nginx启动失败:执行sudo nginx -t检查配置语法,或查看日志sudo journalctl -u nginx。
针对你遇到的「Job for nginx.service failed because the control process exited with error code」报错,按以下步骤精准排查解决(结合你选中的Nginx配置,重点排查以下4点):
1. 优先检查配置语法(最常见原因):执行sudo nginx -t,若提示「syntax is ok」则语法无问题,若提示具体行错误(如括号不匹配、路径错误),打开配置文件sudo vim /etc/nginx/conf.d/https-proxy.conf,对照选中的配置内容修正(比如括号未闭合、标点符号缺失,CentOS 9 Nginx对语法要求严格,空格、分号不能遗漏); 2. 检查证书路径和权限:确认证书文件存在且Nginx可访问,执行ls -l /etc/nginx/ssl/,若文件不存在,重新生成证书;若权限不足,重新执行sudo chmod 600 /etc/nginx/ssl/*,并确保证书路径与配置文件中ssl_certificate、ssl_certificate_key的路径完全一致(无拼写错误); 3. 排查端口冲突(选中配置监听3000端口):执行netstat -tulpn | grep 3000,若显示3000端口已被其他服务占用,可修改Nginx配置中的监听端口(如3001),或停止占用端口的服务(sudo systemctl stop 占用服务名); 4. 查看详细错误日志定位问题:执行sudo journalctl -xeu nginx.service,日志中会明确提示失败原因(如「invalid SSL certificate」「address already in use」),根据提示针对性解决,比如证书损坏则重新生成,端口冲突则调整端口。 解决后重新执行sudo nginx -t验证配置,无误后再重启Nginx:sudo systemctl restart nginx。
总结
核心流程:CentOS 9下生成以服务器内网IP为CN的自签名证书 → 安装Nginx并配置反向代理(监听13000端口HTTPS,转发到原有HTTP服务) → 放行防火墙13000端口;
关键注意:自签名证书的CN必须填服务器内网IP,否则浏览器会提示证书无效;
适配调整:只需修改Nginx配置中的proxy_pass为你的实际HTTP服务端口,即可适配任意内置/自定义HTTP服务。
按照以上步骤操作后,你就能在局域网内通过https://服务器IP:13000稳定访问目标服务了。
