Cifratura asimmetrica ¾ La cifratura SIMMETRICA è un ottimo strumento per la sicurezza ¾ Il problema della cifratura simmetrica sta nel fatto che occorre avere una chiave condivisa e quindi bisogna scambiarsi questa informazione ¾ Questa operazione è però molto difficile da effettuarsi in modo che nessun altro scopra la chiave ¾ La soluzione a questo problema è risolto con la cifratura a chiave ASIMMETRICA 37 Cifratura asimmetrica Cosa si vuole ottenere: Il forziere ora ha due serrature diverse, una permette solo di chiudere e l’ l’altra solo di aprire pubblica privata 38 Modalità Padding ¾ Nei cifrari asimmetrici si usa quasi sempre ECB ¾ Nella cifratura asimmetrica non si usa PKCS#5 ¾ Tipicamente i cifrari asimmetrici sono utilizzati per cifrare un singolo blocco in chiaro ¾ Gli standard per cifrare con RSA sono invece PKCS#1 e OAEP (Optimal Asymmetric Encryption Padding) ¾ Generalmente le dimensioni di quel blocco sono grandi quasi come quelle della chiave ¾ Di seguito non sarà illustrato il funzionamento di tali forme di padding Se è necessario cifrare più dati si utilizzerà la cifratura a chiave di sessione che vedremo in seguito ¾ Per chi fosse interessato : www.rsasecurity.com/rsalabs/pkc s/pkcs-1/index.html ¾ 39 RSA Occorre un provider che supporti tale algoritmo Es. BouncyCastle (Å) In J2SE1.4 J2SE1.4 RSA è supportato solo per le operazioni di firma e verifica import javax.crypto.*; javax.crypto.*; import java.security.*; java.security.*; ….. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance ("RSA RSA"); "); KeyPairGenerator.getInstance(" keyPairGenerator.initialize(1024); keyPairGenerator.initialize(1024); KeyPair keyPair = keyPairGenerator.genKeyPair(); keyPairGenerator.genKeyPair(); Cipher cipher = Cipher.getInstance ("RSA/ECB/PKCS1Padding RSA/ECB/PKCS1Padding"); "); Cipher.getInstance(" cipher.init( cipher.init(Cipher.ENCRYPT_MODE, Cipher.ENCRYPT_MODE, keyPair.getPublic()); keyPair.getPublic()); Questa volta occorre una coppia di chiavi Per la cifratura occorre inizializzare il cifrario con una PublicKey byte[] UTF8”); byte[] messageBytes = new String( String(“Combinazione:1234” Combinazione:1234”).getBytes( .getBytes(“UTF8” byte[] byte[] cipherText = cipher.doFinal( cipher.doFinal(messageBytes); messageBytes); Per la decifrazione occorre inizializzare cipher.init( cipher.init(Cipher.DECRYPT_MODE, Cipher.DECRYPT_MODE, keyPair.getPrivate()); keyPair.getPrivate()); il cifrario con una PrivateKey byte[] byte[] decryptedMessageBytes = cipher.doFinal( cipher.doFinal(cipherText); cipherText); System.out.println System.out.println((new String( String(decryptedMessageBytes, decryptedMessageBytes,”UTF8” UTF8”)); ..... 40 Cifratura a chiave di sessione La cifratura asimmetrica è 1000 volte più lenta di quella simmetrica Per gestire questa inefficienza in genere si utilizza la cifratura a Chiave di Sessione 41 Cifratura a chiave di sessione 1. Il messaggio in chiaro è cifrato con una chiave simmetrica 2. Poi questa a sua volta viene cifrata con la chiave pubblica del destinatario 3. Il destinatario quindi decifra la chiave simmetrica con la sua sua chiave privata 4. Infine il destinatario può decifrare il messaggio usando la chiave simmetrica ottenuta La chiave simmetrica viene cambiata ad ogni sessione (da qui il nome chiave di sessione) sessione) La cifratura asimmetrica coinvolge poco testo in chiaro risultando in questo modo efficiente 42 Cifratura di una chiave simmetrica import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; ..... KeyGenerator keyGenerator = KeyGenerator.getInstance("Blowfish"); keyGenerator.init(128); Key blowfishKey = keyGenerator.generateKey(); Generazione della chiave di sessione Generazione di una coppia di chiavi RSA KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(1024); KeyPair keyPair = keyPairGenerator.genKeyPair(); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); Trasformazione della chiave nel formato richiesto per byte[] blowfishKeyBytes = blowfishKey.getEncoded(); l’operazione di cifratura byte[] cipherText = cipher.doFinal(blowfishKeyBytes); cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate()); Riconversione dei byte[] decryptedKeyBytes = cipher.doFinal(cipherText); byte in chiave SecretKey blowfishKey = new SecretKeySpec(decryptedKeyBytes,"Blowfish"); ..... 43 Firme digitali (1) Algoritmo di impronta Messaggio inviato dal mittente Autenticazione Impronta del messaggio Chiave privata Lato Mittente Algoritmo di firma Firma digitale inviata al destinatario 44 Firme digitali (2) Autenticazione Algoritmo di impronta Messaggio ricevuto dal destinatario Impronta del messaggio UGUALI? Chiave pubblica Impronta del messaggio Algoritmo di firma Lato Destinatario Firma digitale ricevuta dal mittente 45 Firmare e verificare import java.security.Signature; import java.security.SignatureException; import java.security.KeyPair; import java.security.KeyPairGenerator; ..... KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(1024); KeyPair keyPair = kpg.genKeyPair(); byte[] messaggio = new String(“Non esistono più le mezze stagioni”).getBytes(“UTF8”); Signature sig = Signature.getInstance("MD5WithRSA"); sig.initSign(keyPair.getPrivate()); sig.update(messaggio); byte[] signatureBytes = sig.sign(); ..... sig.initVerify(keyPair.getPublic()); sig.update(messaggio); Per firmare occorre istanziare un oggetto Signature Per firmare si inizializza con la chiave privata update() update() passa i dati da firmare sign() sign() restituisce i byte della firma digitale Per la verifica della firma si inizializza con la chiave pubblica update() update() passa i dati da verificare boolean verified = false; try { verified = sig.verify(signatureBytes); } catch (SignatureException se) { System.out.println(“La firma ha un formato non valido!”); } if (verified) { … } else { … } SignatureException è lanciata, ad esempio, in caso di perdita ..... di un byte e non perchè perchè la verifica ha dato esito negativo 46 RSA e DSA a confronto ¾ Firmare con RSA significa cifrare con la chiave privata e decifrare con la pubblica ¾ Questa operazione non nasconde i dati (perchè decifrabili attraverso la chiave pubblica) ma prova l’identità del firmatario ¾ Il DSA (Digital Signature Algorithm) funziona come RSA per la firma ma non può essere usato per cifrare ¾ Il DSA è più veloce nel generare le firme mentre RSA nel convalidarle Una firma viene convalidata più spesso di quanto non venga generata Æ RSA è più veloce per la maggior parte delle applicazioni 47 Identità della chiave pubblica ¾ Per convalidare una firma occorre una chiave pubblica ¾ Ma come essere certi che la chiave pubblica è autentica? ¾ Serve un qualche mezzo per averne la certezza I CERTIFICATI sono il tentativo di risolvere questo problema attribuendo l’identità ad una chiave pubblica in modo inconfutabile ¾ Java offre funzionalità di gestione dei certificati attraverso un set di packages appositamente dedicato ¾ Tale componente prende il nome di Java CertPath 48 JSSE Java Secure Socket Extension Caratteristiche ¾ La Java Secure Socket Extensions (JSSE) offre: z z z ¾ funzionalità funzionalità di autenticazione protezione dell’ dell’integrità integrità dei dati protezione della riservatezza dei dati Mediante i protocolli per comunicazioni sicure: z z SSL (Secure Socket Layer) v2.0 e v3.0 v3.0 TLS (Transport Layer Security) Security) v1.0 v1.0 ¾ Mentre JCE opera su specifici dati locali, JSSE adotta una differente astrazione applicando meccanismi crittografici a livello di rete ¾ Le JSSE API contenute in javax.net e javax.net.ssl estendono: z z z javax.crypto (JCE) java.security java.security (JCA) java.net java.net 50 Caratteristiche ¾ Le funzionalità crittografiche di JSSE sono implementate dal provider "SunJSSE“ ¾ Il protocollo di applicazione più adoperato con JSSE è HTTP (Hyper Text Transfer Protocol) che assume la dicitura di HTTPs ¾ Molti altri protocolli possono usufruire di JSSE, come NNTP (Net News Transfer Protocol), Telnet, LDAP (Lightweight Directory Access Protocol), IMAP (Interactive Message Access Protocol) ed FTP (File Transfer Protocol) ¾ Novità di JSSE nella versione integrata: z z Il package javax.security.cert è presente solo per compatibilità compatibilità con le applicazioni realizzate con JSSE opzionale. Ad esso è da preferire il package java.security.cert di CertPath, CertPath, integrato in J2SE a partire dalla versione 1.4 JSSE può fare uso del provider "SunJCE" SunJCE" per operazioni di cifratura e decifrazione 51 Architettura SSL APPLICAZIONI SSL A B abc abc CHANGE CIPHER SPEC HANDSHAKE ALERT JSSE RECORD PROTOCOLLI SSL z6f z6f TRASPORTO TCP RETE IP DATALINK Ethernet z6f TCP TRASPORTO IP RETE Ethernet DATALINK 52 Protocollo di Handshake 2. Server hello 3. Certificate (optional) 4. Certificate request (optional) 5. Server key exchange (optional) 6. Server hello done 7. Certificate (optional) 8. Client key exchange 9. Certificate verify (optional) 10. Change cipher spec 11. Finished 14. Encrypted data SERVER CLIENT 1. Client hello 12. Change cipher spec 13. Finished 14. Encrypted data 53 Classi principali ¾ Factories SSLServerSocketFactory e SSLSocketFactory per la creazione di Socket, ServerSocket, SSLSocket, SSLServerSocket con incapsulamento delle caratteristiche di costruzione e configurazione (socket factory framework) ¾ Classe SSLContext che agisce da factory per le socket factories e realizza il concetto di contesto sicuro ¾ Interfacce KeyManager e TrustManager (incluse specifiche X.509) per la gestione delle chiavi e delle decisioni inerenti la sicurezza (keystore e truststore) ¾ Factories KeyManagerFactory e TrustManagerFactory ¾ SSLSession per la gestione server di sessioni SSL residenti in memoria ¾ Connessioni sicure con HttpsURLConnection 54 Relationship Key Material Key Material KeyManagerFactory TrustManagerFactory KeyManager TrustManager Default Context SecureRandom SSLContext SSLSocketFactory SSLServerSocketFactory SSLServerSocket SSLSocket SSLSocket SSLSession 55 Creazione di una SSLContext ..... SSLContext ctx = SSLContext.getInstance ("TLS TLS"," ","SunJSSE SunJSSE"); "); SSLContext.getInstance(" Creazione di un SSLContext dal provider SunJSSE con gestione del protocollo TLS KeyManagerFactory kmf = KeyManagerFactory.getInstance ("SunX509 SunX509"," ","SunJSSE SunJSSE"); "); KeyManagerFactory.getInstance(" TrustManagerFactory tmf = TrustManagerFactory.getInstance ("SunX509 SunX509"," ","SunJSSE SunJSSE"); "); TrustManagerFactory.getInstance(" SecureRandom random = SecureRandom.getInstance ("SHA1PRNG SHA1PRNG", ", "Sun "); SecureRandom.getInstance(" "Sun"); byte seed[] seed[] = random.generateSeed(20); random.generateSeed(20); Creazione di un KeyManagerFactory random.setSeed( random.setSeed(seed); seed); e TrustManagerFactory con gestione del protocollo SunX509 KeyStore ks = KeyStore.getInstance ("PKCS12 PKCS12"); "); KeyStore.getInstance(" Creazione di un SecureRandom e char[] char[] passphrase = "passphrase "passphrase"".toCharArray(); .toCharArray(); generazione di un seme di ks.load( testkeys"), "), passphrase); ks.load(new FileInputStream(" FileInputStream("testkeys passphrase); inizializzazione mediante l’ l’algoritmo SHA1PRNG fornito dal provider Sun Creazione di un KeyStore secondo lo standard PKCS#12 kmf.init( kmf.init(ks, ks,passphrase); passphrase); load() load() per caricamento da file kmt.init( kmt.init(ks); ks); ctx.init( ctx.init(kmf.getKeyManagers(), kmf.getKeyManagers(), kmt.getTrustManagers(), kmt.getTrustManagers(), random); random); ..... Inizializzazione del contesto SSL 56 Creazione di una SSLSession ..... SSLServerSocketFactory ssf = ctx.getServerSocketFactory(); ctx.getServerSocketFactory(); SSLServerSocket server = ssf.createServerSocket( ssf.createServerSocket(port); port); Creazione di una SSLServerSocket associata al contesto di sicurezza SSlSocketFactory sf = ctx.getSocketFactory(); ctx.getSocketFactory(); SSLSocket client = sf.createServerSocket( sf.createServerSocket(host, host, port); port); Creazione lato client di una SSLSocket associata al contesto di sicurezza legata alla socket del server client.addHandshakeCompletedListener( client.addHandshakeCompletedListener(new HandshakeCompletedListener() HandshakeCompletedListener() { public void handshakeCompleted( handshakeCompleted(HandshakeCompletedEvent event) event) {...}}); client.startHandshake(); client.startHandshake(); Avvio del protocollo di Handshake SSLSession session = client.getSession(); client.getSession(); ..... Gestione dell’ dell’evento di completamento del protocollo di Handshake Recupero della SSLSession dalla socket delclient 57 “SunJSSE” Provider ¾ Funzionalità crittografiche implementate da JSSE: ALGORITMO CRITTOGRAFICO PROCESSO CRITTOGRAFICO LUNGHEZZA CHIAVE (BITS) RSA autenticazione e scambio della chiave 2048 (autenticazione) 2048 (scambio della chiave) 512 (scambio della chiave) RC4 cifratura 128 128 (40 effettivi) DES cifratura 64 (56 effettivi) 64 (40 effettivi) TripleDES cifratura 192 (112 effettivi) DiffieDiffie-Hellman scambio della chiave 1024 512 DSA autenticazione 1024 58 “SunJSSE” Provider ¾ Engine classes della JCA implementate dal provider della JSSE: ENGINE CLASS ALGORITMO - PROTOCOLLO KeyFactory “RSA” RSA” KeyPairGenerator “RSA” RSA” KeyStore “PKCS12” PKCS12” Signature “MD2withRSA” MD2withRSA” Signature “MD5withRSA” MD5withRSA” Signature “SHA1withRSA” SHA1withRSA” KeyManagerFactory “SunX509” SunX509” TrustManagerFactory “SunX509” SunX509” - “SunPKIX” SunPKIX” SSLContext “SSL” SSL” SSLContext “SSLv3” SSLv3” SSLContext “TLS” TLS” SSLContext “TLSv1” TLSv1” 59 Cipher Suites ¾ Cipher suites supportate da "SunJSSE" in ordine di preferenza per default: CIPHER SUITES NUOVE IN J2SEv1.4 J2SEv1.4 SSL_RSA_WITH_RC4_128_MD5 SSL_RSA_WITH_RC4_128_SHA TLS_RSA_WITH_AES_128_CBC_SHA X TLS_DHE_RSA_WITH_AES_128_CBC_SHA X TLS_DHE_DSS_WITH_AES_128_CBC_SHA X SSL_RSA_WITH_3DES_EDE_CBC_SHA SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA X SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_DES_CBC_SHA SSL_DHE_RSA_WITH_DES_CBC_SHA X SSL_DHE_DSS_WITH_DES_CBC_SHA SSL_RSA_EXPORT_WITH_RC4_40_MD5 SSL_DSS_EXPORT_WITH_DES40_CBC_SHA X ..... 60 JAAS Java Authentication and Authorization Service 61 Caratteristiche ¾ Java Authentication and Authorization Service (JAAS) offre due servizi: z z ¾ autenticazione - identificazione sicura dell’ dell’utente autorizzazione - verifica dei permessi necessari per le operazioni richieste Attraverso: configurazione dinamica dei moduli di login operazioni di callback z controllo degli accessi z distribuzione dei permessi z Il framework di autenticazione è progettato per essere “pluggable” pluggable” in base al modello PAM (Pluggable Authentication Module), Module), che rende indipendenti le applicazioni dalle tecnologie di autenticazione sottostanti come: come: verifica di username e password z verifica di caratteristiche biometriche (voce, impronte digitali, ...) z Inoltre JAAS supporta lo stacking dei moduli di autenticazione Il componente JAAS per le autorizzazioni opera in congiunzione con con il modello Java per il controllo degli accessi a risorse sensibili (Java Security Framework) Framework) z ¾ ¾ ¾ 62 Classi principali ¾ Le JAAS APIs sono contenute nel set di packages javax.security.auth: Identificazione z z z Subject – sorgente di richiesta di autenticazione nell’ nell’accesso ad una risorsa Principal – interfaccia che rappresenta l’ l’identità identità di un Subject se l’ l’autenticazione ha successo Refreshable / Destroyable – interfacce che esprimono la capacità capacità di refresh e di reset delle credenziali associate ad un Subject Autenticazione z z z z LoginModule – interfaccia per l'implementazione delle diverse tecnologie di autenticazione autenticazione LoginContext – offre i metodi per autenticare un Subject e determinare i servizi di autenticazione o i LoginModules LoginModules configurati per l’ l’applicazione CallbackHandler – interfaccia implementata dall’ dall’applicazione e passata al LoginContext, LoginContext, attraverso la quale i LoginModules LoginModules comunicano bidirezionalmente con gli utenti Callback – package che offre diverse implementazioni da usare mediante CallbackHandler Autorizzazione z z z z Policy – classe astratta per definire le politiche di accesso al sistema AuthPermission – incapsula i permessi di base richiesti in JAAS per l'autenticazione l'autenticazione Configuration - rappresenta la configurazione di un LoginModule PrivateCredentialPermission – protegge l’ l’accesso alle credenziali di un Subject privato 63 Identificazione ¾ Un Subject contiene tre tipologie di informazioni per l'identificazione: z z z ¾ Implementazioni dell'interfaccia Principal sono le seguenti classi: z z z ¾ Identities - nella forma di uno o più più Principals Principals Public credentials - come nome e chiavi pubbliche Private credentials - come password e chiavi private java.security.Identity javax.security.auth.kerberos.KerberosPrincipal javax.security.auth.x500.X500Principal Qualsiasi Object può rappresentare una credential pubblica o privata Subject subject; Principal principal; Object credential; subject.getPrincipals().add(principal); subject.getPublicCredentials().add(credential); subject.getPrivateCredentials().add(credential); 64 Login Modules ¾ ¾ Per costruire un modulo di autenticazione personalizzato occorre implementare l'interfaccia LoginModule J2SE 1.4 mette a disposizione un set di LoginModules ready-to-use: z z z z ¾ ¾ JndiLoginModule - login con un directory service configurato sotto JNDI (Java Naming and Directory Interface) Krb5LoginModule - login con i protocolli di Kerberos v5 NTLoginModule - login con le informazioni di current user in NT UnixLoginModule - login con le informazioni di current user in UNIX In com.sun.security.auth sono disponibili alcune relative implementazioni dell'interfaccia Principal, come NTDomainPrincipal e UnixPrincipal La classe LoginContext carica Application { dinamicamente la configurazione ModuleClass Flag ModuleOptions; ModuleClass Flag ModuleOptions; di un modulo di login da un file ..... di testo con la seguente struttura: }; Application { ..... }; ..... 65 Callbacks e CallbackHandlers ¾ ¾ ¾ CallbackHandlers e Callbacks raccolgono le informazioni necessarie per l'autenticazione di un utente o un sistema Rendono indipendenti i LoginModules dai meccanismi di interazione J2SE 1.4 mette a disposizione due CallbackHandlers all'interno del package com.sun.security.auth.callback: DialogCallbackHandler TextCallbackHandler ¾ Sette Callbacks, presenti in javax.security.auth.callback, sono implementate da JAAS e possono essere adoperate per realizzare CallbackHandlers personalizzati: ChoiceCallback LocaleCallback PasswordCallback TextOutputCallback ConfirmationCallback NameCallback TextInputCallback 66 Esempio Applicazione client ..... MyCallbackHandler handler = new MyCallbackHandler() MyCallbackHandler() LoginContext lc = new LoginContext(" Example", ", handler); LoginContext("Example handler); lc.login(); lc.login(); ..... File di configurazione JAAS - "jaas.config" jaas.config" Example { RdbmsLoginModule required debug="true debug="true"" url="jdbc localhost/JAAS" /JAAS" url="jdbc::mysql:// mysql://localhost driver=" driver="gwe.sql.gweMysqlDriver"; gwe.sql.gweMysqlDriver"; }; Esecuzione con impostazione della javax.security.auth.login.config java -Djavax.security.auth.login.config = jaas.config MyApp" MyApp" 67 Pluggable Authentication APPLICAZIONI Configuration File Login Context API Login Module SPI ..... UnixLoginModule Krb5LoginModule NTLoginModule JndiLoginModule LDAP Server Unix Authentication NT Authentication Kerberos Authentication Web Service RDBMS Smart Card Authentication Biometric Authentication Security & Authentication Services 68 Processo di Autenticazione APPLICAZIONE Creazione di un LoginContext per il processo di autenticazione LoginContext consulta le configurazioni di login (ConfigFile) ConfigFile) per caricare tutti i LoginModules LoginModules configurati per l’ l’applicazione Invocazione del metodo login() login() di LoginContext Il metodo login() login() invoca tutti i LoginModules LoginModules caricati, che interagiscono con l'utente o il sistema da autenticare mediante il CallbackHandler Ogni LoginModule associa Principals Principals e Credentials al Subject autenticato LoginContext restituisce all’ all’applicazione lo stato dell’ dell’autenticazione Se l’ l’autenticazione ha avuto successo l’ l’applicazione recupera il Subject dal LoginContext popolato di Principals Principals e Credentials 69 Controllo degli Accessi ¾ ¾ ¾ ¾ ¾ JAAS offre a tempo di esecuzione rinforza il controllo degli accessi ad un sistema La classe SecurityManager viene consultata ogni volta che una operazione sensibile debba essere effettuata Il SecurityManager a sua volta delega la responsabilità del controllo ad un AccessController L'AccessController si procura una immagine dell'AccessControlContext corrente e verifica se si hanno i permessi necessari per l'operazione richiesta JAAS offre due metodi che permettono di associare dinamicamente un Subject autenticato con il thread AccessControlContext corrente: z z ¾ Subject.doAs() Subject.doAs() Subject.doAsPrivileged() Subject.doAsPrivileged() Dopo l'associazione ed il controllo dei permessi viene eseguita o meno l'operazione richiesta a seconda delle autorizzazioni concesse 70 CertPath Java Certification Path 71 Caratteristiche ¾ ¾ Java Certification Path (CertPath) offre interfacce ed engine classes per gestire certificati e certification paths, ovvero liste ordinate di certificati derivanti da una gerarchia di Certification Authority (CA) Le funzionalità offerte possono essere suddivise in quattro categorie: z Basic Certification Path • CertPath, CertPath, CertificateFactory, CertificateFactory, CertPathParameters z Certification Path Validation Gerarchia di CA • CertPathValidator, CertPathValidator, CertPathValidatorResult z Certification Path Building • CertPathBuilder, CertPathBuilder, CertPathBuilderResult z Certificate/CRL Storage • CertStore, CertStore, CertStoreParameters, CertStoreParameters, CertSelector, CertSelector, CRLSelector ¾ CertPath offre inoltre la possibilità di costruire e validare certification paths X.509 secondo gli standards PKIX 72 Core Classes • Le principali CertPath APIs sono contenute in java.security.cert: z z z z z z z z z z z z CertPath –definisce le funzionalità funzionalità comuni per un certification path CertificateFactory –definisce funzionalità funzionalità di una factory di certificati CertPathParameters – interfaccia per la rappresentazione trasparente del set di parametri usati con un particolare CertPathBuilder o con un algoritmo algoritmo di validazione CertPathValidator –valida un certification path CertPathValidatorResult – interfaccia per la rappresentazione trasparente del risultato favorevole o dell’ dell’output di un algoritmo di validazione di una lista di certicati CertPathBuilder –costruisce un certification path CertPathBuilderResult – interfaccia per la rappresentazione trasparente del risultato o dell’ dell’output di un algoritmo di costruzione di un certification path CertStore –fornisce le funzionalità funzionalità di deposito di una CRL CertStoreParameters – rappresentazione trasparente del set di parametri usati con un particolare CertStore (LDAPCertStoreParameters (LDAPCertStoreParameters,, CollectionCertStoreParameters) CollectionCertStoreParameters) CertSelector / CRLSelector – interfacce per la specifica dell’ dell’insieme di criteri adottati per selezionare certificati e CRLs da una collezione di certificati certificati o di CRLs X509Certificate / X509CertSelector - gestiscono certificati X.509 X.509 X509CRL / X509CRLEntry / X509CRLSelector - gestiscono CRL 73 PKIX Classes ¾ Le classi più importanti inerenti gli standard PKIX sono le seguenti: z z z TrustAnchor - rappresenta una "most "most--trusted" trusted" CA usata come root nella validazione di certification paths (non modificabile e threadthread-safe) safe) PKIXParameters - specifica il set di parametri di ingresso per l'algoritmo PKIX di validazione di certification paths PKIXCertPathValidatorResult - rappresenta il risultato di una validazione z PolicyNode - interfaccia che rappresenta un nodo di un albero di policy risultante da un algoritmo di validazione eseguito con successo PolicyQualifierInfo - rappesenta il policy qualifier contenuto nella Certificate Policy Extension del certificato a cui la policy fa riferimento PKIXBuilderParameters - specifica il set di parametri di ingresso per l'algoritmo PKIX di costruzione di certification paths PKIXCertPathBuilderResult - rappresenta il risultato di una costruzione z PKIXCertPathChecker - permette di eseguire controlli su certificati X.509 X.509 z z z 74 CertPath Architecture APPLICAZIONI API Java Certification Path CertificateFactory CertPath CertPathParameters CertPathValidatorResult CertPathBuilderResult CertStoreParameters LDAPCertStoreParameters CollectionCertStoreParameters X509CertSelector X509CRLEntry CORE CertPathValidator CertPathBuilder CertStore CertSelector CRLSelector X509Certificate X509CRL X509CRLSelector PKIX TrustAnchor PKIXParameters PKIXCertPathValidatorResult PolicyNode PolicyQualifierInfo PKIXBuilderParameters PKIXCertPathBuilderResult PKIXCertPathChecker SPI X.509 Provider PKIX Provider 75 Certificati digitali Un certificato digitale è la garanzia fornita da una terza parte che una chiave pubblica appartiene al suo proprietario ¾ Questa terza parte è detta Certification Authority (CA) ¾ Le due CA più note sono Verisign e Thawte (in realtà una filiale di Verisign) z Per l’ l’elenco dei certificatori attivi in Italia visitare il sito del Centro Nazionale per l’ l’Informatica nella Pubblica Amministrazione (www.cnipa.gov.it (www.cnipa.gov.it)) ¾ La CA certifica una chiave pubblica firmandola con la sua chiave privata ¾ Per default, il JDK utilizza i certificati X.509: z z z z Sono gli standard maggiormente utilizzati per i certificati digitali. digitali. Sono definiti in RFC 2459 reperibile all’ /rfc2459.txt.. all’indirizzo www.ietf.org/rfc www.ietf.org/rfc/rfc2459.txt Esistono 3 versioni di X.509 X.509:: v1,v2 e v3. v2 e v3 aggiungono ai certificati alcune informazioni supplementari 76 Contenuto dei certificati ¾ Certificato X.509 v1: z Versione • definisce la versione del certificato: v1,v2,v3 z Numero seriale del certificato • intero univoco che identifica la CA che emette il certificato z Identificatore dell’ dell’algoritmo di firma • definisce l’ l’algoritmo di firma usato dalla CA z Periodo di validità validità • definisce il periodo di tempo per cui è valido il certificato. • si usano 2 date: non prima e non dopo • il certificato è valido solo nell’ nell’intervallo z Soggetto • indica a chi è stato emesso il certificato • i soggetti sono memorizzati con nomi X.500 X.500 z z Chiave pubblica del soggetto Firma dell’ dell’Autorità Autorità di certificazione 77 Esempio in Windows 78 Stampa di un certificato DER Il certificato deve essere in formato DER (Distinguished Encoding Rules) ules) (estensione .cer) .cer) Un solo certificato per file import java.io.*; java.io.*; import java.security.cert.*; java.security.cert.*; ..... Occorre aprire il String nameCert = “File_Certificate.cer"; File_Certificate.cer"; relativo file ed FileInputStream fis = new FileInputStream( FileInputStream(nameCert); nameCert); istanziare un CertificateFactory cf = CertificateFactory.getInstance ("X X.509"); CertificateFactory.getInstance(" .509"); certificato con X509Certificate x509cert = (X509Certificate (X509Certificate))cf.generateCertificate( cf.generateCertificate(fis); fis); CertificateFactory System.out.println ("\\nInformazioni reperite dal certificato: “ +nameCert+"\ System.out.println(" +nameCert+"\n"); inizializzato allo standard X.509 ("tipo tipo = " + x509cert.getType()); System.out.println System.out.println(" generateCertificate() generateCertificate() System.out.println ("versione versione = " + x509cert.getVersion()); System.out.println(" richiede un cast System.out.println(" soggetto = " + x509cert.getSubjectDN().getName ()); System.out.println("soggetto x509cert.getSubjectDN().getName()); perchè perchè restituisce System.out.println ("inizio inizio validità System.out.println(" validità = " + x509cert.getNotBefore()); un Certificate System.out.println .out.println(" ("fine fine validità System validità = " + x509cert.getNotAfter()); System.out.println ("numero numero di serie = " + x509cert.getSerialNumber().toString (16)); System.out.println(" x509cert.getSerialNumber().toString(16)); System.out.println ("emettitore emettitore = " + x509cert.getIssuerDN().getName ()); System.out.println(" x509cert.getIssuerDN().getName()); System.out.println .out.println(" ("algoritmo algoritmo di firma = " + x509cert.getSigAlgName()); System algoritmo per la chiave pubblica = " + System.out.println ("algoritmo System.out.println(" x509cert.getPublicKey().getAlgorithm ()); x509cert.getPublicKey().getAlgorithm()); fis.close(); (); fis.close ..... 79 Certificate Revocation List (CRL) import java.io.*; java.io.*; import java.security.cert.*; java.security.cert.*; ..... Il file deve contenere una CRL (estensione .crl) .crl) String nameCRL = “File_CRL.crl"; File_CRL.crl"; String nameCert = “File_Certificate.cer"; File_Certificate.cer"; FileInputStream inCRL = new FileInputStream( FileInputStream(nameCRL); nameCRL); FileInputStream inCert = new FileInputStream( FileInputStream(nameCert); nameCert); Creazione di una CRL di X.509 CertificateFactory cf = CertificateFactory.getInstance ("X X.509"); CertificateFactory.getInstance(" .509"); X509CRL crl = (X509CRL inCRL); (X509CRL))cf.generateCRL( cf.generateCRL(inCRL); Certificate certificate = cf.generateCertificate( cf.generateCertificate(inCert); inCert); inCRL.close(); inCRL.close(); inCert.close(); inCert.close(); Verifica del cetificato attraverso il metodo isRevoked() isRevoked() if (crl.isRevoked(certificate)) ("Il Il certificato è stato revocato!"); crl.isRevoked(certificate)) System.out.println System.out.println(" revocato!"); else System.out.println ("Il Il certificato "+nameCert+" e' ok! System.out.println(" ok!"); ..... 80 Esempio di Certification Path ¾ CertPath Root della Digital Signature Trust (DST Root Cert.p7b): 81 Stampa di un certification path import java.io.*; java.io.*; import java.security.cert.*; java.security.cert.*; import java.util.Collection; java.util.Collection; import java.util.Iterator; java.util.Iterator; ..... String nameCert = “File_Certificates.p7b"; File_Certificates.p7b"; Il file deve contenere una catena di certificati in formato PKCS#7 (estensione .p7b) .p7b) o una sequenza di certificati di formato DER (estensione .cer) .cer) FileInputStream fis = new FileInputStream( FileInputStream(nameCert); nameCert); CertificateFactory cf = CertificateFactory.getInstance ("X X.509"); CertificateFactory.getInstance(" .509"); Collection c = cf.generateCertificates( cf.generateCertificates(fis); fis); Iterator per navigare Iterator it = c.iterator(); c.iterator(); all’ all’interno della int j = 1; collezione di certificati while (it.hasNext()) it.hasNext()) { System.out.println ("certificato certificato N°."+j+ ": System.out.println(" ": "); X509Certificate x509cert = (X509Certificate (X509Certificate))it.next(); it.next(); System.out.println (x509cert); System.out.println(x509cert); j++; Stampa a video usando la } toString() toString() di X509Certificate fis.close(); fis.close(); ..... Tutto funziona correttamente solo se l’ l’InputStream utilizzato supporta i metodi mark() mark() e reset() In caso contrario generateCertificates() ,che si avvale generateCertificates(),che di tali metodi, consumerà consumerà tutto lo stream di ingresso in un colpo solo I vari certificati vengono inseriti in una Collection 82 Schema di Validazione Java Certification Path Issuer: Issuer: CA2 Issuer: Issuer: CA1 Subject: Subject: Bob Subject: Subject: CA2 Bob Public Key CA2 Public Key CertificateFactory VALID CertPathValidator INVALID PKIX Provider Trust Anchor KeyStore CRLs CertStore X.509 Provider 83 Processo di validazione Istanziaziare un TrustAnchor import java.security.cert.*; java.security.cert.*; da un certificato root ..... TrustAnchor anchor = new TrustAnchor( TrustAnchor(“DST Root CA X1.cer” X1.cer”, null); null); Set anchors = Collections.singleton Collections.singleton((anchor); anchor); PKIXParameters params = new PKIXParameters( PKIXParameters(anchors); anchors); params.setRevocationEnabled(false); params.setRevocationEnabled(false); Inserire le informazioni contenute nel TrustAnchor in un PKIXParameters Indicare se usare un PKIX Revocation Checking Mechanism (in tal caso occorrerà occorrerà specificare una CRL ed un PKIXCertPathChecker) PKIXCertPathChecker) CertificateFactory cf = CertificateFactory.getInstance ("X X.509"); CertificateFactory.getInstance(" .509"); FileInputStream inCertPath = new FileInputStream( Cert.p7b”); FileInputStream(“DST Root Cert.p7b” CertPath co = cf.generateCertPath( cf.generateCertPath(inCertPath); inCertPath); Istanziare il CertPath da validare CertPathValidator cpv = CertPathValidator.getInstance ("PKIX PKIX"); "); CertPathValidator.getInstance(" CertPathValidatorResult cpvr = cpv.validate( cpv.validate(cp, cp, params); params); ..... Eseguire la validazione attraverso un CertPathValidator 84 JGSS Java Generic Security Service 85 Caratteristiche ¾ ¾ ¾ ¾ Java Generic Security Service (JGSS) contiene le Java bindings per la Generic Security Services Application Program Interface (GSS-API) Le GSS-API sono state progettate dal Common Authentication Technology working group dell'IETF per offrire un accesso uniforme a servizi di autenticazione e comunicazione peer-to-peer che adottano meccanismi di sicurezza sottostanti, isolando il chiamante dai dettagli implementativi Tali meccanismi di sicurezza possono essere impiegati in maniera simultanea e selezionati dall'applicazione a tempo di esecuzione Le GSS-API offrono i seguenti servizi di sicurezza: z z z z z autenticazione riservatezza ed integrità integrità dei messaggi sequencing dei messaggi protetti replay detection credential delegation 86 Meccanismi di sicurezza ¾ IETF ha definito i seguenti due meccanismi di sicurezza: z z ¾ Kerberos v5 Simple Public Key Mechanism (SPKM) Altra tecnologia utilizzata è DCE (Distributed Computing Environment) APPLICAZIONE CLIENT APPLICAZIONE SERVER GSSGSS-API FRAMEWORK GSSGSS-API FRAMEWORK Kerberos Mechanism SPKM Mechanism Kerberos Mechanism SPKM Mechanism DCE Mechanism DCE Mechanism 87 Kerberos v5 in JGSS ¾ ¾ JGSS offre la possibilità di implementare il servizio Kerberos v5 con l’ausilio dei meccanismi offerti da JAAS Classi principali in JGSS: z z z z z la classe GSSManager conosce i componenti e i meccanismi di sicurezza sottostanti ed è responsabile della loro invocazione a runrun-time la classe Oid rappresenta l’ l’Universal Object Identifier l'interfaccia GSSName rappresenta una entità entità generica da instanziare e permette di definire l'user l'user duke del servizio sicuro implementato l'interfaccia GSSCredential incapsula le credentials possedute da un'entità un'entità l'interfaccia GSSContext permette di definire i servizi di sicurezza offerti alle applicazioni comunicanti Meccanismi di sicurezza GSSManager Oid GSSName GSSContext GSSCredential Applicazione GSSGSS-API Framework 88 Kerberos v5 in JAAS ¾ JAAS mette a disposizione degli sviluppatori il modulo di autenticazione Krb5LoginModule e le classi del package javax.security.auth.kerberos: z z z z z DelegationPermission - usata per limitare l'uso del Kerberos delegation model (forwardable and proxiable tickets) tickets) KerberosKey - incapsula un segreto a lungo termine per un Kerberos principal KerberosPrincipal - incapsula un Kerberos principal KerberosTicket - incapsula un Kerberos ticket e le informazioni ad esso associate dal punto di vista del cliente. Racchiude tutte le informazioni informazioni che il Key Distribution Center (KDC) invia al client nel messaggio di risposta KDCKDC-REP definito in Kerberos Protocol Specification (RFC 1510) 1510) ServicePermission - usata per proteggere i servizi Kerberos e le credenziali necessarie per accedere a questi servizi. Contiene un service principal name e una lista di operazioni che specificano il contesto in cui le credenziali credenziali possono essere usate 89 JGSS vs JSSE ¾ JGSS e JSSE presentano alcune analogie in termini di strumenti per comunicazioni sicure peer-to-peer ¾ Sono accomunati dalle seguenti caratteristiche di sicurezza: z z ¾ autenticazione client/server client/server protezione della riservatezza e dell’ dell’integrità integrità dei dati trasmessi Si differenziano per i seguenti aspetti: z z z z z Kerberos Single SignSign-On Support Communications API Credential Delegation Selective Encryption Protocol Requirements ( When to use Java GSSGSS-API vs. JSSE ) 90 Kerberos v5 in J2SE APPLICAZIONI JAAS javax.security.auth JGSS org.ietf.jgss JSSE javax.net.ssl KRB5 LoginModule KRB5 Mechanism KRB5 CipherSuite KRB5 Implementation Credentials Cache JCA & JCE 91 Autenticazione ¾ ¾ Prima che un GSSContext possa essere usato per i servizi di sicurezza offerti, occorre realizzare uno scambio di token per l'autenticazione tra le applicazioni comunicanti GSSContext offre i metodi necessari a tale scambio: z z ¾ initSecContext() - invia il token all'applicazione paritaria acceptSecContext() - riceve il token Autenticazione in Kerberos V5: z z z z Il client per primo invia il token costruito con initSecContext() initSecContext() contenente il messaggio APAP-REQ di Kerberos Il provider Kerberos ottiene dal TGT (Kerberos (Kerberos Ticket) del client un ticket di servizio per il target server, che viene cifrato ed inserito nel messaggio Il server riceve il token e lo decifra con il metodo acceptSecContext() che autentica il client generando un nuovo token In caso di autenticazione mutua, il nuovo token viene adoperato per l'autenticazione del server e rispedito al client con initSecContext() initSecContext() 92 Protezione dei messaggi ¾ ¾ Il contesto sicuro stabilito (GSSContext) offre protezione delle comunicazioni mediante riservatezza ed integrità dei messaggi I metodi relativi sono: z z ¾ wrap() - permette di incapsulare il testo in chiaro o cifrato in un token che ne protegge l'integrità l'integrità, da inviare all'applicazione paritaria unwrap() - rimette in chiaro il testo originario dal token ricevuto L'oggetto trasmesso contiene informazioni sul testo originario (se in chiaro o cifrato) e relativi warnings per il controllo del sequencing e della duplicazione dei messaggi 93 Credential Delegation ¾ ¾ ¾ Java GSS-API aiuta il client a comunicare in maniera sicura le proprie credenziali al server e realizzare un nuovo contesto sicuro Nel caso di Kerberos V5, le credenziali delegate sono rappresentate da un forwarded TGT incapsulato nel primo token spedito dal client al server Usando questo TGT il server può ottenere un ticket service legato al client per alcuni altri servizi Client Delegates credentials of user duke Gateway Backend Server ENTERPRISE NETWORK 94 Default Credential Acquisition Model Invocazione del metodo di login del modulo JAAS Kbr5LoginModule Krb5LoginModule ottiene un TGT per il client dal KDC o da una cache preesistente e lo memorizza nel private credentials set del Subject. Subject. Sul lato server Kbr5LoginModule memorizza nel Subject, Subject, accanto al KerberosTicket, KerberosTicket, una KerberosKey per il server, adoperata nei passi 55-6-7 per decifrare il ticket service che il client invia Il client riceve il Subject popolato e invoca il metodo Subject.doAs() Subject.doAs() o il metodo Subject.doAsPrivileged() Subject.doAsPrivileged() per inserire il Subject nel contesto di controllo d'accesso del thread ClientAction in esecuzione ClientAction invoca il metodo GSSContext.createCredential() GSSContext.createCredential() passando il Kerberos V5 OID (unique object identifier) identifier) in desiredMechs GSSContext.createCredential() GSSContext.createCredential() invoca il provider di Kerberos V5 richiedendo una Kerberos credential per iniziare un contesto sicuro Il provider ottiene il Subject dal corrente contesto di controllo degli accessi e ricerca il suo suo private credential set per un valido KerberosTicket (TGT) per l'utente Il KerberosTicket viene fornito al GSSManager che lo memorizza in un GSSCredential da restituire al chiamante 95 PKCS Public Key Cryptography Standards 96 Public Key Cryptography Standards (PKCS) ¾ ¾ ¾ ¾ Le specifiche PKCS sono state prodotte dagli RSA Laboratories con lo scopo di accelerare lo sviluppo della crittografia a chiave pubblica Pubblicate nel 1991, sono state largamente implementate ed integrate in molti standard de facto, come ANSI X9, PKIX, SET, S/MIME e SSL JCA e JCE implementano gli standards PKCS #1, #5, #7, #8, #9, #10 e #12 J2SDK 1.4 Beta 3 include un miglior supporto per gli standard PKCS 1.0 con un set di APIs contenuto in JSR (Java Specification Request) 74: javax.security.pkcs.pkcs1 javax.security.pkcs.pkcs7 javax.security.pkcs.pkcs9 javax.security.pkcs.pkcs12 ¾ javax.security.pkcs.pkcs5 javax.security.pkcs.pkcs8 javax.security.pkcs.pkcs10 La versione PKCS 2.1 presenta diversi miglioramenti che saranno implementati ed aggiunti in JSR 74 nel corrente anno 97 PKCS Architecture APPLICAZIONI • PKCS #1 – RSA Cryptography Standard • PKCS #5 – PasswordPassword-Based Cryptography Standard • PKCS #7 – Cryptographic Message Syntax • PKCS #8 – PrivatePrivate-Key Information Syntax • PKCS #9 – Selected Attributes Types • PKCS #10 – Certificate Request Syntax • PKCS #12 – Personal Information Exchange Syntax JCA & JCE PKCS #2 - incorporato in PKCS #1 PKCS #3 - DiffieDiffie-Hellman Key Agreement Standard PKCS #4 - incorporato in PKCS #1 PKCS #6 - ExtendedExtended-Certificate Syntax Standard PKCS #11 - Cryptographic Token Interface Standard PKCS #13 - Elliptic Curve Cryptography Standard PKCS #15 - Cryptographic Token Information Format Standard 98 Java Keytool Key and Certificate Management Tool Key Pair Generating ¾ Generazione di una coppia di chiavi asimmetriche e inserimento dei dati identificativi dell'utente: keytool -genkey -keystore keystore -keyalg rsa –keysize 1024 -alias mauz -validity 180 Immettere la password del keystore: keystore: 20Colleluori03Maurizio1980 Specificare nome e cognome [Unknown]: Maurizio Colleluori Specificare il nome dell’ ]: MM dell’unità unità aziendale [Unknown [Unknown]: Specificare il nome dell’ dell’azienda [Unknown]: Mauz Specificare la località località [Unknown]: Bologna Specificare la provincia [Unknown]: Bologna Specificare il codice a due lettere del apese in cui si trova l’ l’unità unità [Unknown]: IT Il dato CN=Maurizio Colleluori, MM, O=Mauz, L=Bologna, ST=Bologna, ST=Bologna, C=IT è corretto? [no]: si Immettere la password della chiave per <mauz> (INVIO se corrisponde alla password del keystore): keystore): 20031980 Le chiavi private hanno associato un certificato che autentica le le corrispondenti chiavi pubbliche L’accesso ad un keystore è protetto da una password definita al momento della sua creazione creazione Si può decidere di proteggere la chiave privata con una password differente differente 100 Certificate Signing Request ¾ Produzione della richiesta di certificato (Certificate Signing Request) auto-firma del certificato provvisorio con la chiave privata: keytool -certreq -keystore keystore -file csr.txt -alias mauz Immettere la password del keystore: keystore: 20Colleluori03Maurizio1980 Immettere la password della chiave per <mauz>: 20031980 Richiesta per ogni accesso al keystore! File csr.txt Richiesta per -----BEGIN -----BEGIN NEW CERTIFICATE REQUEST----REQUEST----ogni accesso alla MIIBqzCCARQCAQAwazELMAkGA1UEBhMCSVQxEDAOBgNVBAgTB0JvbG9nbmExEDAOBgNVBAcTB0Jv MIIBqzCCARQCAQAwazELMAkGA1UEBhMCSVQxEDAOBgNVBAgTB0JvbG9nbmExEDAO chiave segreta!BgNVBAcTB0Jv bG9nbmExDTALBgNVBAoTBE1hdXoxCzAJBgNVBAsTAk1NMRwwGgYDVQQDExNNYXVyaXppbyBDb2xs bG9nbmExDTALBgNVBAoTBE1hdXoxCzAJBgNVBAsTAk1NMRwwGgYDVQQDExNNYXVyaXppbyBDb2xs ZWx1b3JpMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD0qUrx5YEOwgHlufHMmB1QEJ4FQj4d ZWx1b3JpMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD0qUrx5YEOwgHlufHMmB1QEJ4FQj4d 0kY4JVPzXNBTByYis9QXLDyKL9nFso8/qMxMesu0UAEKZJsLvNX8vOMv7dcudsfuLzWXqrbvyiC1 0kY4JVPzXNBTByYis9QXLDyKL9nFso8/qMxMesu0UAEKZJsLvNX8vOMv7dcudsfuLzWXqrbvyiC1 Q5wxtXdYi3Rx5l7txAbbbVcpj9BMX6lLOz7wpxcmJzv/Y7gVlo5aclnfpOQopzxRewIDAQABoAAw Q5wxtXdYi3Rx5l7txAbbbVcpj9BMX6lLOz7wpxcmJzv/Y7gVlo5aclnfpOQopzxRewIDAQABoAAw DQYJKoZIhvcNAQEEBQADgYEA1hDqkWAttZEzNHAEncUodsUr0Ak8pfKhhw+BL4gmOkPo78jdqCaP DQYJKoZIhvcNAQEEBQADgYEA1hDqkWAttZEzNHAEncUodsUr0Ak8pfKhhw+BL4gmOkPo78jdqCaP o1QIsX6KOB0X9s/+2MbWH3nVlVZP4HyQ8bv8xbDs6cY3m+adN7I01+7UHIiWqIUV2WKKmBGZSaQ+ o1QIsX6KOB0X9s/+2MbWH3nVlVZP4HyQ8bv8xbDs6cY3m+adN7I01+7UHIiWqIUV2WKKmBGZSaQ+ gPNM/oV7dMZcH8mXr9zQObPqcHKqBDNjqtQC0IhE21o= gPNM/oV7dMZcH8mXr9zQObPqcHKqBDNjqtQC0IhE21o= -----END -----END NEW CERTIFICATE REQUEST----REQUEST----- 101 Self Certificate ¾ Generare un certificato X.509 auto-firmato: keytool -selfcert -keystore keystore -keyalg rsa –keysize 1024 -alias mauz -validity 180 102 Altre funzionalità ¾ Download del certificato firmato dalla CA (estensione .cer secondo il formato PKCS7) e aggiornamento del certificato provvisorio auto-fimato: keytool -import -keystore keystore -file file.cer file.cer -alias mauz ¾ Esportazione di un certificato in un file esterno: keytool -import -keystore keystore -file file.cer file.cer -alias mauz ¾ Visualizzazione di una entry del keystore: keytool -list -keystore keystore -alias mauz ¾ Lettura di un file.cer: keytool -printcert -file file.cer file.cer ¾ Altre utilità: keytool -keyclone ... keytool -storepasswd ... keytool -keypasswd ... keytool -delete ... clonazione di una entry del keystore modifica della password del keystore modifica della password della chiave privata cancellazione di una entry del keystore 103 Java Security Roadmap 104 Java Security Roadmap APPLICATIONS - TOOLS - GUI java.security java.security CertPath JSSE JGSS JAAS Provider Provider PKCS JCA / JCE Framework Provider Provider 105 Riferimenti 106 Java General Security ¾ http://java.sun.com/j2se/1.4.1/docs/guide/security/ z General Security • • • • • • • • Security Architecture Cryptography Architecture How to Implement a Provider for the Java Cryptography Architecture Architecture Policy Permissions Default Policy Implementation and Policy File Syntax API for Privileged Blocks X.509 Certificates and Certificate Revocation Lists Security Managers and the JavaTM 2 SDK 107 Java Security Features ¾ http://java.sun.com/j2se/1.4.1/docs/guide/security/ z JCE • JCE Reference Guide • How to Implement a Provider for the Java Cryptography Extension z JSSE • JSSE Reference Guide z JAAS • • • • z JAAS Reference Guide JAAS Tutorials. Tutorials. JAAS white paper JAAS LoginModule Developer's Developer's Guide Certification Path • Java Certification Path API Programmer's Programmer's Guide z Java GSSGSS-API • Java GSSGSS-API and JAAS Tutorials for Use with Kerberos. Kerberos. • Single SignSign-on Using Kerberos in Java z Tools • Security Tools 108 Applicazioni ¾ JSSE z z z z ¾ JAAS z ¾ RMI – SOCKETS – URLS http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/samples/index.html http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/samples/index.html SSL CLIENT / SERVER http://www.javaworld.com/javaworld /jw--05http://www.javaworld.com/javaworld/jw 05-2001/jw2001/jw-05110511-howto.html HTTPS http://www.javaworld.com/javaworld http://www.javaworld.com/javaworld//javatips/jw javatips/jw--javatip111.html SECURE MAIL http://www.javaworld.com/javaworld/javatips/jwhttp://www.javaworld.com/javaworld/javatips/jw-javatip115.html http://www.javaworld.com/javaworld/jwhttp://www.javaworld.com/javaworld/jw-0909-2002/jw2002/jw-09130913-jaas.html Keytool z http://java.sun.com docs//tooldocs/win32/ keytool.html http://java.sun.com//products/ products/jdk/1.2/ jdk/1.2/docs tooldocs/win32/keytool.html 109 Standards ¾ Public Key Cryptography Standards (PKCS) http://www.rsasecurity.com/rsalabs/pkcs http://www.rsasecurity.com/rsalabs/pkcs// ¾ Java Specification Request (JSR) 74 http://www.jcp.org/en/jsr/detail ?id=74 http://www.jcp.org/en/jsr/detail?id=74 110 Conferenze ¾ http://java.sun.com/security/ z JavaOne 2002 Presentations (PDF documents) documents) Sessions: Sessions: • • • • • • • z Java 2 Platform, Standard Edition (J2SE) Security: Present and Future Authentication and Single SignSign-On Networking with Java 2 Platform, Standard Edition (J2SE): Present and Future Single SignSign-on Using the JAAS and Java GSS APIs Securing the Wire Java Naming and Directory Interface (JNDI) JSR 105: XML Digital Signature API JavaOne 2001 Presentations (PDF documents) documents) • • • • • • • Java 2 Platform, Standard Edition (J2SE) Security: Security: Present and Future Security for the J2SE: CertPath, CertPath, JCE, and JSSE Java 2 Platform, Standard Edition (J2SE) Networking: Networking: Present and Future Java 2 Platform, Platform, Standard Edition (J2SE ) Networking and IPv6 Unlocking Public Key Technologies for the Java Platform Update: Update: JSR74 Security for the J2SE Platform: Platform: JAAS, Java GSSGSS-API & Kerberos Security for the Java 2 Platform, Platform, Standard Edition (J2SE) and XML 111 Articoli ¾ http://java.sun.com/security/ z FAQs, Whitepapers, Articles • Single SignSign-on Using Kerberos in Java • JAAS white paper • Going Beyond the Sandbox: An Overview of the New Security Architecture Architecture in the JavaTM Development Kit 1.2 • Secure Computing With Java: Now and the Future • CompCon 97 Abstract • Applet Security FAQ 112