为什么必须要 https
- 前端浏览器安全机制, 如果非https很多功能不让用, 如调用摄像头;
- 前端浏览器跨域, 页面和接口都必须https;
- 现在很多程序调用默认https协议, 如果使用http需要很多复杂配置;
内网开发经历的阶段
第一阶段: 全部 http
困难: 经常要处理https协议相关的配置和开关, 非常多;
第二阶段: 自签ca证书
困难:
- 每个终端和服务器都需要手工导入证书:
- 特别是容器化后, 每个容器镜像都需要处理这个证书问题, 第三方镜像可能还需要自己再封装一次;
- 各语言加载证书的机制也不同, go, nodejs, java, python 等加载证书的方法各不相同, 有的根本没有使用系统证书;
反复处理这个私有证书信任的问题
第三阶段: 公有证书
即外部购买一个1年期的泛域名证书, 内部所有服务都使用它
困难:
- 忘记续期
- 续期后操作步骤繁多, 去多个地方替换
- 小型测试环境每年花200买个证书也是小贵;
第四阶段: 免费证书+自动续签+自动更新
使用 letsencrypt 的免费证书, 通过 acme 机制自动续签;
这个是最终办法了;
优势:
- 主流浏览器是支持 letsencrypt 证书的;
- linux下
- 免费
- 很多工具和web服务器都支持自动申请和续期
缺点:
- 经验证, windows cmd 终端环境没有信任 letsencrypt 的根证书;
免费证书
letsencrypt 证书
每次可以申请一个3个月的证书
http挑战验证也可以申请到泛域名证书
证书管理方式
- 通过 acme 脚本方式
- 原生支持的网关程序: traefix, nginx(acme模块), caddy, higress 等现代网关都支持
- cert-manager 集群内证书自动管理
注意事项
- letsencrypt 生产环境有限流, 不能频繁申请; 相同域名一周限制5次, 调试阶段尽量使用letsencrypt的测试网地址进行验证。
- 当同一个域名在多个地区使用时, 如云上和本地都在用时, 最好是统一到一处进行申请;
- 多个申请源时, 最好不要申请泛域名证书, 容易冲突;
泛域名证书的冲突场景
云上环境申请了一个 *.abc.com 的证书A, 本地内网的网关也申请了一个 *.abc.com 的证书B时;
当用户成功打开过一个域名后, 证书会有缓存;有时候浏览器会存在拿A证书去请求 B环境的域名;
即你打开的是B环境的 test.abc.com 的域名, 浏览器上看到使用的却是 A 环境的证书,此时证书校验就不通过;
避免冲突的办法;
- 不使用泛域名证书, 全部使用 指定二级域名证书;
- 统一申请源, 只在一处申请泛域名证书, 续期后采用其它机制推送到别的网关进行更新;
配合dns解析
- 在外网时公网dns将域名解析到公网入口
- 在内网时内网dns服务器将域名解析到内网入口