2012-04-22 17 views
6

sto chiamando un URL https a distanza con il seguente codice:errore quando https apertura URL: po keyCertSign non è impostato

def inputStream = new URL("https://somewebsite.com").openStream() 

Questa grande opera sulla mia macchina locale, ma quando schiero al server, ho ottenere la seguente eccezione:

java.security.cert.CertPathValidatorException: CA key usage check failed: keyCertSign bit is not set 

Qual è la causa di questo errore, e ciò potrebbe spiegare farlo funzionare su una macchina e non un altro?


UPDATE


Sono in esecuzione un server di Ubuntu nella produzione e nello sviluppo su un Mac a livello locale. Il sito che sto cercando di accesso (chiamiamolo peopleware.com) ha le seguenti informazioni del certificato:

  1. AddTrust External CA Root
  2. UTN-USERFirst-Hardware
  3. peopleware.com

ho cercato il salvataggio dei file con estensione cer dal mio browser e la loro installazione nell'archivio chiavi in ​​/ etc/ssl/certs/java/Castore

+2

Molto probabilmente il server non ha il certificato radice corretto installato, quindi non può verificare che il certificato SSL che il sito sta dando sia valido. –

+0

Grazie- Ho acquistato un certificato SSL e l'ho installato su questo server. Potrebbe avere qualcosa a che fare con questo? O è non correlato? –

+0

Dipende, viene visualizzato questo errore durante la connessione dal server a un'altra macchina o da un'altra macchina al server? –

risposta

5

sto supponendo che si sta parlando di questo certificato da UTN-USERFi RST-Hardware:

-----BEGIN CERTIFICATE----- 
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB 
lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug 
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho 
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt 
SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG 
A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe 
MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v 
d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh 
cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn 
0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ 
M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a 
MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd 
oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI 
DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy 
oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD 
VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 
dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy 
bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF 
BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM 
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli 
CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE 
CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t 
3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS 
KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== 
-----END CERTIFICATE----- 

In una versione leggibile:

Version: 3 (0x2) 
Serial Number: 
    44:be:0c:8b:50:00:24:b4:11:d3:36:2a:fe:65:0a:fd 
Signature Algorithm: sha1WithRSAEncryption 
Issuer: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware 
Validity 
    Not Before: Jul 9 18:10:42 1999 GMT 
    Not After : Jul 9 18:19:22 2019 GMT 
Subject: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware 
Subject Public Key Info: 
    [...] 
X509v3 extensions: 
    X509v3 Key Usage: 
     Digital Signature, Non Repudiation, Certificate Sign, CRL Sign 
    X509v3 Basic Constraints: critical 
     CA:TRUE 
    X509v3 Subject Key Identifier: 
     A1:72:5F:26:1B:28:98:43:95:5D:07:37:D5:85:96:9D:4B:D2:C3:45 
    X509v3 CRL Distribution Points: 

     Full Name: 
      URI:http://crl.usertrust.com/UTN-USERFirst-Hardware.crl 

    X509v3 Extended Key Usage: 
     TLS Web Server Authentication, IPSec End System, IPSec Tunnel, IPSec User 

In sostanza, abbiamo qui un certificato CA sia con X509v3 Key Usage e X509v3 Extended Key Usage.

Tuttavia, RFC 3280 says the following about the extended key usage extension:

In generale, questa estensione apparirà solo un'entità finale certificati.

Questo non inizia molto bene per un CERT CA, ma in seguito, nella stessa sezione dice anche questo:

Se un certificato contiene sia una chiave di utilizzo estensione e di un esteso utilizzo della chiave estensione, quindi entrambe le estensioni DEVONO essere elaborate in modo indipendente e il certificato DEVE essere utilizzato solo per uno scopo coerente con entrambe le estensioni. Se non esiste uno scopo costante con con entrambe le estensioni, il certificato NON DEVE essere utilizzato per nessuno scopo .

L'unica estensione utilizzo chiave estesa in questo cert che è in questa RFC è TLS Web server di autenticazione:

id-kp-serverAuth    OBJECT IDENTIFIER ::= { id-kp 1 } 
    -- TLS WWW server authentication 
    -- Key usage bits that may be consistent: digitalSignature, 
    -- keyEncipherment or keyAgreement 

Naturalmente, questo non è coerente con keyCertSign, che, secondo la RFC 3280 (e RFC 5280). (Dubito anche che le estensioni IPSec siano compatibili con keyCertSign). Ciò rende questo certificato inutile per emettere certificati (non molto utile per un certificato CA).

Vorrei contattare il sito Web utilizzando questo certificato per chiedere loro di contattare la loro CA (UTN-USERFirst-Hardware, apparentemente Comodo) e chiedere loro di risolvere questo problema. Devo dire che non sembra buono proveniente da persone che fanno i loro soldi sul retro di questi RFC.

Naturalmente, questo potrebbe richiedere un po 'di tempo e non risolverebbe il tuo problema immediato.

Penso di aver visto questo oggetto DN (UTN-USERFirst-Hardware) in altri certificati CA intermedi, quindi quello sopra potrebbe non essere quello che stai utilizzando.

Quello che potresti essere in grado di fare (purché tu sia in grado di verificare manualmente il certificato del server stesso nonostante questi problemi) è di usare uno SSLContext e uno TrustManager specificamente limitato per usare quel certificato molto, per questa connessione. Ciò potrebbe impedire all'algoritmo del percorso di certificazione di cercare di trovare il certificato emittente e rientrare in questo problema.

EDIT:

Qui ci sono ulteriori dettagli su questa soluzione (che dovrebbe comunque mantenere la vostra connessione protetta).

  • Connettersi con Firefox a questo sito Web.
  • Fare clic sulla blu/barra verde e scegliere 'Altre informazioni ...'
  • Sicurezza -> Visualizza certificato -> Dettagli
  • Scegliere il certificato server dall'elenco in alto e scegliere 'Export ... '
  • Lo stesso file PEM da qualche parte.

Usa keytool per creare un nuovo keystore (scegliere di fidarsi di quel certificato e scegliere una password sensibile):

keytool -importcert -keystore example.jks -file example.pem 

Quindi, utilizzare questo codice Java, che non dovrebbe essere troppo difficile da porta Groovy:

TrustManagerFactory tmf = TrustManagerFactory 
    .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
KeyStore ks = KeyStore.getInstance("JKS"); 
FileInputStream fis = new FileInputStream("/.../example.jks"); 
ks.load(fis, null); 
// or ks.load(fis, "thepassword".toCharArray()); 
fis.close(); 

tmf.init(ks); 

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(null, tmf.getTrustManagers(), null); 

URL url = new URL("https://somewebsite.com"); 
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
conn.setSSLSocketFactory(sslContext.getSocketFactory()); 

InputStream is = conn.getInputStream(); 
Problemi correlati