繁体   English   中英

如何配置wildfly在重新安装时使用https和ClientBuilder?

[英]How to configure wildfly to use https with ClientBuilder in resteasy?

这是我第一次有人要求连接到https网址。 在很短的时间内,我开始知道我需要传递SSLContext

我也知道我需要在standalone.xml中配置才能完成它。

任何指向解决方案/链接的指针,工作代码将非常感激。

我们自己必须生成密钥库吗? 或wildfly提供任何现有的?

这就是我尝试过的:

    SSLContext context = null;
    KeyManagerFactory kmf = null;
    KeyStore ks = null;
    char[] storepass = "somestringhere".toCharArray();
    char[] keypass = "somestringhere".toCharArray();

    try {
        context = SSLContext.getInstance("SSL");
    } catch (NoSuchAlgorithmException e3) {
        // TODO Auto-generated catch block
        e3.printStackTrace();
    }
    try {
        kmf = KeyManagerFactory.getInstance("SunX509");
    } catch (NoSuchAlgorithmException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }
    FileInputStream fin = null;
    try {
        fin = new FileInputStream("file here");
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        ks = KeyStore.getInstance("JKS");
    } catch (KeyStoreException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        ks.load(fin, storepass);
    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (CertificateException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    try {
        kmf.init(ks, keypass);
    } catch (UnrecoverableKeyException | KeyStoreException | NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        context.init(kmf.getKeyManagers(), null, null);
    } catch (KeyManagementException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Client client = ClientBuilder.newBuilder().sslContext(context).build();

    WebTarget target = client
            .target("https://....");

    Builder builder = target.request();

我试过https://stackoverflow.com ,它给了200OK,我试过google.com,它说文件已经移动了302状态。 我尝试了我要连接的url我得到了peer not authenticated exception

Caused by: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:421) [jsse.jar:1.7.0_71]
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128) [httpclient-4.2.5.jar:4.2.5]
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572) [httpclient-4.2.5.jar:4.2.5]
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) [httpclient-4.2.5.jar:4.2.5]
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) [httpclient-4.2.5.jar:4.2.5]
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640) [httpclient-4.2.5.jar:4.2.5]
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479) [httpclient-4.2.5.jar:4.2.5]
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) [httpclient-4.2.5.jar:4.2.5]
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) [httpclient-4.2.5.jar:4.2.5]
    at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283) [resteasy-client-3.0.6.Final.jar:]
    ... 30 more

并且服务器要求进行基本身份验证,这是异常的原因吗?

“我们必须自己生成密钥库吗?”

是。 您需要为服务器和信任存储(它只是一个密钥存储区生成一个,但我们只是将其称为信任存储区来区分它)。

请参阅Wildfly文档中的SSL设置指南 它将向您展示如何创建密钥库并使用Wildfly进行配置。 只需按照“使用keytool进行纯Java SSL设置”一节

然后,您需要创建客户端密钥库。 您将从服务器存储导出证书并将其导入客户端存储。

它的工作原理是Client需要信任服务器。 这样做的方法是通过服务器证书。 现在,如果证书是由着名的CA签署的,通常Java已经支持此证书,我们不需要配置客户端。 但是,由于您要创建自己的自签名证书,因此我们需要将客户端配置为信任服务器证书,方法是将其导入信任库。

您可以在此帖子中看到处理客户端服务器的证书/存储的所有步骤。 向下滚动到第5步。以keytool开头的三个代码段是完成此任务的命令。 第一个创建名为tomcat-keystore.jks的服务器存储(但您可以将其命名为任何内容)。 下一个代码片段将证书从密钥库导出到文件名tomcat.crt (但您可以将其命名为任何内容)。 第三个命令将先前的证书导入到client-truststore.jks (但您可以将其命名为任何内容)。 您会注意到您不需要显式创建信任存储,它将在我们执行导入时隐式创建。

获得服务器密钥库后,请按照上面链接的wildfly文档中的说明进行操作,并将该存储配置为服务器。

要配置Client ,请参阅上面链接的答案中的步骤6。 它使用我们创建的信任库来配置客户端。 代码中的所有内容都是标准的Java和JAX-RS,但Basic身份验证的配置除外,该身份验证特定于Jersey。

以下是我使用Wildly 10使用JAX-RS和HTTPS的代码。注意,JAX-RS的Wildly实现是RestEasy 3.xxxx。

ClientBuilder builder = ClientBuilder.newBuilder();
builder.sslContext(ConnectionFactory.getSslContext());
builder.hostnameVerifier(ConnectionFactory.getHostnameVerifier());
client = builder.build();
String baseURI = acsUser.getSelectedService().getWebserviceBaseUrl();
WebTarget webTarget = client.target(baseURI);

这是名为ConnectionFactory的类。

public class ConnectionFactory {

Proxy proxy;

String proxyHost;

Integer proxyPort;

public boolean canConnect = true;

private static final Logger log = Logger.getLogger("ReportPortal");

public ConnectionFactory() {
}

/**
 *
 * @return
 */
public static SSLContext getSslContext() {
    SSLContext sslContext = null;
    try {
        sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, new TrustManager[]{new      SecureTrustManager()}, new SecureRandom());
    }
    catch (NoSuchAlgorithmException | KeyManagementException ex) {
        log.error("ERROR OCCURS", ex);
    }
    return sslContext;
}

/**
 *
 * @return
 */
public static HostnameVerifier getHostnameVerifier() {
    return (String hostname, javax.net.ssl.SSLSession sslSession) -> true;
}

public Boolean isHttps(String url) {

    if (url.startsWith("https://")) {
        return Boolean.TRUE;
    }
    else {
        return Boolean.FALSE;
    }
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM