具有自签名证书的Jersey
我目前在一个开发环境中工作,我们使用自签名证书。我已经尝试了一天多一点的时间让jersey忽略自签名证书。这纯粹是为了一个POC环境,我做梦也没想到会做这样的制作。虽然我在互联网上找到了许多关于如何使这项工作成功的答案,但仍有一些问题没有解决 以下是我当前的测试课程:具有自签名证书的Jersey,jersey,Jersey,我目前在一个开发环境中工作,我们使用自签名证书。我已经尝试了一天多一点的时间让jersey忽略自签名证书。这纯粹是为了一个POC环境,我做梦也没想到会做这样的制作。虽然我在互联网上找到了许多关于如何使这项工作成功的答案,但仍有一些问题没有解决 以下是我当前的测试课程: public class JerseyTestClient { private static final Logger LOG = Logger.getLogger(JerseyTestClient.class.getName(
public class JerseyTestClient {
private static final Logger LOG = Logger.getLogger(JerseyTestClient.class.getName());
public static void sendTestRequest() {
try {
Client client = Client.create(configureClient());
WebResource webResource = client.resource("https://server/endpoint/");
ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}
List<Hardware> output = response.getEntity(new GenericType<List<Hardware>>() {});
LOG.severe("Output from Server .... \n");
LOG.severe("Nr of entries: " + output.size());
} catch (Exception e) {
LOG.log(Level.SEVERE, " test request failed", e);
}
}
public static ClientConfig configureClient() {
TrustManager[ ] certs = new TrustManager[ ] {
new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
LOG.severe("getAcceptedIssuers");
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
LOG.severe("checkServerTrusted");
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
LOG.severe("checkClientTrusted");
}
}
};
SSLContext ctx = null;
try {
ctx = SSLContext.getInstance("TLS");
ctx.init(null, certs, null);
} catch (java.security.GeneralSecurityException e) {
LOG.log(Level.SEVERE, "Error", e);
}
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
LOG.severe("verify");
return true;
}
});
ClientConfig config = new DefaultClientConfig();
try {
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(
new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
LOG.severe("verify");
return true;
}
},
ctx
));
} catch(Exception e) {
LOG.log(Level.SEVERE, "Error", e);
}
return config;
}
公共类JerseyTestClient{
私有静态最终记录器LOG=Logger.getLogger(JerseyTestClient.class.getName());
公共静态void sendTestRequest(){
试一试{
Client=Client.create(configureClient());
WebResource WebResource=client.resource(“https://server/endpoint/");
ClientResponse response=webResource.accept(“application/json”).get(ClientResponse.class);
if(response.getStatus()!=200){
抛出新的RuntimeException(“失败:HTTP错误代码:+response.getStatus());
}
列表输出=response.getEntity(新的GenericType(){});
LOG.severe(“来自服务器的输出…”\n);
LOG.severe(“条目数:+output.size());
}捕获(例外e){
LOG.LOG(严重级别,“测试请求失败”,e);
}
}
公共静态客户端配置客户端(){
TrustManager[]证书=新的TrustManager[]{
新X509TrustManager(){
@凌驾
公共X509证书[]getAcceptedIssuers(){
对数严重(“getAcceptedIssuers”);
返回null;
}
@凌驾
public void checkServerTrusted(X509Certificate[]链,字符串authType)
抛出证书异常{
日志严重(“checkServerTrusted”);
}
@凌驾
public void checkClientTrusted(X509Certificate[]链,字符串authType)
抛出证书异常{
日志严重(“checkClientTrusted”);
}
}
};
SSLContext ctx=null;
试一试{
ctx=SSLContext.getInstance(“TLS”);
init(null,certs,null);
}catch(java.security.GeneralSecurityException e){
LOG.LOG(严重级别,“错误”,e);
}
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(新的HostnameVerifier(){
@凌驾
公共布尔验证(字符串主机名、SSLSession会话){
严重日志(“验证”);
返回true;
}
});
ClientConfig=newdefaultclientconfig();
试一试{
config.getProperties().put(httpsprroperties.PROPERTY\u HTTPS\u属性,新的httpsprroperties(
新主机名验证程序(){
@凌驾
公共布尔验证(字符串主机名、SSLSession会话){
严重日志(“验证”);
返回true;
}
},
ctx
));
}捕获(例外e){
LOG.LOG(严重级别,“错误”,e);
}
返回配置;
}
}
虽然一切似乎都正常,但TrustManager和HostnameVerifier中的日志行从未出现在日志中,并且连接仍然会失败,get(ClientResponse.class)上出现SSL握手异常
我已经研究了一段时间了,当我将它与所有教程进行比较时,人们说他们已经修复了它,我没有发现任何区别
如果有人能指出其中应该存在的缺陷,那么…我的公司BITPlan发布了一个开源项目,以简化Jersey 1.19的处理,请参见 测试用例: 创建没有使用客户端证书的SSL连接。 这导致:
Schwerwiegend: SSL Client certificate is missing for /hello/hello
但测试用例仍然运行
客户端的处理通过以下方式完成:
如果您对此有任何问题,您可能需要提交一个问题
通过我的公司BITPlan发布了一个开源项目,以简化Jersey 1.19的处理,请参见 测试用例: 创建没有使用客户端证书的SSL连接。 这导致:
Schwerwiegend: SSL Client certificate is missing for /hello/hello
但测试用例仍然运行
客户端的处理通过以下方式完成:
如果您对此有任何问题,您可能需要提交一个问题
通过