[英]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.