这是我第一次有人要求连接到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();
服务器要求进行基本身份验证,这是异常的原因吗?
答案 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;
}
}
}