内网证书管理

网站迁移

为什么必须要 https

  1. 前端浏览器安全机制, 如果非https很多功能不让用, 如调用摄像头;
  2. 前端浏览器跨域, 页面和接口都必须https;
  3. 现在很多程序调用默认https协议, 如果使用http需要很多复杂配置;

内网开发经历的阶段

第一阶段: 全部 http

困难: 经常要处理https协议相关的配置和开关, 非常多;

第二阶段: 自签ca证书

困难:

  1. 每个终端和服务器都需要手工导入证书:
  2. 特别是容器化后, 每个容器镜像都需要处理这个证书问题, 第三方镜像可能还需要自己再封装一次;
  3. 各语言加载证书的机制也不同, go, nodejs, java, python 等加载证书的方法各不相同, 有的根本没有使用系统证书;

反复处理这个私有证书信任的问题

第三阶段: 公有证书

即外部购买一个1年期的泛域名证书, 内部所有服务都使用它

困难:

  1. 忘记续期
  2. 续期后操作步骤繁多, 去多个地方替换
  3. 小型测试环境每年花200买个证书也是小贵;

第四阶段: 免费证书+自动续签+自动更新

使用 letsencrypt 的免费证书, 通过 acme 机制自动续签;

这个是最终办法了;

优势:

  1. 主流浏览器是支持 letsencrypt 证书的;
  2. linux下
  3. 免费
  4. 很多工具和web服务器都支持自动申请和续期

缺点:

  1. 经验证, windows cmd 终端环境没有信任 letsencrypt 的根证书;

免费证书

letsencrypt 证书
每次可以申请一个3个月的证书

http挑战验证也可以申请到泛域名证书

证书管理方式

  1. 通过 acme 脚本方式
  2. 原生支持的网关程序: traefix, nginx(acme模块), caddy, higress 等现代网关都支持
  3. cert-manager 集群内证书自动管理

注意事项

  1. letsencrypt 生产环境有限流, 不能频繁申请; 相同域名一周限制5次, 调试阶段尽量使用letsencrypt的测试网地址进行验证。
  2. 当同一个域名在多个地区使用时, 如云上和本地都在用时, 最好是统一到一处进行申请;
  3. 多个申请源时, 最好不要申请泛域名证书, 容易冲突;

泛域名证书的冲突场景
云上环境申请了一个 *.abc.com 的证书A, 本地内网的网关也申请了一个 *.abc.com 的证书B时;
当用户成功打开过一个域名后, 证书会有缓存;有时候浏览器会存在拿A证书去请求 B环境的域名;
即你打开的是B环境的 test.abc.com 的域名, 浏览器上看到使用的却是 A 环境的证书,此时证书校验就不通过;

避免冲突的办法;

  1. 不使用泛域名证书, 全部使用 指定二级域名证书;
  2. 统一申请源, 只在一处申请泛域名证书, 续期后采用其它机制推送到别的网关进行更新;

配合dns解析

  • 在外网时公网dns将域名解析到公网入口
  • 在内网时内网dns服务器将域名解析到内网入口
Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2026-03-03 00:00 UTC