【发布时间】:2015-11-01 19:35:20
【问题描述】:
我目前正在编写一个桌面应用程序,它需要通过 https(使用自签名证书)与我的远程服务器上的 PHP 脚本进行通信。服务器-客户端通信代码仍处于规划阶段,但是因为我还没有弄清楚如何(在客户端上)验证我实际上是在与我的服务器通信。我假设有某种方法可以使用证书验证服务器身份。我打算使用 WinHTTP 进行 https 通信,前提是它具有我需要的所有功能。
【问题讨论】:
我目前正在编写一个桌面应用程序,它需要通过 https(使用自签名证书)与我的远程服务器上的 PHP 脚本进行通信。服务器-客户端通信代码仍处于规划阶段,但是因为我还没有弄清楚如何(在客户端上)验证我实际上是在与我的服务器通信。我假设有某种方法可以使用证书验证服务器身份。我打算使用 WinHTTP 进行 https 通信,前提是它具有我需要的所有功能。
【问题讨论】:
为了大大简化事情:客户端通过使用受信任的证书颁发机构的硬编码列表来验证服务器的证书。证书颁发机构列表是嵌入客户端的内部证书列表,客户端验证服务器提供的证书是否由客户端信任的证书颁发机构之一签名。
因此,无论您最终做什么,您的客户都必须保留某种它信任的证书列表。这是 TLS 信任模型的一个基本方面。您可以简单地将您的自签名证书包含在客户端中,然后客户端会验证您的服务器是否提供了相同的证书。
但正确的答案是运行您自己的证书颁发机构。它涉及一些额外的预先准备工作,但最终结果会更好。您的客户端将在其信任列表中只有一个受信任的证书颁发机构,而不是包含在您的操作系统或浏览器中的几十个左右的标准证书颁发机构:您自己的证书颁发机构,您的客户端将验证您的服务器证书由您的证书颁发机构签署。
【讨论】: