OpenWrt 配置 SSL 证书并开启 HTTPS 访问(自签 + acme.sh)

AI 摘要大番茄AI

OpenWrt 后台默认 HTTP 明文,登录密码易被同网段抓包。改用 HTTPS 需安装 SSL 组件、获取证书(内网自签,有域名用 acme.sh)并配置 uHTTPd 监听 443、设置证书路径和 HTTP 跳转。注意私钥权限与防火墙放行,异常时可更换 SSL 后端。

此内容由AI根据文章内容自动生成。

OpenWrt 后台默认是 HTTP 明文访问,登录密码在网络上裸奔,同一网段的人抓个包就能拿到。给它配上 SSL 证书走 HTTPS 就安全多了。整件事拆开就是三步:装 SSL 支持库 → 弄到证书 → 配置 uHTTPd。下面按这个顺序讲,内网用自签证书、有域名用 acme.sh 两条路都给出来。

一、安装 SSL 支持组件

先用 SSH 登录路由器(Windows 用 MobaXterm 或自带的 ssh 命令),执行:

opkg update && opkg install openssl-util luci-app-uhttpd

如果 wget 抓 HTTPS 地址时报错,说明缺少 CA 根证书和 SSL 后端,再补一条:

opkg install libustream-openssl ca-certificates

二、生成自签证书(内网无域名适用)

先建目录:

mkdir -p /etc/ssl/private /etc/ssl/certs

生成私钥:

openssl genrsa -out /etc/ssl/private/selfsigned.key 2048

签发证书,-days 365 是有效期天数,-subj 里按需改成自己的信息:

openssl req -x509 -nodes -days 365 \
  -key /etc/ssl/private/selfsigned.key \
  -out /etc/ssl/certs/selfsigned.crt \
  -subj "/C=CN/ST=Local/L=Home/O=OpenWrt/CN=router.lan"

没有域名又想少一点浏览器警告,可以额外加 -addext "subjectAltName=IP:192.168.11.1",把 IP 写进证书(换成你自己的路由器地址)。

三、有域名:用 acme.sh 申请免费证书

自签证书浏览器会提示「不安全」,内网自用无所谓,要从外网访问就得用正规证书。acme.sh 一条命令搞定申请和续期:

curl https://get.acme.sh | sh
acme.sh --issue --dns dns_cf -d 你的域名

--dns dns_cf 表示用 Cloudflare 的 DNS 接口做验证,需要先在环境变量里配置 CF 的 API Token。其他 DNS 服务商把参数换成对应的即可。

证书签发下来还要安装到 uHTTPd 能读到的位置(直接引用 acme.sh 目录的话,续期后路径会变):

acme.sh --install-cert -d 你的域名 \
  --key-file /etc/ssl/private/selfsigned.key \
  --fullchain-file /etc/ssl/certs/selfsigned.crt \
  --reloadcmd "/etc/init.d/uhttpd restart"

不想折腾命令行的话,也可以在 《RouterOS/OpenWrt 配置 HTTPS:openssl 自签证书全流程》 里看另一种手动签发方式,或者走 FreeSSL 这类网站申请一年期证书。

四、配置 uHTTPd 并启用 HTTPS

编辑配置文件:

vi /etc/config/uhttpd

确认里面几项写对,重点是监听地址和证书私钥路径:

config uhttpd 'main'
    list listen_http '0.0.0.0:80'
    list listen_https '0.0.0.0:443'
    option cert '/etc/ssl/certs/selfsigned.crt'
    option key '/etc/ssl/private/selfsigned.key'
    option redirect_https '1'
  • listen_https:让 uHTTPd 在 443 端口提供 HTTPS,没有这一行只有证书也不生效
  • cert / key:证书和私钥路径,用前面生成或安装的那个
  • redirect_https '1':把 HTTP 请求强制跳 HTTPS,可选,加上更安全

保存后重启服务生效:

/etc/init.d/uhttpd restart

之后浏览器访问 https://路由器IP,能正常打开就说明配置成功了。

五、常见问题

uHTTPd 时不时不响应或直接崩掉:这是部分 OpenWrt 版本上 libustream-openssl 的老问题,换一套 SSL 后端即可:

opkg remove libustream-openssl
opkg install libustream-wolfssl

也可以装 libustream-mbedtls。三者选一个就行:OpenSSL 功能全但占内存大,WolfSSL 轻量适合小内存设备,mbedTLS 在 ARM 上表现更好。装完用这条确认:

opkg list-installed | grep -E 'libustream|ca-certificates'

浏览器提示「您的连接不是私密连接」:自签证书的必然结果,点「高级 → 继续访问」即可,内网自用不必在意。

证书怎么选:只在家里访问 → 自签;要从外网访问 → Let’s Encrypt 三个月自动续期、Cloudflare 源服务器证书十五年、或者国内的 FreeSSL 一年期。

六、几点安全提醒

  • 证书和私钥别放在 web 目录(/www)下面,会被人直接下载
  • 私钥权限设 400,证书设 444,命令:chmod 400 /etc/ssl/private/selfsigned.key
  • 443 端口要在防火墙放行,外网访问还要在路由器上做端口映射

以上步骤由大番茄(997wan.com)整理并实机验证,不同 OpenWrt 版本的菜单名称可能略有差异,遇到问题欢迎留言讨论。

上一篇 PVE 系统 img 格式转换教程:qm importdisk 安装 OpenWrt
下一篇 AI 评论审核助手 + AI 评论自动回复插件(本站自研)