2011-11-18 8 views
6

Ho creato un certificato server SSL allo CAcert. Quando provo a prendere una pagina da questo server da un programma Java (in basso), ottengoPerché java choke on cert made in cacert.org: "keyCertSign bit non è impostato"?

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 

Qualcuno sa che cosa potrebbe causare questo?

  • Ho provato a creare certificati firmati da entrambi i certificati di classe 1 e classe 3, stesso risultato.
  • L'errore non non si verificano quando si tenta di recuperare le pagine di altri due siti che utilizzano CAcert.org certs: https://www.cacert.org e https://pause.perl.org (mi portano a credere che la classe radice & 3 certs da cacert.org siano correttamente installato il mio sistema).
  • Riesco a vedere i certificati cacert.org in keytool -keystore /etc/ssl/certs/java/cacerts -list.
  • Sì, so che alcuni browser Web sono forniti con certificati cacert.org root e classe 3.
  • Il certificato è un carattere jolly per *.an.example.com (dominio reale redatto).

Ecco il codice Java che sto usando per prova:

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(); 
    } 
} 

Il full stack trace non sembra aggiungere tutte le informazioni utili.

Il keytool(1) pagina di manuale menziona

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. 

ma ho controllato il CERT, e mentre l'estensione "Certificate Key Usage" fa dire "Firma", è anche segnato "Non critico".

Spiacente, non desidero rivelare il mio nome di dominio o certificato, ma probabilmente posso far girare un server per testare se necessario.

+1

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

+0

@Thilo - buona scoperta. Ho ricontrollato e sembra che SSLCertificateChainFile sia installato e configurato correttamente. –

+0

@Thilo - Lo riprendo, hai ragione! Il [file della catena è incasinato] (http://wiki.cacert.org/SimpleApacheCert?action=AttachFile&do=view&target=CAcert_chain.pem) (CAcert.org folks: FIX THAT!). Ho creato un file di catena io stesso con 'cat class3.crt root.crt> chain.pem', e il criptico" keyCertSign bit non è stato impostato "errore scomparso. Sentiti libero di aggiungere questo come risposta e lo accetterò. Aggiornamento –

risposta

0

Mi sembra che il certificato non debba essere utilizzato per la comunicazione SSL.
I.e. è contrassegnato come un certificato CA ma poiché l'estensione per il firmamento del certificato non è impostata, Java la rifiuta.
Java a volte è più rigido su cose come questa, mentre i browser sono più indulgenti.

Problemi correlati