我需要验证客户端和服务器的证书。如何在 TCP 级别和 HTTP 级别执行此操作?对于 Http,我使用 cURL 客户端库。OpenSSL 是 SSL 库。这只能通过自签名证书来完成。我需要使用哪个 Web 服务器或 http 服务器来验证客户端的 SSL 证书?
最佳答案
由于您使用的是自签名证书,因此您可以将该证书配置为好像它是一个且唯一的授权 CA。如果对等方出示了那个证书,它将被接受,因为它出现在 CA 列表中。如果对等方出示任何其他证书(或没有证书),则应拒绝。
你没有说你使用的是什么编程语言 libcurl,但这里有一个用于验证服务器的 pyCurl 示例:
req.setopt(pycurl.SSL_VERIFYPEER, 1)
req.setopt(pycurl.CAINFO, "/the/path/to/the/certificate/we/want/the/peer/to/use")
当然,客户端想要向服务器验证自己:
req.setopt(pycurl.SSLCERT, "/the/certificate/the/client/will/present")
req.setopt(pycurl.SSLKEY, "/the/private/key/that/goes/with/it/in/PEM/format")
至于服务器端,通常也很容易配置,但这取决于您使用的网络服务器软件。
编辑:根据要求详细说明“您可以将该证书配置为好像它是一个且唯一的授权 CA”。
通常,对等方会出示证书,本地端会根据 CA(或 CA 列表)对其进行验证。 CA 是与对等方的证书不同的证书。 CA 证书直接或间接签署了对等方的证书。
使用自签名证书时,对等方可以出示该证书。本端可以假装同一个证书是CA证书。因为证书是由自己签名的(根据定义),所以在这种情况下它有资格被有效的 CA 签名...因为有效的 CA 本身就是!
关于security - 如何验证双向 SSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674147/