52

Java アプリケーション用に非常に軽量な HTTPS サーバーをセットアップする必要があります。これは、私たちの開発ラボで使用されているシミュレータであり、実際の機器によって受け入れられる HTTPS 接続をシミュレートします。これは純粋に軽量な開発ツールであり、本番環境ではまったく使用されていないため、認定や交渉をできる限り回避できて非常に満足しています。

Java 6 SE でクラスを使用することを計画していますが、機能させるのHttpsServerに苦労しています。テスト クライアントとして、wgetcygwin コマンド ライン ( wget https://[address]:[port])から使用していwgetますが、「SSL 接続を確立できません」と報告されます。

デバッグのオプションを指定して実行するwgetと、 「SSL ハンドシェイクに失敗しました」と表示されます。-d

私はこれをグーグルで30分費やしましたが、すべてがメソッドを説明するかなり役に立たないJava 6ドキュメントを指しているように見えますが、実際には、ひどいことを話す方法やサンプルコードを提供する方法についてはまったく話していません。

誰かが私を正しい方向に向けることができますか?

4

5 に答える 5

51

私が最終的に使用したのはこれでした:

try {
    // Set up the socket address
    InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), config.getHttpsPort());

    // Initialise the HTTPS server
    HttpsServer httpsServer = HttpsServer.create(address, 0);
    SSLContext sslContext = SSLContext.getInstance("TLS");

    // Initialise the keystore
    char[] password = "simulator".toCharArray();
    KeyStore ks = KeyStore.getInstance("JKS");
    FileInputStream fis = new FileInputStream("lig.keystore");
    ks.load(fis, password);

    // Set up the key manager factory
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(ks, password);

    // Set up the trust manager factory
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(ks);

    // Set up the HTTPS context and parameters
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
        public void configure(HttpsParameters params) {
            try {
                // Initialise the SSL context
                SSLContext c = SSLContext.getDefault();
                SSLEngine engine = c.createSSLEngine();
                params.setNeedClientAuth(false);
                params.setCipherSuites(engine.getEnabledCipherSuites());
                params.setProtocols(engine.getEnabledProtocols());

                // Get the default parameters
                SSLParameters defaultSSLParameters = c.getDefaultSSLParameters();
                params.setSSLParameters(defaultSSLParameters);
            } catch (Exception ex) {
                ILogger log = new LoggerFactory().getLogger();
                log.exception(ex);
                log.error("Failed to create HTTPS port");
            }
        }
    });
    LigServer server = new LigServer(httpsServer);
    joinableThreadList.add(server.getJoinableThread());
} catch (Exception exception) {
    log.exception(exception);
    log.error("Failed to create HTTPS server on port " + config.getHttpsPort() + " of localhost");
}

キーストアを生成するには:

$ keytool -genkeypair -keyalg RSA -alias self_signed -keypass simulator \
  -keystore lig.keystore -storepass simulator

こちらもご覧ください

storepass と keypass が異なる可能性があります。その場合、ks.loadkmf.initはそれぞれ storepass と keypass を使用する必要があります。

于 2010-02-24T02:06:17.140 に答える