当前位置: 首页 > 面试题库 >

Java和HTTPS URL连接,无需下载证书

岳凯康
2023-03-14
问题内容

此代码连接到HTTPS站点,我假设我没有验证证书。但是,为什么我不必在本地为该站点安装证书?我是否应该不必在本地安装证书并为该程序加载证书,还是应将其下载到幕后?客户端到远程站点之间的通信是否仍在传输中加密?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class TestSSL {

    public static void main(String[] args) throws Exception {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        } };
        // Install the all-trusting trust manager
        final SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

        URL url = new URL("https://www.google.com");
        URLConnection con = url.openConnection();
        final Reader reader = new InputStreamReader(con.getInputStream());
        final BufferedReader br = new BufferedReader(reader);        
        String line = "";
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }        
        br.close();
    } // End of main 
} // End of the class //

问题答案:

之所以不必在本地加载证书,是因为您已明确选择不使用该信任所有证书的信任管理器来验证证书。

流量仍将被加密,但是您正在打开与中间人攻击的连接:您正在与某人秘密通信,只是不确定它是您期望的服务器还是潜在的攻击者。

如果您的服务器证书来自一个著名的CA,它是与JRE捆绑在一起的默认CA证书捆绑的一部分(通常是cacerts文件,请参见JSSE参考指南),则可以使用默认信任管理器,而不必设置这里的任何东西。

如果您拥有特定的证书(自签名证书或来自您自己的CA),则可以使用默认的信任管理器,也可以使用通过特定信任库初始化的证书,但必须将证书显式导入到信任存储中(独立后)。验证)



 类似资料:
  • 这段代码连接到一个HTTPS站点,我假设我没有验证证书。但是为什么我不必为站点在本地安装证书呢?我不应该在本地安装一个证书并加载这个程序吗?还是在封面后面下载?客户端到远程站点之间的流量在传输中是否仍然加密?

  • 问题内容: 我想获得一些建议,我已经开始了一个新项目,以创建一个使用多个连接的Java下载加速器。我想知道如何最好地做到这一点。 到目前为止,我已经知道可以使用HttpUrlConnection并使用range属性,但是想知道执行此操作的有效方法。一旦我从多个连接下载了零件,我就必须加入零件,以便最终得到一个完全下载的文件。 提前致谢 :) 问题答案: 获取要下载的文件的 内容长度 。 *根据条件

  • 我想开发一个Kafka连接器,但为了快速测试,我想重新加载插件,而不是重新加载我的docker堆栈中的容器。有办法做到吗? 实际上,我编译了连接器,并将jar文件移动到绑定在容器kafka connect上的文件夹中。移动文件后,我重新加载容器。 先谢谢你。

  • 我试图在测试环境中将Java应用程序连接到993上的IMAP服务器邮件。 我试图忽略证书验证,使用以前对类似问题的回答中的建议,如下所示: 但它似乎不起作用,我仍然有一个例外。 所以我的问题是,实际上是否有可能使用IMAPS协议连接到邮件服务器,而不必检查或验证证书? 如果是的话,选择忽略证书验证不是双方的决定吗?JavaApp和邮件服务器?

  • 本文向大家介绍说下左连接和右连接相关面试题,主要包含被问及说下左连接和右连接时的应答技巧和注意事项,需要的朋友参考一下 比如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配用NULL代替。 右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配用NULL代替

  • 我有一个现有的2个kafka服务器加载了mysql连接器。它起作用了。此外,我需要添加MongoDB连接器。我已经在我的Kafka服务器(Centos7)上安装了confluent schema registry,它可以工作,我停止/启动/重新启动,看起来没有什么问题。我在这里下载并提取了debezium Mongo插件/usr/连接器/插件/debezium连接器mongodb/ 我编辑了 /e