簡體   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