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

我如何检索不受信任的SSL服务器证书以进行审核和信任?

莘睿
2023-03-14
问题内容

我的问题:

我想连接到可能使用Java默认情况下不信任的证书的服务器(不限于HTTPS协议-可以是LDAP-over-
SSL,可以是SMTPS,可以是IMAPS等)。自签名)。

所需的工作流程是尝试连接,检索证书信息,将其提供给用户,如果他接受了,则将其添加到信任库中,以便将来继续受信任。

我被困于获取证书。我有从这里以及关于Java
SSL问题的答案所指向的站点编写的代码(请参阅文章末尾)。该代码仅创建一个SSLSocket,开始SSL握手,然后向SSL会话询问Certificate[]。当我使用已经可以信任的证书连接到服务器时,代码可以正常工作。但是,当我使用自签名证书连接到服务器时,会得到通常的结果:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: 
   sun.security.validator.ValidatorException: PKIX path building failed:
   sun.security.provider.certpath.SunCertPathBuilderException: unable to 
   find valid certification path to requested target
        at sun.security.ssl.Alerts.getSSLException(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
        at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
        at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
        at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
        [etc]

如果我与一起运行,-Djavax.net.debug=all我会看到JVM确实检索了自签名证书,但在返回证书之前将破坏使用不可信证书的连接。

好像是鸡和鸡蛋的问题。它不会让我看到证书,因为它们不受信任。但是我需要查看证书才能将其添加到信任库中,以便它们将被信任。你如何打破这个?

例如,如果我以以下方式运行程序:

java SSLTest www.google.com 443

我得到了Google正在使用的证书的打印输出。但是如果我以

java SSLTest my.imap.server 993

我得到上面引用的异常。

代码:

import java.io.InputStream;
import java.io.OutputStream;
import java.security.cert.*;
import javax.net.SocketFactory;
import javax.net.ssl.*;

public class SSLTest
{
    public static void main(String[] args) throws Exception {
        if (args.length != 2) {
            System.err.println("Usage: SSLTest host port");
            return;
        }

        String host = args[0];
        int port = Integer.parseInt(args[1]);

        SocketFactory factory = SSLSocketFactory.getDefault();
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);

        socket.startHandshake();

        Certificate[] certs = socket.getSession().getPeerCertificates();

        System.out.println("Certs retrieved: " + certs.length);
        for (Certificate cert : certs) {
            System.out.println("Certificate is: " + cert);
            if(cert instanceof X509Certificate) {
                try {
                    ( (X509Certificate) cert).checkValidity();
                    System.out.println("Certificate is active for current date");
                } catch(CertificateExpiredException cee) {
                    System.out.println("Certificate is expired");
                }
            }
        }
    }
}

问题答案:

请参阅Andreas
Sterbenz的InstallCert实用程序的副本



 类似资料:
  • 我刚刚在Google Cloud上的VM上设置了我的Neo4j服务器,我使用的是企业版4.1.1,并且我已经完成了David Allen关于如何使用LetsEncrypt获得证书的精彩帖子(在这里)。 这一切都工作得很好,我现在有了一个完全安全的Neo4j服务器,我可以通过浏览器()使用我的主机名访问它。但是,我现在在让我的应用程序使用javascript驱动程序连接到服务器时遇到了问题。 我不断

  • 局域网IP地址怎么生成受信任的SSL证书?比如启明星辰的设备ip地址证书就是受信任的。

  • 似乎HttpClient/HttpClientHandler没有提供忽略不信任证书的选项,比如WebRequest使您能够忽略不信任证书(尽管使用)。 任何帮助都将不胜感激!

  • 问题内容: 我一直在研究从动态Web应用程序中提取信息的程序,该程序运行良好,直到我将tomcat服务器设置为使用具有自签名(因此,不受信任)证书的SSL。错误的堆栈跟踪为: 在Web浏览器中,当用户使用不受信任的证书访问HTTPS站点时,系统会提示用户警告,并要求他设置是否愿意继续进行操作;我想为我的命令行应用程序实现类似的功能…我承认我是套接字编程和网络领域的新手。解决这个问题的任何建议都会很

  • 问题内容: 我正在使用JavaFX开发一个简单的嵌入式浏览器: 当我用来加载任何http网站时,它可以正常工作: 尽管如此,如果我尝试使用不受信任的证书(我自己的ssl证书)加载网站,则无法正常工作,并且在浏览器中出现白屏。 有什么方法可以(自动)信任我的ssl证书? 问题答案: 最后,我解决了我的问题。您应该在加载网站之前添加以下代码: 注意: 此代码片段只是禁用证书验证,而不是信任它。

  • 我正在创建一个简单的网站。前端存储在S3中,由CloudFront托管。我使用AWS证书管理器向前端域(www.xyz.com)添加了一个受信任的SSL证书。 后端运行在EC2实例上。我向它添加了一个自签名证书。我可以使用Postman访问API,但由于自签名证书,来自前端的请求失败了。 我再次检查了AWS证书管理器是否可以为我的后端服务器提供证书,但它需要一个域。我的服务器运行在IP和端口上,我