当前位置: 首页 > 知识库问答 >
问题:

无需下载证书的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 //

共有1个答案

岳谦
2023-03-14

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

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

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

如果您有一个特定的证书(自签名或来自您自己的CA),您可以使用默认的信任管理器,也可以使用一个使用特定信任存储初始化的信任管理器,但是您必须在信任存储中显式地导入证书(在独立验证之后),如本答案所述。你可能也会对这个答案感兴趣。

 类似资料:
  • 问题内容: 此代码连接到HTTPS站点,我假设我没有验证证书。但是,为什么我不必在本地为该站点安装证书?我是否应该不必在本地安装证书并为该程序加载证书,还是应将其下载到幕后?客户端到远程站点之间的通信是否仍在传输中加密? 问题答案: 之所以不必在本地加载证书,是因为您已明确选择不使用该信任所有证书的信任管理器来验证证书。 流量仍将被加密,但是您正在打开与中间人攻击的连接:您正在与某人秘密通信,只是

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

  • 问题内容: 我正在尝试使用安全套接字层(HTTPS)与Java中的PHP脚本建立连接,但是我发现为了确保最大的安全性/有效性,我必须将网站使用的SSL证书导入到我的应用程序中…我不知道该怎么做。 如果有帮助,我的SSL证书不是自签名的,而是由StartSSL提供的,并且我正在使用Eclipse IDE。 有人能指出我正确的方向吗?即,我需要什么文件,应该在哪里导入它们,以及在Java中需要什么代码

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

  • 过去,我一直在通过导出带有密码的PFX证书来制作安全的TcpListener,但我想知道是否可以跳过这一步。 我没有使用商业SSL证书,并且有一个根CA,用于颁发服务器证书。在C#中托管TcpListener时,这些服务器证书需要额外的步骤(我想是因为没有使用CSR)。。。但是如果我有私钥和OpenSSL生成/使用的证书呢。 这很好,但是我必须发出openssl命令,从证书和私钥生成pfx文件,然

  • 我按照 Rails 教程中的说明将此代码添加到我的 中: 我运行我的数据库并出现这个错误: 所以我添加了宝石“响应者”,“〜 我遇到另一个错误,它告诉我 确保在捆绑之前成功。 运行之后,我又遇到了另一个错误