View Full Version : [Java] Controllare Certificato .Pem
Ragazzi ho bisogno di un aiuto, ho dei certificati in formato pem rilasciati dalla mia CA ora devo fare un programmino java che riconosce la correttezza dei certificati se sono validi e se la firma è corretta ora c'è qualche programma java che prendendo un certificato .pem e ne veda la correttezza e l'integrità??
Grazie Mille
devi scriverlo tu o vuoi qualcosa di già fatto?
con openssl puoi verificare i certificati con facilità.
devi scriverlo tu o vuoi qualcosa di già fatto?
con openssl puoi verificare i certificati con facilità.
se c'è gia fatto è meglio :) questa verifica di certificato la devo implementare poi in un Web Service
Grazie Mille
se c'è gia fatto è meglio :) questa verifica di certificato la devo implementare poi in un Web Service
Grazie Mille
se vuoi puoi farlo da java con qualche riga di codice, se vuoi un programma già fatto:
openssl verify -CAfile certificatoca.pem certificatodaverificare.pem
scusami non avevo capito bene, se possibile vorrei averlo in codice java che non sono riuscito a trovarlo su internet
Ti ringrazio
ho dato un'occhiata alla documentazione, per leggerlo da un PEM di basta:
InputStream is = new FileInputStream("cert.pem");
X509Certificate cert = X509Certificate.getInstance(inStream);
is.close();
e per verificarlo:
X509Certificate cert, caCert;
try
{
cert.verify( caCert.getPublicKey());
return true;
} catch (GeneralSecurityException e)
{
return false;
}
Grazie mille quindi questa prima parte
InputStream is = new FileInputStream("cert.pem");
X509Certificate cert = X509Certificate.getInstance(inStream);
is.close();
serve per leggere il certificato da locale quindi "cert.pem" ci devo passare il path del mio certificato?? e lo stesso se ci passo un .der???
Ho provato a fare girare questa parte superiore di codice almeno per leggeere il certificato ma il compilatore mi da un errore in inSream mi dice che non puo risolverlo.
X509Certificate cert, caCert;
try
{
cert.verify( caCert.getPublicKey());
return true;
} catch (GeneralSecurityException e)
{
return false;
}
questo serve per verificarlo ma come output che ci posso mettere??
questo metodo ritorna treu o false ma non lo devo racchiudere in un metodo boolean??
e l'ultima cosa che classi devo importare per far funzionare questo codice??
Grazie mille e scusami per le mille domande ;)
allora sono riuscito a far girare il codice con delle aggiunte eccolo qua:
public static void main(String[] args) {
try
{
//------ Get the certificates issuer DN ------------------
InputStream inStream = new FileInputStream("e:\\Prova.der");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
inStream.close();
String subjectdn = cert.getSubjectDN().getName();
String issuerdn = cert.getIssuerDN().getName() ;
System.out.println();
System.out.println("\nNome del Soggetto:\r\n" + subjectdn) ;
System.out.println("\nNome del Emittente:\r\n" + issuerdn) ;
//----- If this is a self-signed certificate, can verify signature immediately ---
X509Certificate caCert = null;
try
{
System.out.println();
System.out.println("This is a self-signed certificate. Verifying signature ...") ;
cert.verify(caCert.getPublicKey()) ;
System.out.println("Signature verified") ;
}
catch(Exception exc)
{
System.out.println("Failed to verify self-signed certificate");
}
return;
}
ma il mio problema è che questo va bene per verificare un certificato firmato da me invece io ho bisogno di verificare questo certificato firmato dalla mia OpenCA non da me.
Qlc mi puo aiutare :muro:
in caCert al posto di metterlo null carica il certificato della ca così come fai con il tuo e hai risolto.
Ho capito ma in linea di massima io posseggo solo il certificato che mi ha dato la CA io con le informazioni che ho in questo certificato non posso verificare la firma??
Attraverso i vari campi che ci sono tipo: X509v3 Authority Key Identifier o Signature Algorithm o quant'altro
In effetti il codice postato prima era leggermte sbagliato:
class CheckCert {
public static void main(String[] args) {
try
{
//------ Preleva Il Certificato ottiene qualche info e controlla se è nel periodo valido the------------------
InputStream inStream = new FileInputStream("e:\\Prova.der");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
inStream.close();
String subjectdn = cert.getSubjectDN().getName();
String issuerdn = cert.getIssuerDN().getName() ;
System.out.println();
System.out.println("\nNome del Soggetto:\r\n" + subjectdn) ;
System.out.println("\nNome del Emittente:\r\n" + issuerdn) ;
cert.checkValidity();
System.out.println("Il Certificato è Valido");
//----- If this is a self-signed certificate, can verify signature immediately ---
try
{
System.out.println();
System.out.println("This is a self-signed certificate. Verifying signature ...") ;
cert.verify(cert.getPublicKey()) ;
System.out.println("Signature verified") ;
}
catch(Exception exc)
{
System.out.println("Failed to verify self-signed certificate");
}
return;
}
catch (Exception e)
{
System.err.println("Caught exception " + e.toString());
System.err.println("Il certificato non è Valido!");
}
}
}
Grazie mille x il prezioso aiuto
modifica così il tuo codice (al posto di e:\\ca.der metti il path giusto):
class CheckCert {
public static void main(String[] args) {
try
{
//------ Preleva Il Certificato ottiene qualche info e controlla se è nel periodo valido the------------------
InputStream inStream = new FileInputStream("e:\\Prova.der");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
inStream.close();
inStream = new FileInputStream("e:\\ca.der");
X509Certificate caCert = (X509Certificate)cf.generateCertificate(inStream);
inStream.close();
String subjectdn = cert.getSubjectDN().getName();
String issuerdn = cert.getIssuerDN().getName() ;
System.out.println();
System.out.println("\nNome del Soggetto:\r\n" + subjectdn) ;
System.out.println("\nNome del Emittente:\r\n" + issuerdn) ;
cert.checkValidity();
System.out.println("Il Certificato è Valido");
try
{
System.out.println();
System.out.println("Verifying signature ...") ;
cert.verify(caCert.getPublicKey()) ;
System.out.println("Signature verified") ;
}
catch(Exception exc)
{
System.out.println("Failed to verify certificate");
}
return;
}
catch (Exception e)
{
System.err.println("Caught exception " + e.toString());
System.err.println("Il certificato non è Valido!");
}
}
}
Ok grazie quindi per verificare la firma devo per forza avere il certificato della mia CA non si puo fare altrimenti??cioe senza certificato della CA??
quindi il metodo verify in definitiva cosa fa??
vediamo se ho capito bene:
si prende la chiave pubblica della mia ca e estrapola la sua chiave privata e controlla se il mio certificato è stato firmato con quella chiave giusto??
Mi stai salvando la vita :mano:
Grazie
con la chiave pubblica della ca fai una verifica firma, ovvero ti accerti che chi ha emesso il certificato sia chi possiede la chiave associata al certificato della ca (cioè la CA stessa).
Ciao
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.