创建信任库以仅验证由JAVA中的自定义CA签名的证书

时间:2013-08-01 12:37:14

标签: java android ssl certificate truststore

我希望这不是重复。 我目前正在研究基于netty的客户端服务器游戏和Android上的客户端。我正在尝试建立一个安全的登录过程,所以我尝试在java socket上使用ssl。

我设法创建了一个自签名证书并使用了SSL。问题是我找到的示例源代码使用à自定义TrustManagerFactory,它不对证书有效性进行任何检查。由于我不想允许Man In The Middle攻击,我搜索了有关SSL握手的更多信息,这是我理解的:

  1. 要启动SSL会话,客户端会向服务器发送请求。
  2. 拥有证书的服务器(.jks或.bks)将公共信息提取到X509证书中并发送给客户端。
  3. 客户端检查证书的有效性(在我目前的解决方案中无效)
  4. 如果检查成功,则从证书中检索服务器的公钥,生成随机密钥,使用公钥对其进行加密并将其发送到服务器。
  5. 服务器使用他的私钥解密随机生成的密钥。
  6. 客户端和服务器现在共享相同的随机密钥,并使用此密钥开始通信以进行对称加密(如AES)。
  7. 我不需要接受来自我自己服务器以外的任何人的证书,所以我想到了2个解决方案:

    1. 在客户端保存X509并创建à自定义TrustManager,只接受此证书。此解决方案似乎易于实现,但很难维护,因为服务器端的每个证书更改都需要在每个客户端上更新X509证书。
    2. 使用此证书创建我自己的CA证书签署我的ssl证书,并以某种方式管理我的客户端以仅信任所有使用我的CA签名的证书。
    3. 我对CA身份验证的理解是:

      1. CA根证书是包含密钥对的普通证书。
      2. 使用CA签署证书意味着在正在签名的证书的末尾添加使用CA私钥加密的整个证书的散列。
      3. 此签名包含在X509证书中,并附有一些有关CA的信息。
      4. 要检查证书有效性,客户端会生成证书哈希并将其与X509证书中包含的解密哈希(使用CA公钥)进行比较。
      5. 因此,如果我没有误解所有这些,如果我想实施我的第二个解决方案,我需要向客户提供CA证书,以便他可以检查证书。我已经看到可以使用信任库初始化TrustManager。我认为它必须是与根CA不同的证书,因为它的整体安全性取决于我的CA私钥的机密性。所以我的问题是:

        1. 此客户端信任库应包含什么以及如何从我的根CA生成?
        2. 我有红色,ssl引擎因自签名证书而被破坏。那么我的第二个解决方案在Android上是否可行?
        3. 如果这可行,如果我发现有人设法以某种方式获取我的私钥,我怎么能使证书无效?我有关于crl的红色内容,但我不知道如何在我的信任库中生成/使用它们?
        4. 提前感谢。

1 个答案:

答案 0 :(得分:0)

我只能回答你的部分问题:

  1. 信任库应包含您的CA,您可以使用keytool生成它:
    http://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html
  2. 没问题,你可以在android中以与使用java.security。*和org.apache.http。* classes的java相同的方式实现它。一个警告,对于Android版本< = 2.3,您可能需要实现一种解决方法,因为缺少一些公共CA并且它不支持错误排序的证书链。如果需要,我可以给你更多细节。
  3. 我不知道
  4. 修改
    一个好的句子:
    http://nelenkov.blogspot.com/2011/12/using-custom-certificate-trust-store-on.html