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 に答える