Estoy intentando cargar el archivo de certificado en el certificado de objeto, pero me estoy haciendo la siguiente excepción.

    java.security.cert.CertificateParsingException: invalid DER-encoded certificate data
    at sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1701)
    at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:303)
    at sun.security.provider.X509Factory.parseX509orPKCS7Cert(X509Factory.java:532)
    at sun.security.provider.X509Factory.engineGenerateCertificates(X509Factory.java:417)
    at java.security.cert.CertificateFactory.generateCertificates(CertificateFactory.java:427)

A continuación es el código que estoy usando para leer el archivo de certificado,

    final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
    final Collection<? extends Certificate> certs =
         (Collection<? extends Certificate>) certFactory.generateCertificates(new ByteArrayInputStream(FileUtils.readFileToByteArray(serverCertFile)));

Siguiente es el contenido del archivo de certificado,

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
c1:cb:80:07:27:ce:4b:62
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=qw, ST=ewe, L=rew, O=rwerwe, OU=rwer, CN=rew/emailAddress=rewrew
Validity
Not Before: Jan 28 06:17:34 2013 GMT
Not After : Feb 27 06:17:34 2013 GMT
Subject: C=qw, ST=ewe, L=rew, O=rwerwe, OU=rwer, CN=rew/emailAddress=rewrew
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:b6:d5:fd:01:2b:6d:ab:e2:da:a9:b4:a9:67:48:
ce:72:d9:15:de:66:22:8e:68:a8:7b:7e:55:06:97:
56:d2:bd:6a:2e:04:89:df:6a:36:9e:3d:ba:fc:32:
b2:8b:f0:69:5d:54:54:b6:3e:b5:55:38:89:1f:1c:
d0:4b:21:de:76:b3:be:fc:41:b5:62:b8:b8:3b:dc:
ad:6d:e1:fc:1c:56:6d:90:1a:b3:6c:57:7e:66:a0:
07:b9:16:99:cc:d4:c9:ee:05:7c:9d:1c:fb:6b:8f:
a3:4b:d6:1c:a9:aa:51:e1:41:0d:10:a9:fe:b6:1b:
f0:33:0c:ea:52:b9:9b:8e:5d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier: 
FF:24:75:B1:32:C2:74:6D:B4:CB:22:A9:92:CF:F4:B6:4A:5F:0B:56
X509v3 Authority Key Identifier: 
keyid:FF:24:75:B1:32:C2:74:6D:B4:CB:22:A9:92:CF:F4:B6:4A:5F:0B:56
DirName:/C=qw/ST=ewe/L=rew/O=rwerwe/OU=rwer/CN=rew/emailAddress=rewrew
serial:C1:CB:80:07:27:CE:4B:62
X509v3 Basic Constraints: 
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
46:14:65:27:c2:cd:55:ba:b4:0f:92:ac:8c:e4:bd:e5:e5:8d:
e3:3b:59:52:9b:40:6a:dc:e3:cf:2c:03:49:e4:56:33:88:f6:
94:10:de:64:00:2e:c6:2a:13:98:d0:16:71:25:8a:ea:04:3f:
14:af:bf:8d:e1:7f:aa:54:78:68:32:86:67:9d:1d:42:fc:cb:
1d:f2:7c:0b:1d:24:2f:e5:3f:bd:01:bd:d7:2d:74:4a:e9:7b:
2f:25:97:64:7e:10:ba:bf:dd:49:6d:8a:91:e4:50:d8:a3:04:
cc:37:8c:45:bd:13:b7:88:72:ef:24:20:b1:aa:05:6c:37:36:
05:c6
-----BEGIN CERTIFICATE-----
MIIDLjCCApegAwIBAgIJAMHLgAcnzktiMA0GCSqGSIb3DQEBBQUAMG4xCzAJBgNV
BAYTAnF3MQwwCgYDVQQIEwNld2UxDDAKBgNVBAcTA3JldzEPMA0GA1UEChMGcndl
cndlMQ0wCwYDVQQLEwRyd2VyMQwwCgYDVQQDEwNyZXcxFTATBgkqhkiG9w0BCQEW
BnJld3JldzAeFw0xMzAxMjgwNjE3MzRaFw0xMzAyMjcwNjE3MzRaMG4xCzAJBgNV
BAYTAnF3MQwwCgYDVQQIEwNld2UxDDAKBgNVBAcTA3JldzEPMA0GA1UEChMGcndl
cndlMQ0wCwYDVQQLEwRyd2VyMQwwCgYDVQQDEwNyZXcxFTATBgkqhkiG9w0BCQEW
BnJld3JldzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAttX9ASttq+LaqbSp
Z0jOctkV3mYijmioe35VBpdW0r1qLgSJ32o2nj26/DKyi/BpXVRUtj61VTiJHxzQ
SyHedrO+/EG1Yri4O9ytbeH8HFZtkBqzbFd+ZqAHuRaZzNTJ7gV8nRz7a4+jS9Yc
qapR4UENEKn+thvwMwzqUrmbjl0CAwEAAaOB0zCB0DAdBgNVHQ4EFgQU/yR1sTLC
dG20yyKpks/0tkpfC1YwgaAGA1UdIwSBmDCBlYAU/yR1sTLCdG20yyKpks/0tkpf
C1ahcqRwMG4xCzAJBgNVBAYTAnF3MQwwCgYDVQQIEwNld2UxDDAKBgNVBAcTA3Jl
dzEPMA0GA1UEChMGcndlcndlMQ0wCwYDVQQLEwRyd2VyMQwwCgYDVQQDEwNyZXcx
FTATBgkqhkiG9w0BCQEWBnJld3Jld4IJAMHLgAcnzktiMAwGA1UdEwQFMAMBAf8w
DQYJKoZIhvcNAQEFBQADgYEARhRlJ8LNVbq0D5KsjOS95eWN4ztZUptAatzjzywD
SeRWM4j2lBDeZAAuxioTmNAWcSWK6gQ/FK+/jeF/qlR4aDKGZ50dQvzLHfJ8Cx0k
L+U/vQG91y10Sul7LyWXZH4Qur/dSW2KkeRQ2KMEzDeMRb0Tt4hy7yQgsaoFbDc2
BcY=
-----END CERTIFICATE-----

Si puedo usar el mismo código con la eliminación de los contenidos en el archivo de certificado desde la parte superior hasta COMENZAR CERTIFICADO, su trabajo bien. Pero mi requisito es el archivo de certificado tendrá los contenidos. Tienes cualquier persona que enfrenta este error ? Cualquier ayuda será muy apreciada.

InformationsquelleAutor Lolly | 2013-01-28

2 Comentarios

  1. 2

    El problema es que la CertificateFactory sólo lee un certificado en formato PEM si se inicia con -----BEGIN CERTIFICATE----- en seguida. Algunas de las herramientas de añadir información adicional (aquí, el resultado de openssl x509 -text) en primer lugar, pero el certificado de la fábrica no ignorarlo y tratar como un mal formados certificado.

    En su lugar, utilice un BuffedReader y readLine() para leer el archivo, haciendo caso omiso de la línea hasta llegar a -----BEGIN CERTIFICATE-----. A continuación, agregue todas las líneas hasta -----END CERTIFICATE----- a una variable de cadena temporal (o similar, por ejemplo,StringBuilder). Pasar esto a la CertificateFactory.

    • Tenga en cuenta que a partir de Java 7 comentario encabezados son manejadas correctamente por CertificateFactory. No es compatible con sangría certificado de bloques, aunque.
  2. 1

    A mí me parece que su archivo de certificado no puede estar en el formato correcto.

    La documentación para CertificateFactory.generateCertificates dice,

    En el caso de un certificado de fábrica para X. 509 certificados, el
    certificado previsto en inStream debe ser codificado en DER y puede ser
    suministrado en binario o imprimible (Base64) de la codificación. Si el certificado
    se proporciona en Base64, que debe estar acotada al principio por
    —–BEGIN CERTIFICATE—–, y debe estar acotada al final por —–END CERTIFICATE—–.

    No creo que el problema es tan simple como agregar los marcadores de límite para el certificado existente.

    Sólo la he utilizado formato PEM, que es base64 DER, así que no sé para asegurarse de que el suyo es un formato incorrecto, pero supongo que un DER binario codificado certificado no es legible por humanos del texto.

    Así, te sugiero que regreses a el certificado de origen, y asegúrese de que usted obtenga una copia con el formato correcto. Si usted tiene un formato diferente de la original cert, se puede convertir a formato pem con openssl.

    • Si usted mira el ejemplo en la pregunta, los marcadores de límite están allí (al final si se desplaza hacia abajo). El CertificateFactory es simplemente la asfixia por lo que antes de que los marcadores.
    • sí, tienes razón – yo no desplazarse hacia abajo.
    • Sí, tienes razón – yo no desplazarse hacia abajo. Así, traté de descifrar el cert con openssl – a menos que sea un corta y pega de error, el problema es que los marcadores no comenzar en la primera columna – retire los cuatro espacios al principio de los marcadores de begin y end, y se decodifica bien.

Dejar respuesta

Please enter your comment!
Please enter your name here