0

新しいライセンスのリクエストを送信し、そのサーバーで既存のライセンスを検証するクライアント アプリと共に、Java でライセンス サーブレットをセットアップしています。サーブレットは Tomcat で実行されます。https を介したサーブレットへの接続のみを許可するように Tomcat を構成しましたが、これは問題なく動作します。

'keytool -genkey -alias www.mysite.com -keyalg RSA -keystore license.store'ファイルを作成する自己署名証明書を作成し、 license.storeTomcat をこの keystoreFile にパスワードで指定しましたasdf1234

Java で https 経由でクライアントからサーブレットに接続しようとするとPKIX path building failed、証明書がトラストストアにないため、おなじみのメッセージが表示されます。この提案を使用してこれを修正しようとした結果、以下のコードが得られました。

private SSLSocketFactory getSSLFactory() throws Exception {

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    InputStream is = this.getClass().getResourceAsStream("license.store");

    if(is ==null) {
        return null;
    }

    keyStore.load(is, "asdf1234".toCharArray());
    is.close();

    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore);

    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(null, tmf.getTrustManagers(), null);

    return ctx.getSocketFactory();
}

その後、私は電話します:

HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
con.setSSLSocketFactory(getSSLFactory());

これにより、接続が成功します。

問題は、 をlicense.storeクライアントにコピーして にロードした場合にのみ機能することKeyStore.load()です。サーバーが使用する秘密鍵とそのパスワードをクライアントにコピーすることは、あまり安全ではないと思います。license.store から公開鍵のみを抽出して使用する方法はありますか? 私はこのフォーラムや他のフォーラムを 1 日間検索してきましたが、見つけられないようです。

4

1 に答える 1

3

公開鍵と秘密鍵のペアを生成するのではなく、サーバーの証明書を (クライアントの) Java トラストストアにインポートする必要があります。証明書はシークレットではないため、クライアント側にセキュリティ上のリスクはありません。-importkeytool のオプションを参照してください。ここにがあります。

于 2013-01-17T23:02:03.350 に答える