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

时间:2018-03-02 08:00:13

标签: firefox go self-signed

我使用以下

制作了我的证书和密钥
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

并在我的Golang代码

中配置它
log.Fatal(http.ListenAndServeTLS(":4201", "cert.pem", "key.pem", router))

使用chrome访问时效果很好,但在使用firefox访问时会在控制台上抛出错误。

  

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

“远程错误”表示从客户端发送的错误(在这种情况下为Firefox)。

解决方案是弄清为什么firefox不喜欢该证书并进行修复。

firefox对证书有些不满意。打开firefox开发工具,查看是否可以找到有关证书的任何警告。如果您必须在Firefox中手动接受证书,则Firefox可能仍会向服务器报告它不喜欢证书,即使您已告诉firefox无论如何也要加载页面(请参见下面的chrome示例)。

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

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

更多详细信息...

这里的关键是,这是一个“远程错误”,这意味着tls CLIENT连接到您的服务器时出现了错误。对于您而言,是Firefox在TLS握手期间抱怨证书在某种程度上无效。

我发现铬也有同样的现象。证书由公共CA(即大多数浏览器应该信任的CA)签名,但是当我在本地计算机上进行开发时,证书无效,因为主机名(localhost)与证书CommonName(CN)或Subject不匹配备用名称(SAN)。

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

wireshark handshake capture

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

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

客户您好 服务器你好 警报(客户端错误) 客户您好 服务器你好 客户完成握手 ...加密的应用程序数据...

由于chrome不会中断我的页面刷新,所以我不确定为什么chrome两次为一次刷新都会进行两次握手(第一次是Alert / failure)。

我在这里学到的有趣的一点(事后看来很明显)是,当浏览器/客户端拒绝您的证书时,可以从中获取报告。可以在服务器端(如果受监视)上使用它来发现生产中细微的证书错误配置,而您的测试用例可能无法覆盖这些错误配置。不幸的是,由于这是HTTP之前的版本,因此您将不会获得用户代理或任何有助于重现的有用信息。...但是,这些错误的数量(按服务器流量的百分比)表明您需要进行认真的跨浏览器/操作系统/设备测试