- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我需要从Java网站上的SSL证书中提取到期日期,应该同时支持受信任和自签名证书,例如:1.信任 https://github.com2.自签 https://mms.nw.ru/
我已经复制了一些代码:
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class SSLTest {
public static void main(String [] args) throws Exception {
// configure the SSLContext with a TrustManager
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
SSLContext.setDefault(ctx);
URL url = new URL("https://github.com");//https://mms.nw.ru
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
System.out.println(conn.getResponseCode());
Certificate[] certs = conn.getServerCertificates();
for (Certificate cert :certs){
System.out.println(cert.getType());
System.out.println(cert);
}
conn.disconnect();
}
private static class DefaultTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}
问题是:
如何从证书中解析过期日期,在我的代码中 toString() 确实输出了日期,但是很难解析。
如何确定证书链,例如链3的github证书,我怎么知道从哪个证书获取过期日期?
最佳答案
How to parse the expiration date from the certificate
将其转换为 X509Certificate
并调用 getNotAfter()
。
How to determine the certificate chain, eg, the github certificate with chains
你明白了。这就是 Certificate[]
数组,正如它在 Javadoc 中所说的那样。 .
How did i know which certificate to get the expiration date from?
阅读 Javadoc . “对等方自己的证书首先是任何证书颁发机构”。
但是我不知道你为什么要这样做。 Java 应该已经为您完成了这一切。
请丢弃不安全且不正确的 TrustManager 实现。处理自签名证书的正确方法是将它们导入客户端信任库。还请扔掉不安全的 HostnameVerifier,并使用默认的或安全的。如果您不希望 HTTPS 安全,为什么还要使用它?
关于java - 如何在 Java 中以编程方式检查 SSL 证书到期日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12967016/
我是一名优秀的程序员,十分优秀!