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

如何获取服务器证书链,然后验证它在Java中是有效且受信任的

严曜文
2023-03-14
问题内容

我需要与远程服务器创建Https连接,然后检索并验证证书。

我已经建立好连接:

try {  
    url = new URL(this.SERVER_URL);  
    HttpURLConnection con = (HttpURLConnection) url.openConnection();   
    HttpsURLConnection secured = (HttpsURLConnection) con;  
    secured.connect(); 
}

但似乎getServerCertificateChain()方法未由类型定义HttpsURLConnection

那么,如何检索服务器证书链?我的理解是getServerCertificateChain()应该返回一个X509Certificate对象数组,并且该类具有可用于询问证书的方法。

我需要验证:

  1. 证书有效且受信任,
  2. 根据证书序列号检查“证书吊销列表分发点”
  3. 确保它没有过期,
  4. 检查证书中的URL是否与另一个URL(我已经检索到)匹配。

我迷路了,非常感谢您的帮助!


问题答案:

您想要的方法是getServerCertificates,而不是getServerCertificateChain。有一些很好的示例代码在这里。

编辑

添加了一些我自己的示例代码。为您的好起点。不要忘记查看HttpsURLConnection和X509Certificate的Javadocs

import java.net.URL;
import java.security.cert.Certificate;
import java.security.cert.CertificateExpiredException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;

public class TestSecuredConnection {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestSecuredConnection tester = new TestSecuredConnection();
        try {
            tester.testConnectionTo("https://www.google.com");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public TestSecuredConnection() {
        super();
    }

    public void testConnectionTo(String aURL) throws Exception {
        URL destinationURL = new URL(aURL);
        HttpsURLConnection conn = (HttpsURLConnection) destinationURL
                .openConnection();
        conn.connect();
        Certificate[] certs = conn.getServerCertificates();
        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");
                }
            }
        }
    }
}


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

  • 问题内容: 我希望能够以编程方式在Java应用程序中访问所有受信任的根证书。 我当时在看密钥库接口,但我希望获得JRE隐式的受信任根列表。 这可以在任何地方访问吗? 问题答案: 有一个示例显示了如何获取一组根证书,并通过它们进行遍历,这称为在密钥存储区中列出最受信任的证书颁发机构(CA)。这是经过稍微修改的版本,可打印出每个证书(在Windows Vista上测试)。

  • 主要内容:Maven依赖关系,HTTP获取服务器证书示例以下教程演示了如何使用Apache HttpClient 4.5从资源服务器获取证书。 证书用于通过使用SSL / TLS的HTTPS保护客户端和服务器之间的连接。 当您需要有关证书的详细信息时,例如:证书何时到期?谁颁发证书?等等。或者在某些情况下需要读取服务器证书。 在下面的例子中,我们将详细解释如何实现。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache 版本。 将以

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

  • 问题内容: 我正在尝试编写一个使用javax.mail API发送邮件的SSL客户端。我遇到的问题是服务器请求我使用SSL,但是服务器还配置了非标准SSL证书。我发现的网页说我需要将证书安装到信任库中。我不想这样做(我没有必要的权限。) 有没有办法让Java忽略证书错误并接受它? 失败了,有没有办法让信任库在我的程序中是本地的,而不是在整个JVM中都安装? 问题答案: 您需要创建一个伪造的Trus

  • 这不是此帖子的副本。我试过那里的解决方案,但在我的情况下没有任何效果。 我使用的是Windows和Python 3.6.5。我有一个用于TLS客户端的python脚本。我需要连接到的服务器使用自签名证书。当我尝试使用我的脚本连接到它时,我得到以下错误: