有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在底层支持HTTPS

我们有一个可用的Apache mod_ssl配置。我想为Undertow启用HTTPS支持,以便它同时侦听http和HTTPS,从而避免对Apache的需求

我查过Undertow的javadocs。暗流。Builder类有两个addHttpsListener方法,具有以下签名:

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

因此,我似乎可以在使用Builder API引导Undertow时使用这些工具,例如

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

我不知道如何创建SSLContext变量,或者如何配置KeyManager和TrustManager。 有了mod_ssl正在使用的证书文件,我如何继续为Undertow启用HTTPS

更新:

根据hwellmann的回答,我重用了SslContextFactory.createSslContext()方法。在此之前,我必须将公钥/私钥对转换为PKCS12格式,并将其导入Java密钥库

给出SSL转换/导入命令(取自下面的herehere),希望这些命令对任何人都有用:

# 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

共 (2) 个答案

  1. # 1 楼答案

    这并不是真正特定于底层的问题,只是一个使用证书从密钥库构建SSL上下文的问题

    参见^{}了解与底拖一起使用的示例

  2. # 2 楼答案

    下面是一个关于如何创建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;
        }
    }