Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何连接到https站点而不用担心安全证书_Java_Ssl_Https_Urlconnection - Fatal编程技术网

在java中,如何连接到https站点而不用担心安全证书

在java中,如何连接到https站点而不用担心安全证书,java,ssl,https,urlconnection,Java,Ssl,Https,Urlconnection,当我尝试连接到https网站时,如下所示: StringBuilder sb = new StringBuilder(); URL oracle = new URL("https://company.com"); URLConnection yc = oracle.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStr

当我尝试连接到https网站时,如下所示:

StringBuilder sb = new StringBuilder();
        URL oracle = new URL("https://company.com");
        URLConnection yc = oracle.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            sb.append(inputLine);
        in.close();
        return sb.toString();
我明白了

如果我使用
http://company.com
相反,它可以工作,但我想使用https,因为他们说要使用https,我认为不安全的可能会被删除

然而,当我看到类似的答案时,它谈到了从我的浏览器ectera复制证书。我需要一个解决方案,将为任何人在任何计算机上运行的代码,而不必做任何特殊的工作


我不关心SSL在这个项目中的安全优势,我只想能够连接到wenbsite

看来你已经被警告不要这样做了,所以我会继续回答你的问题。我能够在我的机器上重现这个问题,尽管我不知道为什么:我的浏览器顺利地接受了网站的证书

我曾尝试扩展您的代码以使其正常工作,但很快发现自己正在处理
SSLContext
、各种加密提供程序和服务提供程序接口。我没有完成这种方法,也不建议这样做,因为它会更改JVM的全局安全设置,并且可能会产生不可预测的后果,具体取决于它在做什么

相反,我建议您看看,它允许对连接的安全设置进行更细粒度的控制

以下操作将禁用所创建的
HttpClient
实例的所有证书验证:

TrustStrategy veryNaive = new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return true;
    }
};

SSLContext sslcontext = SSLContexts.custom()
    .loadTrustMaterial(veryNaive)
    .build();

CloseableHttpClient httpclient = HttpClients.custom()
    .setSSLSocketFactory(new SSLConnectionSocketFactory(sslcontext))
    .build();

try {
    HttpGet httpget = new HttpGet("https://company.com");

    try (CloseableHttpResponse response = httpclient.execute(httpget);) {
        HttpEntity entity = response.getEntity();
        System.out.println(EntityUtils.toString(entity));
        EntityUtils.consume(entity);
    }
} finally {
    httpclient.close();
}

SSLContext
更改为
SSLContexts.createSystemDefault()
重新引入了这个问题,只是为了证明Apache库也存在这个问题。

通过“不担心”SSL,你是说你不关心你的程序被中间人攻击愚弄了,尽管这个站点显然关心中间人攻击(如果他们说使用https版本,并且http版本可能在某个时候被删除)。首先,如果网站不提供HTTP,那么你无论如何都会失败。其次,你的请求应该可以工作,因为运行时带有默认值。可能该网站上的证书有问题,无法验证。@t.J.Crowder看,如果他们没有提供https版本,你不会告诉我不要使用该网站,没有任何关键/敏感的问题因此,与其批评我不关心thsi环境中的ssl,我该如何解决问题issue@Alfabravo我不明白你的意思,他们目前确实支持http。我的请求不起作用,尽管其他一切都起作用,但我如何修复它,使其适用于我和任何计算机上的其他用户using@PaulTayl或者:这就是我上面提到的要点:如果网站期望并且——你建议过——可能很快会要求你使用https访问它,他们大概有这样的理由。如果他们没有,他们可以使用http,你就不会有这个问题。如果你问“没有钥匙我怎么能打开这扇锁着的门”,有人说“好吧,也许在没有钥匙的情况下试图通过它不是一个好主意”,你说“但是如果它没有被锁定,你不会告诉我”没有任何意义。无论如何,我让你去做,祝你好运。非常感谢你的解决方案,尽管我使用的是HttpComponents 4.5.3和SSLContexts.custom()。loadTrustMaterial())似乎需要信任库而不是信任策略?@PaulTaylor:检查您使用的是正确的。库似乎包含两个
SSLContexts
类,其中一个已弃用。正确的是
org.apache.http.ssl.SSLContexts
()。谢谢你。我现在唯一的问题是,有时我查找的url不存在,而你的代码不能很好地处理这一问题,因为它返回一些表示未找到的json,而不是什么也不返回/给出一个错误代码,这与我的http(不安全)情况不同。现在修复了,添加了int statusCode response.getStatusLine().getStatusCode();if(statusCode!=HttpURLConnection.HTTP_OK)return“”;极好!是关于为您提供
HttpResponse
类的javadoc,其中包含您需要的内容。()
TrustStrategy veryNaive = new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return true;
    }
};

SSLContext sslcontext = SSLContexts.custom()
    .loadTrustMaterial(veryNaive)
    .build();

CloseableHttpClient httpclient = HttpClients.custom()
    .setSSLSocketFactory(new SSLConnectionSocketFactory(sslcontext))
    .build();

try {
    HttpGet httpget = new HttpGet("https://company.com");

    try (CloseableHttpResponse response = httpclient.execute(httpget);) {
        HttpEntity entity = response.getEntity();
        System.out.println(EntityUtils.toString(entity));
        EntityUtils.consume(entity);
    }
} finally {
    httpclient.close();
}