客户端证书authentication失败

我试图把我正在编写的客户机/服务器应用程序的整理工作放在一边,但在SSL握手的最后一步似乎有些不妥。

程序的客户端连接并build立与服务器的安全连接没有困难,但是如果我想从程序的服务器端运行操作,它将无法build立任何连接。

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

在服务器端,我的日志反映,当我尝试接受来自客户端的字节时,存在unknown cacertificate unkown

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

你是否必须为客户端应用程序和服务器端应用程序制作不同的证书? 这些有什么区别?

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

通常,当您将服务器configuration为接受客户端证书时,您可以指定一个签名证书,该证书必须用于签署客户端证书。 这可以让服务器知道客户端是“授权的”,无论这可能意味着什么,因为大概你只能为“授权”用户签名证书。

在没有进行任何validation的情况下允许客户端证书通常可以用于大多数服务器,但是这样做会使整个目的失败。

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

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

 openssl s_client -connect host.domain.tld:443 

或者SSL正在监听的端口。 这应该提供有关证书链一直到根CA的信息,并且也为客户端证书提供可接受的CA.

jtpresta在他的一个评论中间接地提出了一个有趣但非常真实的观点:SSL客户端authentication是一团糟。 这是很好的,因为它是绝对安全的,但它很糟糕,因为它很难build立和维护。

除非你有一个很好的理由,否则请使用共享密钥authentication(即“密码”)。 你会节省时间和金钱。 当安全胜过相当大的成本时,SSLauthentication是有利的。