Seguretat i criptografia - Aplicacions Java segures a Internet PDF

Summary

Aquesta presentació de DAM2, Curs 24/25 Sessió 5 del 22 d'octubre de 2024, tracta sobre la seguretat i la criptografia en aplicacions Java a Internet. Explica aspectes com la plataforma Java, les connexions segures i la gestió personalitzada de la informació criptogràfica.

Full Transcript

22 d’octubre de 2024 Sessió 5 AM2 M9 curs 24/25 Carles Franquesa El rol d’Internet és increïblement important en el desenvolupament d’aplicacions en UF1 Java. Aquest fet es fa molt evident només observant el boom de les aplicacions Seguret...

22 d’octubre de 2024 Sessió 5 AM2 M9 curs 24/25 Carles Franquesa El rol d’Internet és increïblement important en el desenvolupament d’aplicacions en UF1 Java. Aquest fet es fa molt evident només observant el boom de les aplicacions Seguretat i mòbils, si bé tampoc cal oblidar-se de les aplicacions d’escriptori. Per una banda, la xarxa de xarxes s’ha convertit en un canal de distribució ideal per aplicacions i biblioteques de classes. Aquest escenari s’aplica tant si sou algú que criptografia simplement vol baixar-se un joc o un desenvolupador que no vol haver de reinventar la roda i simplement desitja aprofitar un conjunt de classes que algú altre ha fet i ha publicat a Internet, llestes per ser descarregades. Ara bé, és segur executar en el vostre ordinador, sense la més mínima precaució, un codi que no heu fet vosaltres? Potser estaria bé que existís algun mecanisme per executar codi AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Java aliè en un entorn controlat, monitoritzant els accessos als recursos. D’altra banda, Internet i aquest és el cas segurament més evident, moltes aplicacions es basen actualment en les comunicacions en xarxa a través d’Internet per dur a terme les seves tasques. Aquestes aplicacions també han de garantir la seguretat de les dades intercanviades, però comptant que estan treballant en un entorn de sistemes heterogeni. Per tant, cal garantir la compatibilitat dels protocols emprats. Caldria una biblioteca que simplifiqui tot aquest procés, sense haver d’executar segures a a ci on s J a va 2. A p l i c Inte rn e t 2.1 Seguretat a la plataforma Java 2.1.1 El gestor de seguretat 2.1.2 Assignació de permisos 2.1.3 Codi signat AM2 M9 curs 24/25 Carles Franquesa 2.2 Connexions segures 2.2.1 La negociació SSL 2.2.2 Connexions SSL amb Java 2.2.3 Gestió personalitzada de la informació criptogràfica 2.1 AM2 M9 curs 24/25 Carles Franquesa Seguretat a la plataforma Jav 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java El llenguatge bytecode és el resultant d’una compilació de Java, que ha de ser interpretat per l’interpret de la JVM. El benefici més evident d’usar un llenguatge Les contrapartides són interpretat és poder que cal una configuració executar aplicacions en prèvia del sistema entorns heterogenis, de abans no es pot manera que les aplicacions executar cap programa i AM2 M9 curs 24/25 Carles Franquesa siguin multi-plataforma. que les aplicacions són menys eficients en l’ús Mentre l’entorn d’execució de recursos i velocitat estigui instal·lat a l’equip, d’execució, ja que el no importa el seu sistema codi no s’executa operatiu o model de directament sobre el processador. maquinari. 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java tecode Controlant l’accés a classes concretes y el bL’intèrpret, s d a més, ajuda a la seguretat cose Analitzant el bytecode, i modificant-lo si cal sandbox Una capsa de sorra, un entorn controlat AM2 M9 curs 24/25 Carles Franquesa on poder jugar. La capsa de sorra del Java (o sandbox) és com s’anomena popularment l’entorn controlat en el qual es s’executen les aplicacions fetes en aquest llenguatge, de manera que sigui possible restringir certes accions, 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.1 El gestor de seguretat Un gestor de seguretat, o security manager en anglès, és una classe mitjançant la qual es pot establir una política de seguretat sobre una aplicació quan s’executa. O sigui, indicar quin és el conjunt d’accions que té permès, java o no, dur a terme −Djava.security.manager=NomGestor [altres opcions] nomAplicacio AM2 M9 curs 24/25 Carles Franquesa Alerta! El gestor de seguretat de Java desapareix en les darreres versions (> 18) 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.1 El gestor de seguretat exercici a) Creeu un arxiu test.txt en la carpeta d’exercicis d’aquesta UF. b) Feu un programa en Java, TestAccesFitxer, que llegeixi un fitxer situat a la carpeta de treball anomenant-lo test.txt. c) Executeu-lo. Quin resultat obteniu? d) Modifiqueu la carpeta de treball en les propietats d’execució del AM2 M9 curs 24/25 Carles Franquesa projecte. e) Torneu-lo a executar. Quin resultat obteniu? f) Declareu que voleu usar el gestor de seguretat. g) Torneu-lo a executar. Quin resultat obteniu? 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.1 El gestor de seguretat soluci óa) Creeu un arxiu test.txt en la carpeta d’exercicis d’aquesta UF. C:\exercicis\DAM2\M9\UF1\echo hola > test.txt b) Feu un programa en Java, TestAccesFitxer, que llegeixi un fitxer situat a la carpeta de treball anomenant-lo test.txt. package testaccesfitxer; import java.io.File; import java.io.FileInputStream; public class TestAccesFitxer { public static void main(String[] args) throws Exception { AM2 M9 curs 24/25 Carles Franquesa File f = new File("test.txt"); try (FileInputStream in = new FileInputStream(f)) { in.read(); } } } c) Executeu-lo. Quin resultat obteniu? Exception in thread "main" java.io.FileNotFoundException: test.txt (El sistema no puede encontrar el archivo especificado) 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.1 El gestor de seguretat soluci ó d) Modifiqueu la carpeta de treball en les propietats d’execució del projecte. e) Torneu-lo a executar. Quin resultat obteniu? BUILD SUCCESSFUL (total time: 0 seconds) f) Declareu que voleu usar el gestor de seguretat. AM2 M9 curs 24/25 Carles Franquesa g) Torneu-lo a executar. Quin resultat obteniu? Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "test.txt" "read") 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos Un fitxer de polítiques, o policy file en anglès, serveix per poder permetre accions a les aplicacions..java.policy és el fitxer per defecte, en el home de l’usuari.. java −Djava.security.manager −Djava.security.policy==rutaFitxer nomAplicac exemple de contingut grant { AM2 M9 curs 24/25 Carles Franquesa // Permet lectura i escriptura a qualsevol fitxer del sistema permission java.io.FilePermission "", "read,write"; // Permet connexió a qualsevol host i port permission java.net.SocketPermission "*:1024-", "connect,resolve"; // Permet lectura de propietats del sistema permission java.util.PropertyPermission "*", "read"; }; 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos Policytool Editor GUI de fitxers de policy. Ideal, ja que el domini de cada paràmetre depèn del valor del parameter anterior. AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos Tipus de permisos Cada tipus de permís es correspon amb la classe concreta que implementa les seves accions. AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos Valors del nom del target (recurs controlat) Els valors de l’objectiu (recurs controlat) varien molt entre tipus de permisos. Les accions associades a cada objectiu depenen fortament de l’objectiu en qüestió. Permés Tipus obtenirhabituals informació sobre cada cas particular cal consultar el manual. java.io.FilePermission Controla l’accés al Sistema de fitxers. L’objectiu és la ruta de la rel on es volen definir, sigui relativa o absoluta. La constant vol dir que donem permisos a tots els arxius del AM2 M9 curs 24/25 Carles Franquesa sistema. read accions possibles write execut delet e e 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.FilePermission exercici a) Feu un programa en Java, TestFilePermission, que llegeixi el fitxer situat a la ruta absoluta C:\exercicis\DAM2\M9\UF1\test.txt. b) Executeu-lo. Quin resultat obteniu? c) Establiu l’ús d’un gestor de seguretat. d) Executeu-lo. Quin resultat obteniu? AM2 M9 curs 24/25 Carles Franquesa e) Creeu un arxiu de polítiques de seguretat que permeti la lectura de tots els arxius del sistema. Anomeneu-lo test.policy i situeu-lo a la carpeta del projecte. f) Establiu l’ús d’aquest arxiu. g) Torneu-lo a executar. Quin resultat obteniu? 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.FilePermission soluci ó a) Feu un programa en Java, TestFilePermission, que llegeixi el fitxer situat a la ruta absoluta C:\exercicis\dam2\m9\uf1\test.txt. public class TestFilePermission { public static void main(String[] args) throws Exception { File f = new File ("C:\\exercicis\\dam2\\m9\\uf1\\test.txt"); try (FileInputStream in = new FileInputStream(f)) { in.read(); } } AM2 M9 curs 24/25 Carles Franquesa } b) Executeu-lo. Quin resultat obteniu? BUILD SUCCESSFUL (total time: 0 seconds) c) Establiu l’ús d’un gestor de seguretat. 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.FilePermission soluci ód) Executeu-lo. Quin resultat obteniu? Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\exercicis\dam2\m9\uf1\test.txt" "read") e) Creeu un arxiu de polítiques de seguretat que permeti la lectura de tots els arxius del sistema. Anomeneu-lo test.policy i situeu-lo a la carpeta del projecte. AM2 M9 curs 24/25 Carles Franquesa f) Establiu l’ús d’aquest arxiu. g) Torneu-lo a executar. Quin resultat obteniu? BUILD SUCCESSFUL (total time: 0 seconds) 29 d’octubre de 2024 Sessió 6 AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.FilePermission Un sòcol, socket en anglès, és un mecanisme per que processos de diferents màquines en una mateixa xarxa, inclús internet, es puguin comunicar. En Java, hi ha dues classes relacionades amb els sockets: ServerSocket i Socket. Feu dos nous projectes, TestServerSockets, i TestClientSockets. Poseu-hi el codi següent: public class TestServerSockets { public static void main(String[] args) throws IOException { public class TestClientSockets { // Crea el servidor que escolta el port 1234 public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(1234); // Conecta al servidor a la IP local (localhost) System.out.println("Servidor esperant connexions..."); // i port 1234 Socket socket = new Socket("localhost", 1234); // Accepta connexió d'un client OutputStream os = socket.getOutputStream(); AM2 M9 curs 24/25 Carles Franquesa Socket clientSocket = serverSocket.accept(); PrintWriter out = new PrintWriter(os, true); System.out.println("Connexió acceptada!"); // Envia un missatge al servidor // Llegeix missatges del client out.println("Hola, servidor!"); InputStream is = clientSocket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); // Tanca la connexió BufferedReader in = new BufferedReader(isr); out.close(); String message = in.readLine(); socket.close(); System.out.println("Missatge del client: " + message); }} // Tanca la connexió in.close(); a) Executeu-los en els dos ordres possibles. clientSocket.close(); serverSocket.close(); b) Depureu el server breakpoint a la primera línia. } 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos Tipus més habituals de permisos java.net.SocketPermission Aquest tipus de permís controla les connexions que fa una aplicació a Internet usant sockets. L’objectiu és un nom de domini (o la IP directament) més el rang de ports. La constant * vol dir que donem permisos a tots els equips dins el domini. Les accions possibles es corresponen amb els mètodes de les classes java.net.Socket i java.net.ServerSocket accept AM2 M9 curs 24/25 Carles Franquesa accions possibles connect listen resolve 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.SocketPermission exercici a) Establiu l’ús d’un gestor de seguretat en el projecte TestSockets. b) Executeu-lo. Quin resultat obteniu? c) Creeu un arxiu de polítiques de seguretat, testsockets.policy, a la carpeta del projecte, que permeti l’acceptació de connexions a l’adreça localhost:1234. AM2 M9 curs 24/25 Carles Franquesa d) Establiu l’ús d’aquest arxiu. e) Torneu-lo a executar. Quin resultat obteniu? 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.SocketPermission solució a) Establiu l’ús d’un gestor de seguretat en el projecte TestSockets. b) Executeu-lo. Quin resultat obteniu? Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:1234" "listen,resolve") AM2 M9 curs 24/25 Carles Franquesa c) Creeu un arxiu de polítiques de seguretat , testsockets.policy, a la carpeta del projecte, que permeti l’acceptació de connexions a l’adreça localhost:1234. 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.SocketPermission solució d) Establiu l’ús d’aquest arxiu. -Djava.security.manager -Djava.security.policy==C:\exercicis\DAM2\M9\UF1\TestSockets\src\ testsockets\testsockets.policy e) Torneu-lo a executar. Quin resultat obteniu? AM2 M9 curs 24/25 Carles Franquesa BUILD SUCCESSFUL (total time: 0 seconds) 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos Tipus més habituals de permisos java.net. PropertyPermission Una propietat és una parella Utilitzant el mètode list de la classe Properties, feu un programa, TestProperties, que mostri totes les propietats de sistema del vostre ordinador. public class TestProperties { public static void main(String[] args) { AM2 M9 curs 24/25 Carles Franquesa Properties props = System.getProperties(); props.list(System.out); } read } accions possibles write 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.PropertyPermission exercici a) Establiu l’ús d’un gestor de seguretat en el projecte TestProperties. b) Executeu-lo. Quin resultat obteniu? c) Creeu un arxiu de polítiques de seguretat que permeti l’acceptació de connexions a l’adreça localhost:1234. d) Establiu l’ús d’aquest arxiu. AM2 M9 curs 24/25 Carles Franquesa e) Torneu-lo a executar. Quin resultat obteniu? 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.PropertyPermission solució a) Establiu l’ús d’un gestor de seguretat en el projecte TestProperties. b) Executeu-lo. Quin resultat obteniu? Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "*" "read,write") AM2 M9 curs 24/25 Carles Franquesa c) Creeu un arxiu de polítiques de seguretat , testproperties.policy, a la carpeta del projecte, que permeti la lectura de propietats del sistema. 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.2 Assignació de permisos java.io.PropertyPermission solució d) Establiu l’ús d’aquest arxiu. -Djava.security.manager -Djava.security.policy==C:\exercicis\dam2\m9\uf1\testproperties\src\testproperties\testproperties.p e) Torneu-lo a executar. Quin resultat obteniu? AM2 M9 curs 24/25 Carles Franquesa BUILD SUCCESSFUL (total time: 3 seconds) 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat Qualsevol llibreria de Java pot haver estat alterada maliciosament: Cal signar el codi. Jarsigne r Eina que permet signar digitalment i validar fitxers de biblioteques de classes, JAR. Es proporciona com un executable auxiliar, per línia de comandes, inclòs en totes les versions del Kit de Desenvolupament de Java (JDK) AM2 M9 curs 24/25 Carles Franquesa C:\jarsigner [opcions] nom_biblioteca alias_magatzem_claus gr at ia, e.g. e exempl C:\jarsigner –keystore magatzem_de_claus –signedjar output.jar input.jar clau 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat exercici Signeu l’arxiu rsa.jar que teniu en la carpeta d’exercicis, utilitzant el magatzem de claus que també teniu, amb l’única clau que conté. Deixeu el fitxer resultat, out.jar, en el mateix directori. solució Primer de tot, decidim des d’on emetrem la comanda: C:\exercicis\DAM2\M9\UF1\rsa\RSA\dist. Per tant, obrim una cmd en aquesta carpeta. AM2 M9 curs 24/25 Carles Franquesa Llavors, ens ha de quedar clar on és cada un dels dos arxius d’entrada: 1. L’arxiu jar rsa.jar està al directori C:\exercicis\DAM2\M9\UF1\rsa\RSA\dist\rsa.jar, és a dir, al directori actual. 2. El magatzem magatzem_de_claus.jks està a C:\exercicis\DAM2\M9\UF1\ magatzem_de_claus.jks, per tant, està en el besavi del directori actual,..\..\..\ A més, ens cal saber el nom de la clau. Ho averigüem amb el keytool –list i el magatzem. 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat exercici: Signeu l’arxiu rsa.jar que teniu en la carpeta d’exercicis, utilitzant el magatzem de claus que també teniu, amb l’única clau que conté. Deixeu el fitxer resultat, out.jar, en el mateix directori. solució per recorder el nom de la keytool –list –keystore..\..\..\magatzem_de_claus.jks clau... jarsigner –keystore..\..\..\magatzem_de_claus.jks –signedjar out.jar rsa.jar claus_de_prova AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat Validació mitjançant certificats de confiança Per consultar la signatura d’una llibreria JAR ho fem amb l’opció –verify i el nom de la llibreria. exercici jarsigner −verify out.jar Valideu la signatura que heu fet en l’exercici anterior. AM2 M9 curs 24/25 Carles Franquesa O sigui, el certificat és correcte, però la cadena de confiança no arriba a cap CA. 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat Validació mitjançant certificats de confiança Per poder prendre una decisió d’aquest tipus ell mateix, Java necessita disposar d’una llista d’emissors de certificats que vosaltres considereu de confiança (trusted). Aquesta llista és un magatzem de claus que està a %JAVA_HOME%\lib\security\cacerts, i calen permisos d’administrador per modificar-la. La decisió de quines entitats emissores són o no de confiança, i quins criteris usar per fer-ho, ja és cosa vostra. Amb qualsevol certificat emès per algú dins aquesta llista, Java considerarà que les dades que AM2 M9 curs 24/25 Carles Franquesa conté són verídiques. exercici Per tant, per poder validar totalment la identitat d’algú que signa codi, abans us cal obtenir de Afegiu-vos vosaltres mateixos a la llista de certificats de confiança de Java, torneu a signar l’rsa.jar, i manera segura verifiqueu la signatura. el certificat digital delHeu seud’aconseguir emissor (que queconté no aparegui la clauelpública missatgei les de “This jar contains entries dades). whose cerificate is invàlid.” Nota: Enlloc de –keystore “C:\Program Files...” podem usar directament l’opció –cacerts quan ens referim al keystore de Java 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat exercici Afegiu-vos vosaltres mateixos a la llista de certificats de confiança de Java, torneu a signar l’rsa.jar, solució i verifiqueu la signatura. Heu d’aconseguir que no aparegui el missatge de “This jar contains entries whose cerificate is invàlid.” 1. Exporteu el certificat amb el nom certificat_autosignat.crt. O sigui, la clau claus_de_prova del magatzem magatzem_de_claus.jks, ja que el certificat és la clau pública i les dades de la clau. keytool -exportcert -alias claus_de_prova -keystore magatzem_de_claus.jks -file certificat_autosignat.crt AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat exercici Afegiu-vos vosaltres mateixos a la llista de certificats de confiança de Java, torneu a signar l’rsa.jar, solució i verifiqueu la signatura. Heu d’aconseguir que no aparegui el missatge de “This jar contains entries whose cerificate is invàlid.” 2. Importar el certificat al keystore de Java. En mode administrador. La contrasenya per defecte é changeit. keytool -import -alias claus_de_prova -file certificat_carles.crt -cacerts AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat exercici Afegiu-vos vosaltres mateixos a la llista de certificats de confiança de Java, torneu a signar l’rsa.jar, solució i verifiqueu la signatura. Heu d’aconseguir que no aparegui el missatge de “This jar contains entries whose cerificate is invàlid.” 3. Verifcar de nou el jar per veure el resultat jarsigner −verify out.jar AM2 M9 curs 24/25 Carles Franquesa 5 de novembre de 2024 Sessió 7 AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.1 Seguretat a la plataforma Java 2.1.3 Codi signat esum, per signar un jar i que no aparegui el missatge “This jar contains entries whose certificate is invàlid” el següent: Creem una clau asimètrica (claus_de_prova) en un nou magatzem (magatzem_de_claus.jks) keytool -genkeypair -alias claus_de_prova -keyalg RSA -keysize 2048 -keystore magatzem_de_claus.jks -storepass Aa12345* Verifiquem que s’ha creat correctament keytool -list -keystore magatzem_de_claus.jks Signem l’arxiu jarsigner -keystore magatzem_de_claus.jks -signedjar out.jar rsa/rsa/dist/rsa.jar claus_de_prova Verifiquem (surt el missatge no desitjat) AM2 M9 curs 24/25 Carles Franquesa jarsigner -verify out.jar Exportar el certificat des del magatzem de claus keytool -exportcert -keystore magatzem_de_claus.jks -alias claus_de_prova -file certificat_autosignat.cer Afegir el certificat al magatzem de confiança de Java (contrasenya changeit) keytool -importcert -cacerts -file certificat_autosignat.cer -alias claus_de_prova Tornem a verificar el JAR signat (ja sense errors) jarsigner -verify out.jar 2.2 AM2 M9 curs 24/25 Carles Franquesa Connexions segures 2. Aplicacions Java segures a Internet 2.2 Connexions segures Especificació del Secure Socket Layer (SSL)https://datatracker.ietf.org/doc/html/ rfc6101 Un algorisme d’intercanvi de claus és un protocol criptogràfic amb el qual és possible que dues entitats intercanviïn una clau secreta de manera segura. Entre els més coneguts hi ha l’anomenat Diffe-Hellman- Merkle, que és el que usa SSL. 2.2.1 La negociació SSL Handshaking Procés inicial en una comunicació SSL on es produeix l’intercanvi de claus. AM2 M9 curs 24/25 Carles Franquesa pas 1: Hello El client indica que vol iniciar una connexió segura SSL. Per fer-ho, indica fins i tot quina versió d’SSL, conjunt d’algorismes criptogràfics i mides de clau suporta. pas 2: Hello El servei accepta la petició i tria la darrera versió possible entre les suportades pel client de cara a usar el protocol segur. Llavors, escull l’algorisme i mida de clau més segur entre 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.1 La negociació SSL Handshaking pas 3 (opció per fer autenticació simple de servei): Enviament certificat El servei envia el certificat digital que conté la seva clau pública i la seva identitat. pas 3 (opció per fer autenticació mútua amb el client): Petició de certificat El servei demana el certificat digital del client. pas 3 (opció per usar algorismes criptogràfics més sofisticats): Intercanvi de clau El servei envia al client informació addicional. AM2 M9 curs 24/25 Carles Franquesa pas 4 : Hello finalitzat El servei passa el testimoni al client de cara a continuar amb el procés de negociació del protocol. 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.1 La negociació SSL Handshaking pas 5 (opció quan s’ha demanat al pas 3): Enviament certificat El client envia el certificat digital que conté la seva clau pública i la seva identitat. pas 5 (opció per usar algorismes criptogràfics més sofisticats): Intercanvi de clau El client envia al client informació addicional. pas 5 (opció si el servei ho ha requerit): Validació certificat del client AM2 M9 curs 24/25 Carles Franquesa En el cas que es requereixi autenticació del client s’envia al servei un missatge signat digitalment amb la clau privada del client. Això serveix per demostrar que el client realment disposa de la clau privada associada al certificat que ha enviat, i no ha enviat el d’una altra entitat. 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.1 La negociació SSL Handshaking pas 6 : Canvi a mode xifrat El client avisa al servei que passa a mode xifrat de comunicacions. Fins ara, totes les comunicacions eren en clar. pas 7 : Senyal de fi El client està llest per iniciar les comunicacions en mode segur. Fi del handshaking. pas 8 : Canvi a mode xifrat El servei avisa que ell també passa a mode xifrat de comunicacions. pas 9 : Senyal de fi AM2 M9 curs 24/25 Carles Franquesa El servei està llest per iniciar les comunicacions en mode segur. Fi del handshaking. Un cop finalitzat el procés inicial de comunicació, el handshaking, es procedeix a l’intercanvi de dades en mode xifrat i finalment es tanca la connexió a totes dues bandes. En qualsevol moment de la connexió, tant el client com el servei poden reiniciar el handshaking quan vulguin per canviar qualsevol dels paràmetres del procés, i. e., tots els paràmetres del handshaking són 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Desplegament del servidor (amb autenticació simple) Al generar un certificat per un servei, normalment es recomana que el camp de Common Name del seu nom distingit sigui el nom DNS de la màquina en la qual s’executa. Si ho proveu tot en local, podeu posar Quan jalocalhost. tenim el magatzem, des del programa... 1. System.setProperty(“javax.net.ssl.keyStore”,ruta_del_magatzem) 2. System.setProperty(“javax.net.ssl.keyStorePassword”,contrasenya_del_magatzem) Encara que també es pot fer des de la línia de comandes –Djavax.net.... Els servidors SSL de la classe SSLServerSocket es creen per mitjà d’una factoria AM2 M9 curs 24/25 Carles Franquesa SSLServerSocketFactory, que s’obté amb el mètode estàtic getDefault(). exercici a) En un nou projecte anomenat TestSSL, desplegueu un servei amb autenticació simple, TestServidorSSL. Poseu el magatzem de claus en el mateix directori del projecte. 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Desplegament del servidor (amb autenticació simple) exercici solució a) En un nou projecte anomenat TestSSL, desplegueu un servei amb autenticació simple, TestServidorSSL. Poseu el magatzem de claus en el mateix directori del projecte. 1. Comencem creant el projecte amb netbeans. El projecte es diu TestSSL, però la classe principal es diu TestServidorSSL. 2. Creem el magatzem de claus. keytool -genkey -alias servidor -keyalg RSA -keystore keytool −export −keystore ServerKeyStore.jks −alias "srvAlias" −file server.crt-keysize 2048 AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Desplegament del servidor (amb autenticació simple) exercici solució a) En un nou projecte anomenat TestSSL, desplegueu un servei amb autenticació simple, TestServidorSSL. Poseu el magatzem de claus en el mateix directori del projecte. 3. Implementem el codi de la classe TestServidorSSL. public class TestServidorSSL { public static void main(String[] argv) throws Exception { System.setProperty("javax.net.ssl.keyStore", "magatzem_del_servidor.jks"); System.setProperty("javax.net.ssl.keyStorePassword", "servidor"); SSLServerSocketFactory sslFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); SSLServerSocket srvSocket = (SSLServerSocket) sslFactory.createServerSocket(1234); int numClient = 1; while (true) { System.out.println("Esperant nova connexió..."); SSLSocket cliSocket = (SSLSocket) srvSocket.accept(); Scanner reader = new Scanner (cliSocket.getInputStream()); AM2 M9 curs 24/25 Carles Franquesa String text = reader.nextLine(); while (!text.equals("")) { System.out.println("[Client " +numClient + "] " + text); System.out.flush(); text = reader.nextLine(); } System.out.println("[Client " +numClient + "] Tancant connexió..."); cliSocket.close(); numClient++; } } } executant-lo veurem que l’única cosa que fa és quedar-se en espera 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Implementació d’un client (amb autenticació simple) El client també necessita una configuració previa. Ara, cal especificar la llista d’emissors de certificats digitals amb els quals es confia. Només es permetran connexions a serveis que siguin fiables, avortant el handshaking al detectar-ho. Anomenem truststore al magatzem de confiança on cal guardar els certificats dels emissors de confiança. hi haurà certificats de CA’s i autosigna un intent de connectar a un servidor del qual exemple.com no en tenim cap certificat en el nostre truststore. AM2 M9 curs 24/25 Carles Franquesa Com abans, establim dues propietats de sistema. Aquest cop, per indicar el truststore. javax.net.ssl.trustStore javax.net.ssl.trustStorePassword que també es pot fer via ínia de comandes – Djavax.... 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Implementació d’un client (amb autenticació simple) exercici b) Dins el mateix projecte, implementeu un client amb autenticació simple, TestClientSSL. solució 1. Exportem el certificat del servidor. keytool −export −keystore magatzem_del_servidor.jks −alias servidor −file server.cer AM2 M9 curs 24/25 Carles Franquesa 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Implementació d’un client (amb autenticació simple) exercici b) Dins el mateix projecte, implementeu un client amb autenticació simple, solució TestClientSSL. 2. Importem el certificat del servidor al magatzem truststore.jks (que es crearà aquí mateix). keytool −importcert −keystore truststore.jks −alias servidor −file server.cer AM2 M9 curs 24/25 Carles Franquesa Altre cop, podem veure que ha estat ben creat amb la comanda keytool –list –keystore 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Implementació d’un client (amb autenticació simple) exercici solució b) Dins el mateix projecte, implementeu un client amb autenticació simple, TestClientSSL. 3. Implementem el codi de la classe TestClientSSL. public class TestClientSSL { public static void main(String[] argv) throws Exception { System.setProperty("javax.net.ssl.trustStore", "truststore.jks"); System.setProperty("javax.net.ssl.trustStorePassword", "Aa12345*"); SSLSocketFactory sslFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket cliSocket = (SSLSocket) sslFactory.createSocket("localhost",1234); Scanner reader = new Scanner (System.in); PrintStream writer = new PrintStream(cliSocket.getOutputStream()); System.out.println("Deixa una línia en blanc per acabar:"); String text = reader.nextLine(); AM2 M9 curs 24/25 Carles Franquesa while (!text.equals("")) { writer.println(text); writer.flush(); text = reader.nextLine(); } writer.println(""); writer.flush(); cliSocket.close(); } } Si hi ha errors i volem saber què System.setProperty("javax.net.debug", "SSL,handshake"); passa, 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Desplegament d’autenticació mútua En un intercanvi de missatges autenticat mútuament, tots els clients també s’han d’identificar davant del servidor mitjançant un certificat digital de confiança. Tots els clients han de disposar d’una clau privada i un certificat digital. El client ha de disposar d’un magatzem criptogràfic amb una clau privada i un certificat El digital. servei ha de disposar d’un magatzem on desar els certificats de les entitats de certificació de confiança. public class SSLClientAutenticacioMutua { AM2 M9 curs 24/25 Carles Franquesa public static void main(String[] argv) throws Exception { //Magatzem de confiança del client System.setProperty("javax.net.ssl.trustStore", “truststore.jks"); System.setProperty("javax.net.ssl.trustStorePassword", “Aa12345*"); //Clau del client System.setProperty("javax.net.ssl.keyStore",”magatzem_del_client.jks"); System.setProperty("javax.net.ssl.keyStorePassword", "client");... Pel cas del servei, seria exactament igual, però amb els 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.2 Connexions SSL amb Java Desplegament d’autenticació mútua Un cop totes les dues parts disposen de tota la informació criptogràfica, cal configurar el servei perquè requereixi autenticació mútua, ja que per defecte actúa amb autenticació simple. Això es fa invocant el mètode setNeedClientAuth sobre el seu sòcol de servei, o sigui l’objecte SSLServerSocket.servidor mitjançant un certificat digital de confiança. AM2 M9 curs 24/25 Carles Franquesa public class SSLServerAutenticacioMutua { public static void main(String[] argv) throws Exception {... SSLServerSocketFactory sslFactory = SSLServerSocketFactory).SSLServerSocketFactory.getDefault(); SSLServerSocket srvSocket = (SSLServerSocket) sslFactory.createServerSocket(1234); srvSocket.setNeedClientAuth(true)... 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.3 Gestió personalitzada de la informació criptogràfica Java ofereix una via d’accés a les dades criptogràfiques a més baix nivell, permetent la personalització d’alguns aspectes vinculats a la gestió de la informació criptogràfica i a la validació dels Inspecció certificats. de la identitat als extrems Per consultar la informació vinculada a la identitat de l’extrem en una connexió segura SSL, existeix la classe SSLSession. AM2 M9 curs 24/25 Carles Franquesa Podem obtenir un objecte SSLSession d’una connexió amb el mètode getSession() de la clase String getCipherSuite() SSLSocket ambper el veure socket que tinguem. l’algorisme usat per Java per protegir les dades, com a resultat de la negocicació SSL Certificate[] getPeerCertificates() mètodes de la classe SSLSession per obtenir el certificate que ens ha enviat l’altre extrem Principal getPeerPrincipal() obté el nom distingit dins del Subject del certificat de l’altre extrem javax.security.auth.x500.X500Princ String getPeerHost(): obté el nom de l’equip amb qui s’intercanvien missatges. 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.3 Gestió personalitzada de la informació criptogràfica Personalització del gestor de confiança En una implementació personalitzada es pot fer una classe interficie de Java per la personalització del gestor de confiança que llegeixi els certificats d’un altre lloc, com un servei remot, o que javax.net.ssl.X509TrustMana apliqui altres polítiques de validació. ger La implementación de la interfície X509TrustManager cal sobreescriure els mètodes: AM2 M9 curs 24/25 Carles Franquesa void checkClientTrusted(X509Certificate[] certs, String tipus) throws CertificateException certificats del client i del seu emisor algorisme emprat per l’autenticació: “RSA” En el servidor. Acceptem la connexió (void) o no (excepció). 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.3 Gestió personalitzada de la informació criptogràfica Personalització del gestor de confiança La implementación de la interfície X509TrustManager cal sobreescriure els mètodes: void checkClientTrusted(X509Certificate[] certs, String tipus) throws CertificateException void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException En el client. AM2 M9 curs 24/25 Carles Franquesa X509Certificate[] getAcceptedIssuers() El codi d’aquest mètode ha de retornar un array amb una llista dels certificats d’emissor considerats de confiança 2. Aplicacions Java segures a Internet 2.2 Connexions segures 2.2.3 Gestió personalitzada de la informació criptográfica Personalització del gestor de confiança exercici Implementeu un gestor de confiança que es comporti de la següent manera: 1. Si el gestor s’executa en un servidor, que accepti qualsevol certificat de qualsevol tipus de client. 2. Si el gestor s’executa en un client, que rebutgi qualsevol certificat de qualsevol tipus de servidor. solució 3. I en qualsevol cas, que retorni una llista buida com emissors acceptats. public class MyTrustManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { AM2 M9 curs 24/25 Carles Franquesa } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { throw new CertificateException(); } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate; } }

Use Quizgecko on...
Browser
Browser