0

如何以编程方式创建私钥并在 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();
4

1 回答 1

1

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

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

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

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

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

于 2012-07-25T22:34:54.593 回答