2015-01-12 3 views
2

У нас есть рабочая конфигурация Apache mod_ssl. Я хочу включить поддержку HTTPS для Undertow, чтобы он прослушивал как http, так и https, тем самым избавляя от необходимости Apache.Включение HTTPS в Undertow

Я изучил javadocs Undertow. Класс Undertow.Builder имеет два метода addHttpsListener со следующими подписями:

public Builder addHttpsListener(int port, String host, 
     KeyManager[] keyManagers, TrustManager[] trustManagers); 
    public Builder addHttpsListener(int port, String host, 
     SSLContext sslContext) { 

Так что, кажется, я могу использовать их, когда развернув Undertow с помощью Builder API, например,

Undertow server = Undertow.builder() 
        .addHttpsListener(8443, "localhost", sslContext) 
        .build(); 

Я не уверен, хотя, как создать переменную SSLContext, или как настроить KeyManagers и TrustManagers. Имея файлы сертификата, которые используются mod_ssl, как я могу продолжить, включив HTTPS для Undertow?

UPDATE:

За ответ hwellmann, я уже повторно SslContextFactory.createSslContext() метод. До этого мне пришлось преобразовать пару открытых/закрытых ключей в формат PKCS12 и импортировать их в хранилище ключей Java.

Придание преобразования/импорта команд преобразования SSL (взятые из here и here) ниже, надеюсь, это будет полезно для тех, кто:

# Convert to PKCS12  
$ openssl pkcs12 -export -out output_cert.pfx -inkey input_cert.key -in input_cert.crt -certfile intermediate.crt 

# Import into Java keystore 
$ keytool -v -importkeystore -srckeystore output_cert.pfx -srcstoretype PKCS12 -destkeystore output_store.jks -deststoretype JKS 

ответ

4

Это на самом деле не Undertow конкретным, это просто вопрос строительства контекст SSL из хранилища ключей с сертификатом.

См. SslContextFactory.java для примера, используемого с Undertow.

+0

спасибо ! Это сработало! – siphiuel

0

Существует пример в исходном коде прибойный о том, как создать в SSLContext: https://github.com/undertow-io/undertow/blob/e8473ec35c420b782e072723d1e6338548def842/examples/src/main/java/io/undertow/examples/http2/Http2Server.java#L76

SSLContext sslContext = createSSLContext(loadKeyStore("server.keystore"), loadKeyStore("server.truststore")); 

...

private static SSLContext createSSLContext(final KeyStore keyStore, final KeyStore trustStore) throws Exception { 
    KeyManager[] keyManagers; 
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    keyManagerFactory.init(keyStore, password("key")); 
    keyManagers = keyManagerFactory.getKeyManagers(); 

    TrustManager[] trustManagers; 
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(trustStore); 
    trustManagers = trustManagerFactory.getTrustManagers(); 

    SSLContext sslContext; 
    sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(keyManagers, trustManagers, null); 

    return sslContext; 
} 

...

private static KeyStore loadKeyStore(String storeLoc, String storePw) throws Exception { 
    InputStream stream = Files.newInputStream(Paths.get(storeLoc)); 
    if(stream == null) { 
     throw new IllegalArgumentException("Could not load keystore"); 
    } 
    try(InputStream is = stream) { 
     KeyStore loadedKeystore = KeyStore.getInstance("JKS"); 
     loadedKeystore.load(is, storePw.toCharArray()); 
     return loadedKeystore; 
    } 
} 
Смежные вопросы