2017-07-03 57 views
0

在我的这个项目中,我需要在客户端和服务器之间使用SSL/TLS实现安全连接。我发现了一篇很好的文章,所以我设法完成了我的任务,没有任何问题。SSL/TLS动态密钥生成

This is the article

我的问题很简单,但我无法在任何地方找到答案。在这种特殊情况下,我的客户端在SSL协议中具有相同的密钥,该协议是通过上一个链接的教程创建的,并放入某种文件中。这个过程中潜在的问题是有人可以访问该文件,并且由于每个客户端都有该密钥,所以有人可以监听所有连接。

我想问的是,每当某个客户端想要访问服务器并将生成的密钥放入服务器信任库时,是否有机会动态生成密钥?

UPDATE

public static final String PATH_TO_ANDROID_KEYSTORE = "and/client.bks"; 
public static final String PATH_TO_ANDROID_TRUSTSTORE = "and/clienttruststore.bks"; 

String pathToKeyStore = PATH_TO_ANDROID_KEYSTORE; 
String pathToTrustStore = PATH_TO_ANDROID_TRUSTSTORE; 

KeyStore keyStoreKeys = KeyStore.getInstance(keyStoreType); 
keyStoreKeys.load(Gdx.files.internal(pathToKeyStore).read(), passphrase); 

KeyStore keyStoreTrust = KeyStore.getInstance(keyStoreType); 
keyStoreTrust.load(Gdx.files.internal(pathToTrustStore).read(), passphrase); 

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
keyManagerFactory.init(keyStoreKeys, passphrase); 

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
trustManagerFactory.init(keyStoreTrust); 

这是客户端代码和好像客户在他们的信任库已出口服务器的证书,但他们实际使用正在使用的OpenSSL工具生成一次密钥库中相同的私钥。

回答

1

在这种特殊情况下,我的客户端在SSL协议中有相同的密钥,它是通过上一个链接的教程创建的,并放入某种文件中。

不明确。你的意思是他们共享相同的私钥密钥?如果是这样,那么这是您系统设计中的一个缺陷。每个客户都应该有自己的私钥。否则,私钥不会,也不会是私人的。访问该密钥应该通过一个密码存储区,该密码存储区的密码只有应用程序知道,至少可以提供另一道防线。

如果你只是意味着他们都具有服务器的证书的导出副本在他们信任库,存在附加到,在所有存在安全隐患:这是完全正常的。

此过程中的潜在问题是有人可以访问该文件,并且由于每个客户端都有该密钥,所以有人可以监听所有连接。

不,他们不能。 SSL不受中间人攻击的限制,只要你不损害你的私钥,但是如果你在谈论客户私钥,他们可以冒充真实客户端,即使它们不是,如果他们可以突破密钥库密码障碍。

我想问的是,有没有机会在每次某个客户想要访问服务器并将生成的密钥放入服务器信任库时动态生成密钥?

不安全,不在线。如果你的真正的客户可以做到这一点,攻击者也可以做到。这就是信任材料必须离线分发的原因。

+0

我认为他们可能共享相同的私钥,因为我只使用openssl工具生成了一次,但我也认为他们的信任库中有一个导出的服务器证书,因为这是给定文章中的目标。我使用提供的客户端代码进行了更新,因此可能会更清楚一些。 如果情况是我的客户只能共享一个私钥,那我怎么能在通信过程中获得他们自己的私钥? 顺便说一句,我真的很感激你的气喘吁吁的解释! –

+0

您必须为客户端的每个副本分配一个不同的私钥,或者在安装时生成自己的私钥,并在某种程度上安全地在首次使用时向服务器注册该私钥。 – EJP

+0

你能想到一些我可能想看看的代码示例吗? –