Golang https证书错误:远程错误:tls:未知的证书颁发机构

Pen*_*ang 10 firefox self-signed go

我已经使用以下方法制作了我的证书和密钥

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
Run Code Online (Sandbox Code Playgroud)

并在我的 Golang 代码中配置它

log.Fatal(http.ListenAndServeTLS(":4201", "cert.pem", "key.pem", router))
Run Code Online (Sandbox Code Playgroud)

它在使用 chrome 访问时运行良好,但在使用 firefox 访问时会在控制台上引发错误。

2018/03/02 16:54:11 http:来自 100.67.56.121:54397 的 TLS 握手错误:远程错误:tls:未知的证书颁发机构

我该如何解决这个问题?

mat*_*tpr 7

“远程错误”是指从客户端(本例中为 Firefox)发送的错误。

解决方案是找出为什么 Firefox 不喜欢证书并修复它。

firefox 不喜欢证书的某些方面。打开 firefox 开发工具,看看是否可以找到有关证书的任何警告。如果您必须在 Firefox 中手动接受证书,那么即使您已经告诉 Firefox 加载页面,Firefox 仍有可能向服务器报告它不喜欢该证书(请参阅下面的 chrome 示例)。

但是,由于这是一个自生成/签名的证书,因此警告可能是因为 Firefox 不信任此证书。如果此服务器仅供您个人使用,则解决方案是将此证书添加到 firefox 的受信任证书中……或者获取由商业 CA 或 letencrypt 签名的证书。

“修复此服务器端”意味着修复有关您的证书/应用程序如何提供服务的任何内容,以使其受到 Firefox 的信任。或者,如果您只是在进行开发,我想忽略这些错误。

更多细节...

这里的关键是这是一个“远程错误”,这意味着它是来自 tls 客户端连接到您的服务器的错误。在您的情况下,Firefox 在 TLS 握手期间抱怨证书在某种程度上无效。

我注意到 chrome 也有同样的事情。证书由公共 CA(即大多数浏览器应该信任的 CA)签名,但当我在本地机器上开发时,证书无效,因为主机名 (localhost) 与证书 CommonName (CN) 或主题不匹配备用名称 (SAN)。

最简单的方法就是查看wireshark 中的TLS 握手。

线鲨握手捕获

我告诉 chrome 接受证书,开始捕获并刷新页面(在这种情况下为https://localhost:8081)。Chrome 不会向我显示警告页面并显示内容。但是地址栏中有一个红色警告。

有趣的是(对我而言)似乎(我不是 TLS 专家)有两次 TLS 握手。

Client Hello Server Hello Alert (client error) Client Hello Server Hello Client 完成握手...加密的应用程序数据...

由于 chrome 不会中断我对页面的刷新,我不确定为什么 chrome 为单个页面刷新进行两次握手(第一次使用警报/失败)。

我在这里学到的有趣的一点(事后看来很明显)是,当浏览器/客户端拒绝您的证书时,可以从他们那里获得报告。这可用于服务器端(如果受到监控),以发现您的测试用例可能未涵盖的生产中细微的证书错误配置。不幸的是,因为这是 pre-http,你不会得到用户代理或任何有用的东西来帮助复制......但是作为服务器流量百分比的大量这些错误表明你需要做一些严重的跨浏览器/操作系统/设备测试