golang mitm 遇到的问题
最近在做一个 cache server,打算支持中间人方案。具体的实施就是自签一个 ca,提供给用户添加到系统进行信任,用这个 ca 去动态签发用户的目标站点证书。其实也就是一个 burp
的样子。
具体的代码实现会在下一篇文章中讲述,这篇只讨论遇到的问题。
1. SerialNumber 序列号是什么
这里面说的比较明白,序列号需要对于 CA 唯一,是一个 big int,我直接随机了。在写死的时候浏览器会对序列号报错。
2. 出现 common name not found
x509.Certificate.Subject.CommonName
不得为空,一般会为第一个 DNSName
.
3. 浏览器证书信任了,但是在 MacOS curl 的时候提示 unable to get local issuer certificate
这个也找了老半天,最后根据经验猜测和搜索,认为是没有 bundle certificate,bundle 完错误消失。
4. 浏览器证书信任了,但是在 MacOS curl 的时候提示 self signed certificate in certificate chain
这个错误超级恶心,因为提示信息和错误不符,真正的原因可以使用 safari 来查看,会报告“证书不符合标准”,后来在 https://github.com/golang/go/issues/51991#issuecomment-1081998366 才看到一个可能的原因——签发时间过长(我一开始签发的是 10 年的)。
后来翻阅互联网找到了 apple 的政策,https://support.apple.com/en-us/HT210176,对于自签名证书最多允许 825 天的签发时间。同时对于公开可信证书,还有 398 天的限制以及 sct 要求。
5. 泛域名证书对于顶级域不生效
比如 *.net
是不对于 hunsh.net
生效的。
golang mitm 遇到的问题
https://hunsh.net/archives/148/