【问题标题】:key gen to server stock服务器库存的密钥生成器
【发布时间】:2012-07-24 08:24:55
【问题描述】:

如何以编程方式创建私钥并在 SSL 套接字中使用它?

我在下面放了一个注释异常,我试图将密钥添加到密钥库,但我没有证书链。

    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(1024, new SecureRandom());
    KeyPair keypair = keyGen.generateKeyPair();

    System.setProperty("javax.net.ssl.keyStore", System.getProperty("user.home")
        + File.separator +
            + "/keystore.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "xyz");

    KeyManagerFactory keyManagerFactory = KeyManagerFactory
            .getInstance("SunX509");
    KeyStore keyStore = KeyStore.getInstance("JKS");
    keyStore.load(null, "xyz".toCharArray());

    //setKeyEntry parameter 3 can not be null: 
    //IllegalArgumentException: Private key must be accompanied by certificate chain
    keyStore.setKeyEntry("alias", keypair.getPrivate(),
            "xyz".toCharArray(), null);

    keyManagerFactory.init(keyStore, "xyz".toCharArray());
    // keyStore.load
    SSLContext context = SSLContext.getInstance("TLS");// "SSLv3"
    context.init(keyManagerFactory.getKeyManagers(), null,
            new SecureRandom());
    ServerSocketFactory socketFactory = context.getServerSocketFactory();
    ServerSocket ssocket = socketFactory.createServerSocket(1443);
    Socket socket = ssocket.accept();

【问题讨论】:

  • 我差不多有了(keyStore.setKeyEntry("alias", keypair.getPrivate(), "xyz".toCharArray(), null)) 但是,最后一个参数是必需的证书链,但是我没有证书链。 ...我不想要额外的 JAR,但我可能必须包含 bouncycastle 才能做到这一点:blog.thilinamb.com/2010/01/how-to-generate-self-signed.html
  • HI Alen,问题是:如何以编程方式创建私钥并在 SSL 套接字中使用它?

标签: java ssl


【解决方案1】:

如何以编程方式创建私钥并在 SSL 中使用它 插座?

只创建一个私钥,甚至只创建一个私钥/公钥对都没有什么意义。您需要在服务器上设置一个与此私钥关联的证书。

X.509 证书是相当复杂的结构,基于 ASN.1 语法。我强烈建议您使用 BouncyCastle(或多或少如您链接到的博客文章中所述)。手工完成这一切并非易事。 (如果您不相信,请查看 BouncyCastle 类的源代码。)

此外,动态创建此证书(及其关联的私钥)没有什么意义。证书的重点是允许客户端验证它正在与之交谈的服务器的身份。客户端通过根据其拥有的受信任证书列表检查服务器证书来执行此操作(使用 PKI 或通过与手动配置的特定服务器证书进行单独比较)。

如果您动态生成自签名证书,则客户端无法将其与事先知道的内容进行比较。如果您的服务器也是 CA(对于类似于 MITM 代理服务器的应用程序),它可能会很有用。

【讨论】:

  • 如果我创建 X.509 并将其包含在程序中会怎样?不需要唯一的 x509,只需唯一的密钥。顺便说一句,我将设计这个应用程序来为新用户创建新密钥,然后允许他们链接比较指纹。每个新连接都需要两次批准(每端一个)。他们将使用短信、电话等方式相互授权。所以,不管我使用什么 CA,这仍然应该是非常安全的。
  • 如果您有外部方法来验证密钥,那很好。只是通过电话/文本获取时,即使是指纹在可用性方面也可能有点长。请记住,证书还将身份与密钥相关联(因此用户还需要知道它是谁的密钥)。 X.509 证书包含公钥。您必须构建正确的 DER 结构并手动签名(与 this answer 的第二部分相反,用于验证签名)。从公钥手动构建格式良好的 DER 结构可能很乏味(并且容易出现错误)。
  • 原来我不需要 SSL 套接字。我将直接使用密码流。谢谢你的帮助。我对证书链有了更深入的了解。
  • @jcalfee314,与使用经过验证的 SSL/TLS 实施相比,手动处理密码流通常更复杂且更不安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2018-10-05
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多