2016-11-05 9 views
2

I eine Zeichenkette repräsentiert erhielt PEM Zertifikat:Convert Zertifikat Zeichenfolge Bytedatenfeld

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

I die oben Saite zu Saite variable String myCertStr zugeordnet.

Was ist der richtige Weg, um myCertStr in DER-codiertes Byte [] zu konvertieren?

(Ich bin mit Java 7, und ich bin nicht daran interessiert, 3rd-Party-Bibliothek für diesen Einsatz, ich suche für eine JDK7 Art und Weise, es zu tun.)

+0

Würde es Ihnen etwas ausmachen, Ihren Zertifikatskörper (Base64) so ​​zu aktualisieren, dass er der Kopfzeile entspricht (dh einem vollständigen Zertifikat) , nicht nur ein öffentlicher RSA-Schlüssel), da es für diejenigen, die über diese Frage stolpern und sich dazu entschließen, damit zu experimentieren, eher verwirrend sein kann. – zeppelin

+0

Der Zertifikatstext sieht aufgrund der Spalte ".." immer noch kaputt aus. – zeppelin

+0

@zeppelin, ich habe es aktualisiert, bitte sehen Sie, danke! –

Antwort

2

WICHTIG

Als @ dave_thompson_085 hat in den Kommentaren darauf hingewiesen, SunJCE CertificateFactory ist in der Tat in der Lage, PEM-Dateien zu analysieren.

So kann man nur, dass verwendet bei How to load public certificate from pem file..? das Zertifikat Objekt so detailliert zu bekommen (was eine frühere Antwort von @ Dave zum gleichen Thema, so wenden Sie sich bitte upvote es, statt dieser, wenn Sie diesen Kommentar hilfreich!) und dann auf seine codierte (DER) -Form zugreifen.

Wenn Ihre PEM-Datei jedoch ein roher "RSA PUBLIC KEY" ist (wie der dieser Frage angefügte) oder eine andere Entität, die die SunJCE-Implementierung nicht direkt analysieren kann, können Sie sie dennoch manuell analysieren und dekodieren , wie unten detailliert.


Technisch, was Sie hier haben, ist kein Zertifikat, sondern nur ein öffentlicher Schlüssel.

Sie können es dekodieren Bytes so einfach wie das DER:

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

Beachten Sie, dass das, was Sie ein rohes RSA (PKCS # 1) Schlüssel erhalten wird:

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

Sie kann die gleiche Technik verwenden, um X.509-Zertifikate oder private Schlüssel zu dekodieren.

z.

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

Der obige Code verwendet Java 8 Base64 Decoder: der Code das X.509-Zertifikat zu entschlüsseln. Als Frage wurde aktualisiert für eine Java 7-Lösung, Hier ist ein Link zu einem ausgezeichneten Thread, diskutieren verschiedene Optionen zur Verfügung: Base64 Java encode and decode a string.

z. Die dort beschriebene java.xml.bind-Methode erfordert keine zusätzlichen Bibliotheken auf Java 7 (was mit OPs übereinstimmt)

+0

Entschuldigung, ich habe es zum Zertifikat korrigiert. –

+0

> Entschuldigung, ich korrigierte es zu Zertifikat Hmm, wenn Sie einen öffentlichen Schlüssel haben (was der Fall zu sein scheint), können Sie ihn nicht in Zertifikat konvertieren, indem Sie einfach die Kopfzeile ändern, da Zertifikat mehr als nur eine öffentliche ist Schlüssel (es enthält auch das Thema, Unterschrift etc.) – zeppelin

+0

Nein, ich meine, ich habe ein Zertifikat nicht öffentlichen Schlüssel, ich kopiere nur versehentlich einen anderen öffentlichen Schlüssel eingefügt, um meine Frage, aber ich habe ein Zertifikat. Bitte vergessen Sie den öffentlichen Schlüssel. –

Verwandte Themen