0

当我使用 https 登录我的银行帐户时,在我输入登录信息之前,它只是服务器端 SSL 身份验证。我的浏览器在 SSL 会话期间根据来自服务器的证书信息进行服务器身份验证。我不必手动将服务器证书作为受信任的证书导入到我的浏览器中。它只是在 SSL 交换期间的运行时发生。

另一方面,当您查看其安装指南时,我还看到了必须手动导入证书(例如使用 keytool)的应用程序。

问题是:如果证书信息是在 SSL 会话开始时交换的,那么每一方都有足够的信息来验证另一方。为什么有些应用程序需要在客户端和服务器之间手动导入证书。无论是一方认证还是双方认证。

基于以下响应的附加信息:我指的是我正在安装基于客户端-服务器模型的商业软件并打开客户端 SSL 身份验证的场景。我将服务器安装在机器 A 上,并将 2 个客户端安装在我的专用网络中的不同机器上。在安装过程中,服务器在本地生成一个自签名证书。2个客户也是如此。安装完成后,我被要求将客户端的证书复制到服务器机器并手动将它们导入为受信任的证书。此外,将服务器证书复制到客户端计算机并导入到其受信任的存储中。他们在 java keytool 之上提供了一个包装工具来执行证书导入。为什么这里需要手动导入吗?无论如何,客户端和服务器将在 SSL 握手期间交换证书信息并执行身份验证。同样,这些是此处涉及的自签名证书和 CA。

4

2 回答 2

0

SSL 服务器的证书必须由证书颁发机构 (CA) “担保”。您的浏览器(或其他程序)包含它信任的 CA 列表。如果您使用的站点未经标准 CA 之一认证,则必须导入其 CA 才能成功验证。

任何合法网站(尤其是网上银行)都不应要求您使用“替代”CA。仅对您不发送超级敏感数据的网站执行此操作。

于 2011-04-24T06:31:14.233 回答
0

请注意,证书是由证书颁发机构签署的,因此它取决于您的浏览器信任的证书颁发机构。如果 Web 服务器发送由浏览器/应用程序信任的证书颁发机构签名的证书,并且该证书有效,则您不应收到任何警告。

另一方面,如果浏览器从 Web 服务器接收到证书并且它不信任签署该证书的证书颁发机构,则浏览器将采取一些措施——至少,它应该警告您这一点。当您从网站导入证书时,您实际上是在告诉您的浏览器您已决定信任该证书,而与签名者无关。

编辑:同样的推理适用:密钥库保留受信任的证书颁发机构及其相应证书的列表。PKI 的整个概念是有一个受信任的CA 的层次结构,为其他方发出签名证书。如果证书是自签名的,那么就没有有效的信任链——Java 怎么知道证书不是被攻击者伪造的?

您假设客户端和 Web 服务器之间的连接是隐式信任的,因为证书是在 SSL 握手期间交换的。如果中间的人冒充 Web 服务器,而不是发送服务器证书,而是发送他自己的证书,该怎么办?客户如何知道中间人收到的证书不可信?如果证书是由受信任的 CA 签名的,或者证书已作为受信任的证书手动添加到密钥库中,则客户端可以检查它是否应该信任该证书。

于 2011-04-24T06:32:04.900 回答