如何获取服务器证书链,然后验证它在Java中是有效且受信任的
我需要与远程服务器创建Https连接,然后检索并验证证书。
我已经建立好连接:
try { url = new URL(this.SERVER_URL);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
HttpsURLConnection secured = (HttpsURLConnection) con;
secured.connect();
}
但似乎getServerCertificateChain()
方法未由类型定义HttpsURLConnection
。
那么,如何检索服务器证书链?我的理解是getServerCertificateChain()
应该返回一个X509Certificate
对象数组,并且该类具有可用于询问证书的方法。
我需要验证:
- 证书有效且受信任,
- 根据证书序列号检查“证书吊销列表分发点”
- 确保它没有过期,
- 检查证书中的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");
}
}
}
}
}
以上是 如何获取服务器证书链,然后验证它在Java中是有效且受信任的 的全部内容, 来源链接: utcz.com/qa/416784.html