具有自签名证书的Jersey

具有自签名证书的Jersey,jersey,Jersey,我目前在一个开发环境中工作,我们使用自签名证书。我已经尝试了一天多一点的时间让jersey忽略自签名证书。这纯粹是为了一个POC环境,我做梦也没想到会做这样的制作。虽然我在互联网上找到了许多关于如何使这项工作成功的答案,但仍有一些问题没有解决 以下是我当前的测试课程: public class JerseyTestClient { private static final Logger LOG = Logger.getLogger(JerseyTestClient.class.getName(

我目前在一个开发环境中工作,我们使用自签名证书。我已经尝试了一天多一点的时间让jersey忽略自签名证书。这纯粹是为了一个POC环境,我做梦也没想到会做这样的制作。虽然我在互联网上找到了许多关于如何使这项工作成功的答案,但仍有一些问题没有解决

以下是我当前的测试课程:

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
但测试用例仍然运行 客户端的处理通过以下方式完成:

如果您对此有任何问题,您可能需要提交一个问题 通过