web-dev-qa-db-ja.com

JavaでプログラムでSSL証明書の有効期限を確認する方法

JavaのWebサイトのSSL証明書から有効期限を抽出する必要があります。信頼できる証明書と自己署名証明書の両方をサポートする必要があります。1.trusted https://github.com 2.self-signed 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;
        }
    }
}

質問は次のとおりです。

  1. 証明書から有効期限を解析する方法、私のコードではtoString()は日付を出力しましたが、解析するのは難しいです。

  2. 証明書チェーン(チェーン3のgithub証明書など)の決定方法有効期限を取得する証明書はどのようにしてわかりましたか?

28
Simon Wang

証明書から有効期限を解析する方法

それを_X509Certificate_にキャストし、getNotAfter()を呼び出します。

証明書チェーンを決定する方法(チェーンを使用したgithub証明書など)

あなたはそれを持っています。 Javadoc にあるように、これが_Certificate[]_配列です。

有効期限を取得する証明書をどのようにして知りましたか?

Javadoc を読んでください。 「最初にピア自身の証明書、次に認証局が続きます」。

しかし、なぜあなたはこれをしているのか分かりません。 Javaは既にすべてを行っているはずです。

そして、その安全ではない不正なTrustManagerの実装を捨ててください。自己署名証明書を処理する正しい方法は、それらをクライアントのトラストストアにインポートすることです。また、安全でないHostnameVerifierを捨てて、デフォルトまたは安全なものを使用してください。安全にしたくないのに、なぜHTTPSを使用するのですか?

24
user207421

Kotlinの方法では、次のようになります。

    fun certInformation(aURL: String) {
    val destinationURL = URL(aURL)
    val conn = destinationURL.openConnection() as HttpsURLConnection
    conn.connect()
    val certs = conn.serverCertificates
    for (cert in certs) {
        println("Certificate is: $cert")
        if (cert is X509Certificate) {
            println(cert.issuerDN.name)
            println(cert.notAfter)
            println(cert.notBefore)
        }
    }
}
0
Munish Chandel