0

我正在编写一个应用程序,该应用程序应确保两方之间的安全连接(称它们为客户端和服务器)。

服务器应限制哪些客户端可以使用 https 进行连接。为此,服务器将颁发一定数量的证书,当客户端尝试连接时将对其进行检查。如果客户端使用的证书不在受信任列表中,则无法建立连接。

此证书应使用某种 USB 设备分发。因此,当使用我的应用程序的客户端尝试使用 https 从服务器获取某些内容时,应用程序应该从 USB 设备读取该证书并使用它来建立 https 连接。私钥应始终在设备上保密。

到目前为止,我设法在客户端和服务器 (JKS) 上创建本地密钥库,将它们添加到彼此的受信任列表中,并使用它们来实现正确的连接。

我的问题是:客户端证书是否可以由服务器颁发并传输到客户端,以及 https 连接所需的私钥?我不希望在客户端计算机上创建任何数据或密钥库,建立 https 连接所需的一切都应该在该设备上。设备可以有一些程序和 api 来帮助这个过程并确保私钥的保密性。

任何帮助将不胜感激 :)

4

2 回答 2

0

如果您不信任客户端来保护他们的凭据,那么用于身份验证的普通客户端证书方法效果不佳 - 这似乎是您的情况。

将证书放在 USB 设备上可使其远离客户端计算机的磁盘,但不会阻止客户端用户访问它并将其分发给其他人。另一方面,它降低了第 3 方从“静止”的客户端计算机窃取证书的风险——但前提是客户端正确保护了 USB 密钥。因此,您需要清楚您要防御哪些威胁,以及您信任谁。

使客户端用户的证书完全“私有”的唯一方法是将其放在某种防篡改设备上,并使用在身份验证期间不将证书传输到客户端计算机的方法。

将您的方法与用于网上银行的方法进行比较,在这些方法中,向客户发放可以使用银行卡和 PIN(双因素身份验证)进行质询响应的设备。卡的详细信息不受卡芯片的随意攻击;但是系统假设客户会照看他们的卡和 PIN,并及时报告盗窃(因为这是他们的钱有风险!)。如果客户没有动力去照看凭证,那么这种方法就没有意义。

如果您只想确保客户端具有不可共享的令牌,您可以考虑使用SecurID设备或类似设备,它们是您问题的现成解决方案。

于 2012-10-25T13:43:19.710 回答
0

客户端证书是否可以由服务器颁发并传输到客户端,以及 https 连接所需的私钥?

从技术上讲,他们可以,但如果您想确保私钥仅到达其预期用户,您将不得不通过其他方式对该连接进行身份验证。就您的整体方案而言,这并没有真正的帮助。此外,通过将私钥作为数据发送给客户端,他们可能能够以一种或另一种方式提取它。

如果您可以物理发送 USB 设备,则可以使用支持PKCS#11的硬件加密令牌。此类令牌往往具有以无法提取的方式存储私钥的选项(它只能与设备一起使用)。它们倾向于以各种形式出现:作为智能卡(在这种情况下您需要读卡器)或作为 USB 令牌(它看起来像记忆棒,但事实并非如此)。根据型号的不同,USB 令牌实际上可以是带有嵌入式读卡器的智能卡。

Java 支持PKCS#11 密钥库,因此如果此令牌带有 PKCS#11 驱动程序/库,则可以从 Java 中使用它。

于 2012-10-25T13:56:14.930 回答