2012-04-25 17 views
14

Ho un'app Web che consente all'utente di caricare pkcs12. Conservo il pkcs12 come database binario. C'è un modo per sapere se il certificato in pkcs12 è autofirmato o firmato?Trova se un certificato è autofirmato o firmato dalla CA

Sto eseguendo un'app Web Java su tomcat e ho a mia disposizione openssl.

+0

Controllare la mia [risposta] (http://security.stackexchange.com/a/144514/132597) su security stackexchange. – reddot

risposta

9

e 'un po' hacky, ma il comando openssl x509 può riferire sia l'emittente e il soggetto. Se il soggetto e l'emittente sono uguali, è autofirmato; se sono diversi, allora è stato firmato da una CA. (A rigor di termini, molti certificati autofirmati sono anche firmati da una CA stessa.)

Durante il test di questa teoria, ho eseguito una manciata di test; funziona come:

cd /etc/ssl/certs 
for f in *.0 ; do openssl x509 -in $f -issuer | head -1 > /tmp/$f.issuer ; openssl x509 -in $f -subject | head -1 > /tmp/$f.subject ; done 
cd /tmp 
sed -i -e s/issuer=// *.issuer 
sed -i -e s/subject=// *.subject 
cd /etc/ssl/certs/ 
for f in *.0 ; do diff -u /tmp/$f.issuer /tmp/$f.subject ; done 

Spero che questo aiuti.

+0

Sì, questo funziona. L'ho fatto in Java usando la sicurezza Java. – Nishan

+1

È possibile migliorare ciò semplicemente facendo 'openssl x509 -in $ f -issuer -subject' e rimuovendo i comandi' head' e second' 'openssl'. – glyphobet

+0

Hai detto "se sono diversi, quindi è stato firmato da una CA". Penso che sia importante notare che in realtà non lo è. Di solito, un certificato è firmato da più di un certificato in catena. Es: il certificato principale è firmato dal secondo che è firmato da un altro certificato e così via. È importante controllare tutti i certificati nella catena per garantire la prima convalida del certificato. Altrimenti è una grande tecnica. Grazie! – jumojer

0

Hai provato la libreria BouncyCastle?

http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions

" Ci sono programmi di esempio specifici per trattare con attributo Certificati, PKCS12, SMIME e OpenPGP Si possono trovare nei pacchetti:.

org.bouncycastle.jce.examples org. bouncycastle.mail.smime.examples org.bouncycastle.openpgp.examples Un'altra fonte utile di esempi sono i pacchetti di prova:

org.bouncycastle.crypto.test org.bouncycastle.jce.provider.test org.bouncycastle.cms.test org.bouncycastle.mail.smime.test org.bouncycastle.openpgp.test org.bouncycastle.cert.test org.bouncycastle.pkcs .test org.bouncycastle.tsp.test "

11

thread e-mail dice esattamente il modo giusto per verificare se il certificato codificato base64 (cioè PEM) è auto firmato o no: http://marc.info/?l=openssl-users&m=116177485311662&w=4

seguito è il frammento di codice:

openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem 

dovrebbe restituire:

self_signed_cert.pem: OK 

O confrontare l'emittente e l'oggetto. Se sono uguali, si è auto firmato

openssl x509 -in cert.pem -inform PEM -noout -subject -issuer 
0

Java è in grado di analizzarePKCS12 in modo da avere per convertirlo in keystore usando OpenSSL.

Qui il keystore ha sia la chiave privata che il certificato X509 (oppure è possibile scegliere solo di memorizzare il certificato). Quindi ottenere l'emittente da keystore utilizzando l'API JAVA standard e verificare manualmente l'emittente.