客户端证书认证失败

客户端证书认证失败

我正在尝试将收尾部分放到我正在编写的客户端/服务器应用程序上,但是 SSL 握手的最后一步似乎出现了问题。

该程序的客户端顺利地与服务器建立安全连接,但如果我想从程序的服务器端运行操作,它就无法建立任何连接。

当我尝试通过 Firefox(作为客户端)连接到我的服务器时,浏览器会提醒我该证书不适合该连接。

在服务器端,我的日志反映出每当我尝试接受来自客户端的字节时都会出现unknown ca或。certificate unkown

我想我的问题可以归结为这一点:

您是否必须为客户端应用程序和服务器端应用程序创建不同的证书?它们之间有什么区别?

答案1

就像服务器证书唯一地标识服务器(或域)一样,客户端证书也唯一地标识客户端。就像服务器证书必须由客户端信任的人签名一样,客户端证书也必须由服务器信任的人签名。

通常,当您将服务器配置为接受客户端证书时,您会指定一个必须用于签署客户端证书的签名证书。这让服务器知道客户端已“获得授权”,无论这在您的上下文中意味着什么,因为您可能只会为“获得授权”的用户签署证书。

大多数服务器通常都可以允许客户端证书而不进行任何形式的验证,但这有点违背了整个目的。

答案2

这取决于服务器证书的类型。有时自签名证书可能会有问题。如果它是由证书颁发机构签名的,通常客户端证书也必须由同一 CA 签名,并且可能还需要包含整个证书链。

您可以使用 openssl 通过命令行收集有关客户端证书可接受的 CA 的一些信息:

openssl s_client -连接主机.域.tld:443 

或 SSL 正在监听的任何端口。这应该提供有关证书链的信息,直至根 CA,并且还为客户端证书提供可接受的 CA。

答案3

杰特普雷斯塔在他的一条评论中间接地提出了一个有趣但非常正确的观点:SSL 客户端身份验证一团糟。它很好,因为它绝对安全,但它很糟糕,因为它既难以设置又难以维护。

除非您有非常充分的理由,否则请改用共享密钥身份验证(即“密码”)。这样可以节省时间和金钱。当安全性远远超过成本时,SSL 身份验证非常有用。

相关内容