37

Java の Web サイトで SSL 証明書から有効期限を抽出する必要があります。次の ような信頼できる証明書と自己署名証明書の両方をサポートする必要があり ます。 .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 証明書など、証明書チェーンを特定する方法、有効期限を取得する証明書をどのように知ることができましたか?

4

3 に答える 3

36

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

にキャストしてX509Certificate呼び出しますgetNotAfter()

チェーン付きの github 証明書など、証明書チェーンを特定する方法

あなたはそれを手に入れました。Javadocにあるように、それがCertificate[]配列です。

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

Javadocを読んでください。「最初にピア自身の証明書、次に任意の認証局」。

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

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

于 2012-10-19T03:45:58.977 に答える
0

Begin/End 行を PEM 形式に追加していることを確認してください。そうしないと、Java が認識できません。

public class CertTest {

    public static final String cert = "-----BEGIN CERTIFICATE-----\n<CERT_DATA>\n-----END CERTIFICATE-----";

    public static void main(String[] args){
        try {
            X509Certificate myCert = (X509Certificate)CertificateFactory
                     .getInstance("X509")
                     .generateCertificate(
                                       // string encoded with default charset
                    new ByteArrayInputStream(cert.getBytes())
                     );
            System.out.println(myCert.getNotAfter());

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
于 2015-12-18T01:14:19.140 に答える