2016-11-05 19 views
2

Я получил строку представляет PEM сертификат:Преобразовать сертификат Строка байтовый массив

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

Я назначил вышеуказанную строку в строку переменной String myCertStr.

Что такое правильный способ преобразования myCertStr в DER закодированный байт []?

(Я использую Java 7, и я не заинтересован в использовании 3-й библиотеку партии для этого, я ищу способ JDK7 делать это.)

+0

Не могли бы вы обновить свой корпус сертификата (Base64) в соответствии с заголовком (то есть с полным сертификатом , а не только открытый ключ RSA), поскольку в противном случае это может быть довольно запутанным для тех, кто наткнется на этот вопрос и решит экспериментировать с ним. – zeppelin

+0

Текст сертификата по-прежнему выглядит сломанным для меня из-за этой колонки «..». – zeppelin

+0

@zeppelin, я обновил его, пожалуйста, посмотрите, спасибо! –

ответ

2

ВАЖНО

Как @ dave_thompson_085 отметил в комментариях, SunJCE CertificateFactory действительно способен разбирать файлы PEM.

Таким образом, вы можете просто использовать, чтобы получить объект сертификата , как подробно на How to load public certificate from pem file..? (который является ранее ответ на @ Dave по той же теме, пожалуйста, upvote его, вместо этого, если вы найдете это полезным!), а затем получить доступ к его кодированной форме (DER).

Однако, если ваш файл PEM является необработанным «RSA PUBLIC KEY» (например, тот, который был прикреплен к этому вопросу) или какой-либо другой объект, реализация SunJCE не может анализировать напрямую, вы все равно можете его разобрать и декодировать , как описано ниже.


Технически вы имеете здесь не сертификат, а просто открытый ключ.

Вы можете декодировать его DER байт, как простые, как:

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

Обратите внимание, что то, что вы получите будет сырец (1 # PKCS) ключ RSA:

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

You может использовать тот же метод для декодирования сертификатов X.509 или закрытых ключей.

E.g. код для декодирования сертификат 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) 
    ) 
); 

UPDATE

Код выше использует Java-8 Base64 декодер. Поскольку вопрос был обновлен с просьбой о решении Java 7, вот ссылка на отличную тему, обсуждающую различные доступные варианты: Base64 Java encode and decode a string.

E.g. java.xml.bind, описанный там, не требует каких-либо дополнительных библиотек на Java 7 (что похоже на то, что хочет OP)

+0

Извините, я скорректировал его на сертификат. –

+0

> Извините, я скорректировал его на сертификат Хм, если у вас есть открытый ключ (что, кажется, так), вы не можете преобразовать его в сертификат, просто изменив заголовок, так как сертификат больше, чем просто общедоступный (он также включает тему, подпись и т. д.) – zeppelin

+0

Нет, я имею в виду, что у меня есть сертификат не открытый ключ, я просто ошибочно скопировал в него другой открытый ключ, но у меня есть сертификат. Пожалуйста, забудьте про открытый ключ. –