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

时间:2015-06-05 07:33:31

标签: java ssl jax-rs resteasy wildfly

这是我第一次有人要求连接到https网址。在很短的时间内,我开始知道我需要通过setup( [...] extra_compile_args=['-O2', '-march=native'], extra_link_args=['-O2', '-march=native'])

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

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

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

这是我尝试过的:

SSLContext

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

    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();

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

2 个答案:

答案 0 :(得分:3)

  

"我们是否必须自己生成密钥库?"

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

请参阅Wildfly文档中的SSL setup guide。它将向您展示如何创建密钥库并使用Wildfly进行配置。只需按照“使用keytool"

的纯Java SSL设置”部分进行操作即可

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

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

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

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

要配置Client,请参阅上述链接答案中的第6步。它使用我们创建的信任库来配置客户端。代码中的所有内容都是标准的Java和JAX-RS,但Basic auth的配置除外,这是针对Jersey的。

答案 1 :(得分:2)

以下是我使用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;
    }
}

}