出站(!) SSL 连接 Wildfly

4
我们的Wildfly 8.1服务器需要与组织网络中的服务器建立出站(!)LDAPS连接。此连接仅用于同步各种应用程序数据。不幸的是,没有关于Wildfly出站信任库的文档。我所做的每项研究都只给我有关启用入站连接SSL的结果。
请问我该如何为Wildfly的出站SSL连接添加证书?是否有相关文档?感谢您对此主题提供的任何帮助。

你打算使用某种Wildfly服务来建立连接吗? - K.Nicholas
不需要,单例Bean就足够了。 - PeteSabacker
也许把你的证书放在一个jar文件里之类的东西里面?我的意思是,我认为Java SSL客户端只需要设置一个属性来指定文件位置。我不认为它需要特别与容器进行交互。我不知道容器是否有可用的“信任服务”,但我承认我从未真正尝试过那些东西。为您提供文件。 - K.Nicholas
感谢您的帮助。我找到了解决方案,请看我的答案。 - PeteSabacker
看起来和我想的差不多,证书将会在你的.war文件中的某个地方,类加载器会找到它。不过要注意,最好了解当getResourceAsStream返回null时的情况,以防万一。 - K.Nicholas
当然,谢谢你的提示! - PeteSabacker
1个回答

2

我找到了两个可能的解决方案。首先是我不会使用的一个:

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);

我更喜欢第二个:
public class LDAPSSocketFactory extends SSLSocketFactory {

private SSLSocketFactory actualSocketFactory;

public LDAPSSocketFactory() {

    InputStream certificateInputStream = this.getClass().getClassLoader().getResourceAsStream("yourcert.pfx");

    try {

        KeyStore pkcs12 = KeyStore.getInstance("pkcs12");

        pkcs12.load(certificateInputStream, "".toCharArray());

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

        tmf.init(pkcs12);

        SSLContext ctx = SSLContext.getInstance("TLS");

        ctx.init(null, tmf.getTrustManagers(), null);

        actualSocketFactory = ctx.getSocketFactory();

    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }

}

//Override methods by simply deligating them to the actualSocketFactory

}

将此作为JNDI参数传递以进行LDAP连接:

env.put("java.naming.ldap.factory.socket", "LDAPSSocketFactory");

我在StackOverflow上找到了以下所有内容,但我忘记了具体位置,所以我在这里粘贴了他们的解决方案。


任何一种都可以成为您的解决方案 - 当您直接调用API时,WildFly不参与管理出站连接。 - Darran L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接