【问题标题】:How can I verify a self-signed certificate?如何验证自签名证书?
【发布时间】:2015-11-01 19:35:20
【问题描述】:

我目前正在编写一个桌面应用程序,它需要通过 https(使用自签名证书)与我的远程服务器上的 PHP 脚本进行通信。服务器-客户端通信代码仍处于规划阶段,但是因为我还没有弄清楚如何(在客户端上)验证我实际上是在与我的服务器通信。我假设有某种方法可以使用证书验证服务器身份。我打算使用 WinHTTP 进行 https 通信,前提是它具有我需要的所有功能。

【问题讨论】:

    标签: c++ ssl winhttp


    【解决方案1】:

    为了大大简化事情:客户端通过使用受信任的证书颁发机构的硬编码列表来验证服务器的证书。证书颁发机构列表是嵌入客户端的内部证书列表,客户端验证服务器提供的证书是否由客户端信任的证书颁发机构之一签名。

    因此,无论您最终做什么,您的客户都必须保留某种它信任的证书列表。这是 TLS 信任模型的一个基本方面。您可以简单地将您的自签名证书包含在客户端中,然后客户端会验证您的服务器是否提供了相同的证书。

    但正确的答案是运行您自己的证书颁发机构。它涉及一些额外的预先准备工作,但最终结果会更好。您的客户端将在其信任列表中只有一个受信任的证书颁发机构,而不是包含在您的操作系统或浏览器中的几十个左右的标准证书颁发机构:您自己的证书颁发机构,您的客户端将验证您的服务器证书由您的证书颁发机构签署。

    【讨论】:

    • 为了简单起见,我认为第一个解决方案将是我所采用的。我遇到了一个似乎将这个解决方案与 WinHTTP 一起使用的答案。 stackoverflow.com/questions/25125165/… 虽然我可以在如何实施检查方面提供一些帮助。我是否会暂停我的函数,该函数将与服务器联系,直到回调得到满足?
    • 我碰巧认为用你自己的替换你的 TLS 堆栈的证书颁发机构列表要简单得多,只需让你的堆栈以​​正常方式设置 TLS 连接,而不是循环设置建立自己的证书验证回调,然后担心正确验证服务器的证书,检查有效性/过期时间等......
    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多