如果信任存储区应该只包含根CA证书(这似乎是我所读过的建议),那么如何限制对特定方的访问(而不是信任存储区中CA验证的任何一方)。 / p>
更多细节:
我有两个java应用程序 - 让我们称之为A和B - 使用SSL来保护通信。 A和B都有一个客户端和服务器部分来发送(客户端)和接收(服务器)消息。客户端使用存储在client.keystore中的密钥,服务器使用server.keystore中的密钥,并且都使用单个信任存储来验证其他应用程序的身份(即,应用程序A有3个密钥库,应用程序B有3个密钥库)
到目前为止,我已经使用keytools为客户端和服务器生成密钥,对其进行签名(使用我自己的测试CA),并将签名的证书加载回密钥库。我为app A和B执行此操作。为了完成SSL握手,我发现truststores需要包含用于签署其他apps密钥的CA证书(因此app A的truststore必须包含CA证书)用于签署应用B的客户端和服务器密钥,反之亦然。)
到目前为止,这是有道理的,但由于信任存储包含根CA证书,我可以生成另一组密钥,使用相同的CA对其进行签名,并让其他应用程序接受它们 - 换句话说,应用B将会接受一个看似app A的流氓代理,只要它具有由根CA签名的密钥。
SSL是否有防止这种情况的机制?我已经尝试将app A的客户端和服务器的公钥导入app B的信任存储区(反之亦然),但没有根证书,SSL握手将无法完成。
答案 0 :(得分:3)
SSL是否有防止这种情况的机制?
没有。 SSL提供隐私,完整性和身份验证。同龄人是他们所说的人。你所谈论的是授权:这个同伴是我想与之交谈的同伴吗?这是一项应用责任。您可以通过SSLSocket.getSession()
获取对等证书链并在握手期间通过HandshakeCompletedListener
检查它以授权对等方。如果您不喜欢他,请关闭插座。连接上没有其他任何事情可以发生。