Kubernets 集群,使用 ingress-nginx 作为 ingress-controller,使用的是 Let’s Encrypt 证书。
因为国内网络原因,ocsp.int-x3.letsencrypt.org
被DNS污染了,直接解析出来的主机无法通过国内网络直接访问。iOS
系统回强制https的在线证书校验逻辑,导致会经常连接超时或初次连接速度很慢,影响用户体验。
解决办法有两个:
- 客户端重新实现TLS连接,跳过
在线证书校验
,找到个现成的库:https://github.com/zymxxxs/YMHTTP - Web服务通过开启
OCSP Stapling
可以代替客户端做在线证书校验
,将验证结果直接返回客户端
通过客户端的方式解决,在用浏览器直接访问时还是会慢,这里主要介绍服务端解决方案:
nginx
是支持 OCSP Stapling
配置也很简单
1 | server { |
集群使用的是 ingress-nginx
,使用helm部署这样配置values (只展示了关键配置)
1 | controller: |
但是还有一个问题,服务端也需要访问 ocsp.int-x3.letsencrypt.org
来获取证书验证信息
在这里,找到个解决办法:https://blog.csdn.net/qq_34581279/article/details/106147220
只需要将 ocsp.int-x3.letsencrypt.org
解析到这个IP 23.32.3.72
即可
在集群内实现这一点有如下几个方法:
1.修改集群coredns配置,添加解析配置
参考配置文档:https://coredns.io/plugins/hosts/
注意,配置中 fallthrough
必须添加,否则会导致集群网络异常
1 | apiVersion: v1 |
2.修改 ingress-nginx
的Pod配置,添加dnsConfig
添加dnsConfig指向自部署DNS服务器,自部署的DNS服务器添加A记录 ocsp.int-x3.letsencrypt.org
–> 23.32.3.72
这里使用helm通过部署coredns部署DNS服务器 https://hub.helm.sh/charts/stable/coredns 我当前使用的版本:1.10.1
values配置如下:
1 | service: |
ingress-nginx
安装使用的是官方提供的 helm chart:https://kubernetes.github.io/ingress-nginx/deploy/#using-helm
values关键配置如下:
1 | controller: |
3.修改 ingress-nginx
的Pod配置,添加hostAliases(此方法无效,仅提供思路给大家测试)
添加hostAliases将域名重新指向
经测试此方法虽然可以让ingress-nginx
容器内网络按预期走,但是nginx做OCSP时并没有成功按预期解析域名
需要先修改ingress-nginx
的chart,添加设置hostAliases支持
1 | # 拉去chart |
配置文件较长仅列出关键修改,所有修改都是添加,参照修下面添加到对应位置即可:
1 | # values.yaml |
1 | # templates/controller-deployment.yaml |
1 | # templates/controller-daemonset.yaml |
至此chart修改完成,修改部署时的 values
1 | controller: |
最后附上测试脚本,验证是否成功
1 | echo QUIT | openssl s_client -connect xxxxxxxxx.com:443 -servername xxxxxxxxx.com -status 2> /dev/null | grep -A 17 'OCSP response:' |
输出以下内容说明开启并获取 OCSP Stapling 成功
1 | OCSP response: |
输出以下内容说明开启并获取 OCSP Stapling 失败
1 | OCSP response: no response sent |