Простой Java сервер HTTPS

Я должен настроить действительно легкий сервер HTTPS для JAVA-приложения. Это - средство моделирования, это используется в наших лабораториях разработки для моделирования Подключений HTTPS, принятых элементом оборудования в дикой природе. Поскольку это - просто легкое средство разработки и не используется в производстве всегда вообще, я довольно рад обойти сертификации и столько согласования, сколько я могу.

Я - планирование использования HttpsServer класс в Java 6 SE, но я изо всех сил пытаюсь получить его работа. Как тестовый клиент, я использую wget из cygwin командной строки (wget https://[address]:[port]) но wget отчеты, что это "Не могло установить соединение SSL".

Если я работаю wget с -d опция для отладки его говорит мне "отказавшее квитирование SSL".

Я провел 30 минут, гугля это, и все, кажется, просто указывает назад на довольно бесполезную документацию Java 6, которая описывает методы, но на самом деле не говорит о том, как получить проклятую вещь разговор или обеспечить любой пример кода вообще.

Кто-либо может пошагово переместить меня в правильном направлении?

42
задан Matthias Braun 23 June 2019 в 11:37
поделиться

1 ответ

В итоге я использовал следующее:

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");
}

Чтобы создать keystore:

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

См. также здесь.

Потенциально storepass и keypass могут быть разными, в этом случае ks.load и kmf.init должны использовать storepass и keypass, соответственно.

44
ответ дан 26 November 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: