2011-11-18 11 views
6

Creé un certificado de servidor SSL en CAcert. Cuando trato de obtener una página de este servidor desde un programa Java (abajo), consigo¿Por qué java choke en cert realizado en cacert.org: "el bit keyCertSign no está configurado"?

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: CA key usage check failed: keyCertSign bit is not set 

Alguien sabe qué podría estar causando esto?

  • He intentado crear certs firmados por sus certificados de raíz clase 1 y clase 3, mismo resultado.
  • El error no no ocurre cuando intento a buscar páginas de otros dos sitios que utilizan CAcert.org CERT: https://www.cacert.org y https://pause.perl.org (que me lleva a creer que la clase raíz & 3 certs de cacert.org están correctamente instalados en mi sistema).
  • Puedo ver los certs de cacert.org en keytool -keystore /etc/ssl/certs/java/cacerts -list.
  • Sí, sé que pocos navegadores web se envían con la raíz de cacert.org y certificados de clase 3.
  • El certificado es un certificado comodín para *.an.example.com (dominio real censurado).

Aquí está el código Java que estoy usando para la prueba:

class Test { 
    public static void main(String args[]) throws Exception { 
     java.net.URL url = new java.net.URL(args[0]); 
     java.io.InputStream s = url.openStream(); 
    } 
} 

El full stack trace no parece añadir cualquier información útil.

La página de manual keytool(1) menciona

Extensions can be marked critical to indicate that the extension should 
be checked and enforced/used. For example, if a certificate has the 
KeyUsage extension marked critical and set to "keyCertSign" then if this 
certificate is presented during SSL communication, it should be rejected, 
as the certificate extension indicates that the associated private key 
should only be used for signing certificates and not for SSL use. 

pero comprueba el certificado, y si bien la extensión "Certificado de Uso de la clave" sí dice "Firma", que también está marcada "No crítica".

Lo siento, no deseo revelar mi nombre de dominio o cert, pero probablemente pueda hacer girar un servidor para probar si es necesario.

+1

Encontrado esto: http://www.ericsimmerman.com/resolving-a-ca-key-usage-check-failed-keycert – Thilo

+0

@Thilo - buen hallazgo. Lo comprobé dos veces y parece que el SSLCertificateChainFile está correctamente instalado y configurado. –

+0

@Thilo - ¡Retiro eso, estás en lo cierto! El [archivo de la cadena está en mal estado] (http://wiki.cacert.org/SimpleApacheCert?action=AttachFile&do=view&target=CAcert_chain.pem) (gente de CAcert.org: ¡ARREGLALO!). Hice un archivo de cadena con 'cat class3.crt root.crt> chain.pem', y el error críptico" keyCertSign bit is not set "desapareció. Siéntase libre de agregar esto como respuesta y lo aceptaré. –

Respuesta

0

Me parece que el certificado no debe utilizarse para la comunicación SSL.
I.e. está marcado como un certificado de CA, pero como la extensión para la firma de certificados no está establecida, Java lo rechaza.
Java es a veces más estricto en este tipo de cosas, mientras que los navegadores son más indulgentes.

Cuestiones relacionadas