【问题标题】:Detect on the server-side if a client rejects my TLS certificate在服务器端检测客户端是否拒绝我的 TLS 证书
【发布时间】:2018-08-29 23:39:09
【问题描述】:

我正在 Node.js 中构建一个 HTTP 代理,它尝试使用自签名证书拦截 HTTPS 连接。我正在使用裸http.Server,实例化我自己的tls.TLSSocket 以根据需要升级套接字,并且当客户端信任CA 时,该功能都可以正常工作。

如果客户端没有配置 CA,它显然会拒绝连接,抱怨链中有一个自签名证书。

应该是这样,但我想要一种方法来检测服务器端是否发生了这种情况,这样我就可以提示用户正确配置他们的客户端。

可以这样做吗?似乎 TLS RFC (https://www.rfc-editor.org/rfc/rfc5246#section-7.2.2) 有很多关于证书拒绝的错误警报消息,我希望能涵盖这一点,但即使使用NODE_DEBUG=tls,我也无法在 Node 中看到任何调试信息。

我真的很想订阅 TLS 错误警报事件,这样我就可以直接对其中的各种有趣案例做出反应。我该怎么做?

【问题讨论】:

    标签: javascript node.js ssl https error-handling


    【解决方案1】:

    通常你看到的只是客户端关闭了连接。一些客户端可能会发送警报,而其他客户端则不会 - 确切的行为取决于 TLS 堆栈。无论如何,您无论如何都无法从这个死连接中重定向客户端。

    您可能会尝试使用纯 HTTP 提供一些初始页面,其中包含来自 HTTPS 资源的一些图像或类似内容,使用由您的 CA 签署的证书。使用一些脚本,您可以检测客户端是否已成功加载图像,在后一种情况下,您可以显示有关需要安装某些证书的信息。

    【讨论】:

    • 我在用户本地机器上运行一个应用程序,所以通知很容易,我不需要重定向。不过,源很可能不是浏览器,因此页面中的 HTTPS 图像将不起作用。我想我可以为握手后立即关闭而没有数据传递的任何套接字添加警告。
    • > “一些客户端可能会发送警报,而其他客户端则不会 - 确切的行为取决于 TLS 堆栈”您知道有哪些客户端肯定会发送/不发送警报吗?这对测试非常有用。
    • @TimPerry:据我所知,SChannel(Edge,IE)只是在出错时关闭连接。至于其余的,我建议创建一些小型测试站点,捕获流量并使用wireshark进行检查。 “我可以为握手后立即关闭而没有数据传递的任何套接字添加警告” - 我认为这是解决问题的有用方法。
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2015-09-27
    • 2014-06-01
    • 1970-01-01
    • 2020-08-16
    • 2019-02-14
    • 2014-11-17
    相关资源
    最近更新 更多