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