2012-03-16 14 views
18

¿Cómo se crea una instancia de java.security.cert.X509Certificate a partir de una cadena con formato PEM? La cadena con formato PEM es un valor de encabezado de solicitud HTTP "SSL_CLIENT_CERT".Convierta una cadena con formato PEM a java.security.cert.X509Certificate

RESPUESTA: Sobre la base de la respuesta de mgaert, esto es lo que he escrito en Scala:

val cert = factory.generateCertificate(
    new ByteArrayInputStream(
     Base64.decodeBase64(
     cert.stripPrefix("-----BEGIN CERTIFICATE-----").stripSuffix("-----END CERTIFICATE-----") 
    ) 
    ).asInstanceOf[X509Certificate] 
+4

No es necesario decodificarlo. El formato codificado PEM base64 es soportado directamente, como en [esta respuesta] (http://stackoverflow.com/a/9739366/822870). De nuevo: CertificateFactory cFactory = CertificateFactory.getInstance ("X.509"); X509Certificate cert = (X509Certificate) cFactory.generateCertificate (getInputStream (of_the_original_unmodified_certificate_file)); –

+1

parece que no hay necesidad de quitar el prefijo/sufijo también – lznt

Respuesta

27

decodificar la base 64 a binario, con un poco de InputStream leerlo, a continuación, tratar

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
Certificate cert = cf.generateCertificate(is); 
12

Tengo un problema similar, estoy pegando también aquí el código de Java que funcionó para mí en caso de que alguien lo negara:

import java.util.Base64; 

public static X509Certificate parseCertificate(String _headerName, HttpServletRequest _request) throws CertificateException { 
    String certStr = _request.getHeader("x-clientcert"); 
    //before decoding we need to get rod off the prefix and suffix 
    byte [] decoded = Base64.getDecoder().decode(certStr.replaceAll(X509Factory.BEGIN_CERT, "").replaceAll(X509Factory.END_CERT, "")); 

    return (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded)); 
} 
6

Los pasos en la conversión de Cadena con formato PEM son opuestos a cómo (x509 -> Cadena) tuvo lugar.

Muestra PEM con formato de cadena:

-----BEGIN CERTIFICATE----- 
MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD..AkGA1UEBhMCR0Ix 
EzARBgNVBAgTClNvbWUtU3RhdGUxFDASBgNVBAoTC0..0EgTHRkMTcwNQYD 
VQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcn..XRpb24gQXV0aG9y 
aXR5MRQwEgYDVQQDEwtCZXN0IENBIEx0ZDAeFw0wMD..TUwMTZaFw0wMTAy 
MDQxOTUwMTZaMIGHMQswCQYDVQQGEwJHQjETMBEGA1..29tZS1TdGF0ZTEU 
MBIGA1UEChMLQmVzdCBDQSBMdGQxNzA1BgNVBAsTLk..DEgUHVibGljIFBy 
aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFD..AMTC0Jlc3QgQ0Eg 
THRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg..Tz2mr7SZiAMfQyu 
vBjM9OiJjRazXBZ1BjP5CE/Wm/Rr500PRK+Lh9x5eJ../ANBE0sTK0ZsDGM 
ak2m1g7oruI3dY3VHqIxFTz0Ta1d+NAjwnLe4nOb7/..k05ShhBrJGBKKxb 
8n104o/5p8HAsZPdzbFMIyNjJzBM2o5y5A13wiLitE..fyYkQzaxCw0Awzl 
kVHiIyCuaF4wj571pSzkv6sv+4IDMbT/XpCo8L6wTa..sh+etLD6FtTjYbb 
rvZ8RQM1tlKdoMHg2qxraAV++HNBYmNWs0duEdjUbJ..XI9TtnS4o1Ckj7P 
OfljiQIDAQABo4HnMIHkMB0GA1UdDgQWBBQ8urMCRL..5AkIp9NJHJw5TCB 
tAYDVR0jBIGsMIGpgBQ8urMCRLYYMHUKU5AkIp9NJH..aSBijCBhzELMAkG 
A1UEBhMCR0IxEzARBgNVBAgTClNvbWUtU3RhdGUxFD..AoTC0Jlc3QgQ0Eg 
THRkMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcm..ENlcnRpZmljYXRp 
b24gQXV0aG9yaXR5MRQwEgYDVQQDEwtCZXN0IENBIE..DAMBgNVHRMEBTAD 
AQH/MA0GCSqGSIb3DQEBBAUAA4IBAQC1uYBcsSncwA..DCsQer772C2ucpX 
xQUE/C0pWWm6gDkwd5D0DSMDJRqV/weoZ4wC6B73f5..bLhGYHaXJeSD6Kr 
XcoOwLdSaGmJYslLKZB3ZIDEp0wYTGhgteb6JFiTtn..sf2xdrYfPCiIB7g 
BMAV7Gzdc4VspS6ljrAhbiiawdBiQlQmsBeFz9JkF4..b3l8BoGN+qMa56Y 
It8una2gY4l2O//on88r5IWJlm1L0oA8e4fR2yrBHX..adsGeFKkyNrwGi/ 
7vQMfXdGsRrXNGRGnX+vWDZ3/zWI0joDtCkNnqEpVn..HoX 
-----END CERTIFICATE----- 

Estos son los pasos:

1. Remove headers from PEM formatted String 
Headers are : ---- BEGIN CERTIFICATE ----- and ----- END CERTIFICATE ------ 
2. Decode the rest of the part using Base64 to byte array 
3. Then you can use CertificateFactory to convert byte stream to x509Certificate object 

Código de ejemplo para hacer más arriba (con el escritor PEM):

/** 
    * Converts a PEM formatted String to a {@link X509Certificate} instance. 
    * 
    * @param pem PEM formatted String 
    * @return a X509Certificate instance 
    * @throws CertificateException 
    * @throws IOException 
    */ 
    public X509Certificate convertToX509Certificate(String pem) throws CertificateException, IOException { 
     X509Certificate cert = null; 
     StringReader reader = new StringReader(pem); 
     PEMReader pr = new PEMReader(reader); 
     cert = (X509Certificate)pr.readObject(); 
     return cert; 
    } 
+1

Tenga en cuenta que PEMReader es parte de Bouncy Castle Crypto APIs, consulte https://www.bouncycastle.org/. El código de @mgaert funciona sin una biblioteca externa. –

1

Otra muestra,

public static X509Certificate convertToX509Cert(String certificateString) throws CertificateException { 
    X509Certificate certificate = null; 
    CertificateFactory cf = null; 
    try { 
     if (certificateString != null && !certificateString.trim().isEmpty()) { 
      certificateString = certificateString.replace("-----BEGIN CERTIFICATE-----\n", "") 
        .replace("-----END CERTIFICATE-----", ""); // NEED FOR PEM FORMAT CERT STRING 
      byte[] certificateData = Base64.getDecoder().decode(certificateString); 
      cf = CertificateFactory.getInstance("X509"); 
      certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certificateData)); 
     } 
    } catch (CertificateException e) { 
     throw new CertificateException(e); 
    } 
    return certificate; 
} 
Cuestiones relacionadas