4

PEM 証明書を表す文字列を取得しました。

-----BEGIN CERTIFICATE-----
MIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL
MAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC
VU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx
NDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD
TjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu
ZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j
V14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj
gbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA
FFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE
CBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS
BgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE
BQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju
Wm7DCfrPNGVwFWUQOmsPue9rZBgO
-----END CERTIFICATE-----

上記の文字列を String variable に代入しString myCertStrました。

myCertStrDER でエンコードされた byte[]に変換する適切な方法は何ですか?

(私はJava 7を使用していますが、これにサードパーティのライブラリを使用することに興味はありません.JDK7の方法を探しています.)

4

1 に答える 1

4

重要

@dave_thompson_085 がコメントで指摘したように、SunJCE CertificateFactory は実際に PEM ファイルを解析できます。

したがって、それを使用して、pem ファイルからパブリック証明書をロードする方法で説明されているように、Certificate オブジェクトを取得できます..? (これは同じトピックに関する@daveによる以前の回答です。これが役立つと思われる場合は、これではなく賛成票を投じてください!)、そのエンコードされた(DER)フォームにアクセスしてください。

ただし、PEM ファイルが生の「RSA PUBLIC KEY」(この質問に添付されているものなど) である場合、または SunJCE 実装が直接解析できないその他のエンティティである場合でも、以下に詳述するように、手動で解析およびデコードできます。 .


技術的には、ここにあるのは証明書ではなく、単なる公開鍵です。

次のように単純に DER バイトにデコードできます。

byte[] derBytes = Base64.getDecoder().decode(
    pemText.replaceAll("-----(BEGIN|END) RSA PUBLIC KEY-----", "").replaceAll("\n", "")
);

取得するものは生の RSA (PKCS#1) キーになることに注意してください。

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

同じ手法を使用して、X.509 証明書または秘密鍵をデコードできます。

たとえば、X.509 証明書をデコードするコードは次のとおりです。

byte[] certificateBytes = Base64.getDecoder().decode(
    pemText.replaceAll("-----(BEGIN|END) CERTIFICATE-----", "").replaceAll("\n", "").getBytes("UTF-8")
);

CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate)(certificateFactory.generateCertificate(
        new ByteArrayInputStream(certificateBytes)
    )
);

アップデート

上記のコードは、Java 8 Base64 デコーダーを使用しています。Java 7 ソリューションを求める質問が更新されたため、利用可能なさまざまなオプションについて説明している優れたスレッドへのリンクを次に示します

たとえば、そこに記載されている java.xml.bind メソッドは、Java 7 に追加のライブラリを必要としません (OP が必要とするものと一致するようです)。

于 2016-11-05T21:10:42.557 に答える