Esta lecci�n ilustra el uso de las herramientas relacionadas con la seguridad (keytool, jarsigner, y Policy Tool). Tambi�n mustra el suso de la herramienta jar para situar ficheros en un fichero JAR, para la posterior firma con la herramienta jarsigner.
En esta lecci�n primero ejecutaremos los pasos para crear una aplicaci�n, ponerla en un fichero JAR, firmar el fichero JAR, y exportar el certificado de la clave p�blica correspondiente a la clave privada usada para firmar el fichero JAR.
Luego actuaremos como el receptor del fichero JAR y del certificado. Veremos c�mo la aplicaci�n firmada, normalmente no puede leer un fichero cuando se ejecuta bajo un controlador de seguridad. Luego usaremos keytool para importar el certificado en nuestro keystore en una entrada con el alias susan, y Policy Tool para crear una entrada en el fichero de pol�tica de Ray para permitir que el c�digo firmado por susan pueda leer el fichero especificado. Finalmente veremos como nuestra aplicaci�n ejecutandose bajo un controlador se seguridad puede ahora leer el fichero, ya que se le ha concedido permiso para hacerlo.
Para m�s informaci�n osbre las firmas digitales, los certificados y las herramientas, puedes ver la lecci�n anterior.
Nota Importante: Necesitamos hacer todo el trabajo de esta lecci�n en el directorio en el que hayamos almacenado la aplicaci�n de ejemplo, pero deber�amos almacenar lo ficheros de datos necesarios para la aplicaci�n en un directorio diferente. Todos los ejemplos asumen que estamos trabajando en el directorio C:\Test, y que los ficheros de datos est�n el directorio C:\TestData.
�Pasos para el Firmante de C�digo
El firmante de c�digo realiza los siguientes pasos que se muestran en la siguiente figura.
![](/cursos_descargas/security1dot2/images/susanSigner.gif)
�Descargar y Probar la Aplicaci�n de Ejemplo
La aplicaci�n usada por esta lecci�n est� suministrada por t�.
Crea un fichero llamado Count.java en tu ordenador copiando o descargando el c�digo fuente Count.java. Los ejemplos de esta lecci�n asumen que lo has situado en el directorio C:\Test.
Ahora compilamos y ejecutamos la aplicaci�n Count para ver qu� hace. Necesitamos especificar (como argumento) el nombre y el path de un fichero a leer. Puedes descargar y utilizar este fichero de ejemplo llamado data.
Importante:� Para esta lecci�n, pon el fichero de datos en otro directorio distinto al que contiene la aplicaci�n Count. Los ejemplos asumen que has puesto el fichero de datos en el directorio C:\TestData. M�s adelante en esta lecci�n ver�s como una aplicaci�n que se ejecuta bajo un controlador de seguridad no puede leer ficheros a menos que explicitamente se le de permiso para hacerlo. Sin embargo, una aplicaci�n, siempre puede leer un fichero de su propio directoriro (o un subdirectorio); sin necesitar permiso expl�cito.
Un ejemplo de ejecuci�n podr�a ser
C:\Test>java Count C:\TestData\data Counted 65 chars.
�Crear un Fichero JAR que Contenga el Fichero Class
Para crear in fichero JAR que contenga el fichero Count.class. Debemos teclear lo siguiente en nuestra l�nea de comandos.
jar cvf Count.jar Count.class
Esto crea el fichero JAR, Count.jar, y situa el fichero Count.class dentro de �l.
�Generar Claves
Si un firmante de c�digo no tiene todav�a una clave privada para firmar el c�digo, primero debe generar la clave junto con una correspondiente clave p�blica que puede ser usada por el sistema de ejecuci�n del receptor para verificar la firma.
Como esta lecci�n asume que tu no tienes dichas claves, vas a crear un keystore llamado susanstore y ha crear una entrada con una pareja de claves p�blica/privada recien creada (con la clave p�blica en un certificado).
Ahora imaginemos que somos Susan Jones y que trabajamos en la departamento de ventas de la compa�ia ABC. Tecleamos el siguiente comando para crear el keystore llamado susanstore y para generar las claves para Susan Jones.
keytool -genkey -alias signFiles -keypass kpi135 -keystore susanstore -storepass ab987c
(Nota: Debe teclearse como una s�la l�nea.)
�Subpartes del Comando keytool
Echemos un vistazo a los que significan cada una de las subpartes de keytool.
- El comando para generar claves es -genkey.
- La subparte -alias signFiles indica el alias que se va usar en el futuro para referirse a la entrada del keystore que contiene las claves que se van a generar.
- La subparte -keypass kpi135 especifica una password para la clave privada a generar. Esta password siempre en necesaria en caso de acceder a la entrada del keystore que contiene la clave. La entrada no tiene que tener su propia password ; si no incluimos una opci�n -keypass, se nos pedir� la password de la clave y nos ofrecer� la opci�n de permitir que sea la misma que la del keystore.
- La subparte -keystore susanstore indica el nombre (y opcionalmente el path) del keystore que estamos creando o usando.
- La subparte -storepass ab987c indica la password del keystore. Si no incluimos la opci�n -storepass, se nos pedir� la password para el keystore.
Por razones de seguridad no deber�as realmente suministrar las password en la l�nea de comandos, porque podr�an ser interceptadas f�cilmente. en su lugar deber�as desactivar las opciones -keypass y -storepass y teclear las password cuando te las pida.
�Informaci�n de Nombre-Distinguido
Si usamos el comando anterior, nos preguntar� por la informaci�n del nombre-distinguido. En las siguientes preguntas, la parte en negrita indica lo que deber�amos responder.
What is your first and last name? [Unknown]: Susan Jones What is the name of your organizational unit? [Unknown]: Purchasing What is the name of your organization? [Unknown]: ABC What is the name of your City or Locality? [Unknown]: Cupertino What is the name of your State or Province? [Unknown]: CA What is the two-letter country code for this unit? [Unknown]: US Is <CN=Susan Jones, OU=Purchasing, O=ABC, L=Cupertino, ST=CA, C=US> correct? [no]: y
�Resultados del Comando
El comando keytool crea el keystore llamado susanstore (si no exist�a anteriormente) en el mismo directorio en que se ejecuta el comando y le asigna la password ab987c. El comando genera una pareja de claves p�blica/privada para la entidad cuyo nombre distinguido tiene un nombre com�n de Susan Jones y la unidad organizativa de Purchasing.
El comando crea un certificado auto-firmado que incluye la clave p�blica y la informaci�n del nombre distinguido. (El nombre distinguido que suministramos se usar� en el campo "subject" en el certificado). Este certificado ser� v�lido durante 90 d�as, el periodo por defecto de validez si no especificamos una opci�n -validity. El certificado est� asociado con la clave privada en una entrada del keystore referida por el alias signFiles. La clave privada tiene asignada la password kpi135.
Nota: El comando podr�a ser m�s corto si aceptamos las opciones por defecto y si deseamos que se nos pidan varios valores. Siempre que ejecutemos el comando keytool, se usan las opciones no espec�ficadas que tengan valores por defecto, y se nos pedir� cualquier valor necesario. Para el comando genkey, las opciones con valores por defecto incluida el alias (cuyo valor por defecto es mykey), validity (90 dias), y keystore (el fichero llamado .keystore en nuestro directorio home). Los valores requeridos son dname, storepass, y keypass.
�Firmar el Fichero JAR
Ahora estamos listos para firmar el fichero JAR. Tecleando lo siguiente en la l�nea de comandos firmaremos el fichero JAR Count.jar, usando la clave privada en la entrada del keystore con el alias signFiles, y el nombre del fichero JAR firmado resultante ser� sCount.jar.
jarsigner -keystore susanstore -signedjar sCount.jar Count.jar signFiles
Se nos pedir� la password del keystore (ab987c) y la password de la clave privada (kpi135).
Nota: La herramienta jarsigner extrae el certificado de la entrada del keystore cuyo alias es signFiles y lo adjunta a la firma generada para el fichero JAR firmado.
�Exportar el Certificado de la Clave P�blica
Ahora tenemos un fichero JAR firmado sCount.jar. El sistema de ejecuci�n del receptor del c�digo necesitar� autentificar la firma cuando la aplicaci�n Count del fichero JAR firmado intente leer un fichero y un fichero de pol�tica le conceda el permiso para este c�digo firmado.
Para permitir que el sistema de ejecuci�n autentifique la firma, el keystore del receptor necesita tener la clave p�blica correspondiente a la clave privada usada para generar la firma. Podemos suministrarsela al receptor enviando una copia del certificado de autentificaci�n de la clave p�blica. Copiamos este certificado desde el keystore susanstore a un fichero llamado SusanJones.cer de esta forma.
keytool -export -keystore susanstore -alias signFiles -file SusanJones.cer
Se nos pedir� la password del keystore (ab987c).
�Pasos para el Receptor del C�digo
Ahora actuaremos como Ray, que recibe el fichero JAR firmado y el fichero del certificado de Susan. Realizaremos los siguientes pasos, como se muestra en la figura.
�Observar las Restricciones de la Aplicaci�n
La �ltima parte de la lecci�n Visi�n R�pida para Controlar Aplicaciones muestra c�mo una aplicaci�n puede ser ejecutada bajo un controlador de seguridad llamando al int�rprete con el nuevo argumento de la l�nea de comando -Djava.security.manager. �Pero qu� pasa si la aplicaci�n reside dentro de un fichero JAR?
Una de las opciones del int�rprete es la opci�n -cp (class path), con la que se especifica un path de b�squeda para las clases de la aplicaci�n y los recursos. As�, por ejemplo, para ejecutar la aplicaci�n Count dentro del fichero JAR sCount.jar, especificando el fichero C:\TestData\data como su argumento, podr�amos teclear lo siguiente desde el directorio que contiene sCount.jar.
java -cp sCount.jar Count C:\TestData\data
Para ejecutar la aplicaci�n con un controlador de seguridad, simplemente a�adimos -Djava.security.manager, como en:
java -Djava.security.manager -cp sCount.jar Count C:\TestData\data
Cuando ejecutemos este comando, deber�amos obtener una excepci�n.
Exception in thread "main" java.security.AccessControlException. access denied (java.io.FilePermission C:\TestData\data read) at java.security.AccessControlContext.checkPermission(Compiled Code) at java.security.AccessController.checkPermission(Compiled Code) at java.lang.SecurityManager.checkPermission(Compiled Code) at java.lang.SecurityManager.checkRead(Compiled Code) at java.io.FileInputStream.<init>(Compiled Code) at Count.main(Compiled Code)
Esta AccessControlException esta informando de que la aplicaci�n no tiene permiso para leer el fichero C:\TestData\data. Esta excepci�n se lanza porque una aplicaci�n que se est� ejecutando bajo un controlador de seguridad no puede leer o esribir ficheros o acceder a otros recursos a menos que tenga permiso expl�cito para hacerlo.
�Importar el Certificado como un Certificado Verdadero
Antes de poder conceder permiso al c�digo firmado para que lea un fichero espec�fico, necesitamos importar el certificado de Susan como un certificado verdadero en nuestro keystore.
Supongamos que hemos recibido de Susan.
- El fichero JAR sCount.jar, que contiene el fichero Count.class, y
- el fichero SusanJones.cer, que contiene el certificado de clave p�blica para la clave p�blica correspondiente a la clave privada usada para firmar el fichero JAR.
Aunque acabemos de crear estos ficheros y realmente no han sido transportados desde ning�n lugar, podemos simular que somos otra persona distinta al creador y emisor, Susan. Imaginemos que ahora somos Ray, crearemos un keystore llamado raystore y lo usaremos para importar dentro el certificado dentro de de una entrada con el alias de susan.
Un keystore se crea siempre que usemos un comando keytool especificando un keystore que no exista. As� podemos crear el raystore e importar el certificado mediante un solo comando keytool. Hacemos lo siguiente en nuestra l�nea de ocmandos.
- Vamos al directorio que contiene el fichero del certificado de la clave p�blica SusanJones.cer. (Ya deber�amos estar en �l, ya que esta lecci�n asume que est�mos trabajando en un s�lo directorio).
- Tecleamos el siguiente comando en una l�nea.
keytool -import -alias susan -file SusanJones.cer -keystore raystore
Como el keystore no existe todav�a, se crear�, y nos pedir� que introduzcamos la password para el keystore, tecleamos cualquier password que queramos.
El comando keytool imprimir� la informaci�n del certificado y nos pedir� que lo verifiquemos, por ejemplo, comparando la huella dactilar del certificado mostrado con aquellas obtenidas de otra fuente de informaci�n (contrastada). (Cada huella dactilar es un n�mero relativamente corto y �nico que identifica un certificado). Por ejemplo, en el mundo real podr�amos llamar a Susan y preguntarle cual deber�a ser su huella dactilar. Ella puede obtener la huella del fichero SusanJones.cer.
keytool -printcert -file SusanJones.cer
Si las huellas dactilares corresponden, el certificado no ha sido modificado durante el tr�nsito. En este caso podemos permitir que keytool proceda con la inclusi�n de la entrada de certificado verdadero en el keystore. La entrada contiene los datos del certificado de la clave p�blica obtenidos del fichero SusanJones.cer y se le asigna el alias susan.
�Configurar un Fichero de Pol�tica para Conceder los Permisos Requeridos
Luego usaremos un la herramienta Policy Tool para crear un fichero de pol�tica llamando raypolicy y conceder un permiso para el c�digo del fichero JAR firmado.
El fichero JAR debe haber sido firmado usando la clave privada correspondiente a la clave p�blica importada en el keystore de Ray (raystore) en los pasos anteriores. El certificado que contiene la clave p�blica tiene el alias de susan en el keystore. Concederemos a dicho c�digo permiso para leer cualquier fichero del directorio C:\TestData\.
�Arrancar Policy Tool
Para arrancar Policy Tool, simplemente tecleamos esto en la l�nea de comandos.
policytool
Esto nos trae la ventana de Policy Tool. Siempre que se arranca, Policy Tool intenta rellenar su ventana con informaci�n de algo que algunas veces es referido como "fichero de pol�tica de usuario", que, por defecto, es un fichero llamado .java.policy que est� en el directorio home. Si Policy Tool no puede encontrar ese fichero, informa de la situaci�n y muestra una ventana Policy Tool en blanco (es decir, una ventana con cabeceras y botones pero sin datos, como se muestra en la figura.
![](/cursos_descargas/security1dot2/images/ptBlank1.gif)
Crearemos y trabajaremos sobre un fichero de pol�tica distinto del fichero de pol�tica de usuario, ya que las lecciones de esta secci�n no necesitan que se hagan modificaciones en el fichero de pol�tica de usuario oficial.
Asumiendo que estamos viendo una ventana de Policy Tool en blanco (si no es as�, seleccionamos New en el men� File), podemos proceder inmediatamente a crear un nuevo fichero de pol�tica.
�Especificar el Keystore
Para esta lecci�n concederemos permiso a todo el c�digo en ficheros JAR firmados por el alias susan acceso de lectura a todos los ficheros en el directorio C:\TestData\. Necesitamos:
- Especificar el keystore que contiene la informaci�n del certificado con el alias susan.
- Crear la entrada de pol�tica que concede los permisos.
El keystore es uno llamado raystore creado en el paso "Importar el Certificado como un Certificado Verdadero".
Para especificar el keystore, elegimos el comando Change Keystore en el men� Edit en la ventana principal de Policy Tool. Esto nos muestra la caja de di�logo en que podemos especificar la URL del keystore especificado y el tipo de keystore.
Para especificar el keystore llamado raystore en el directorio Test del disco C:, tecleamos la siguiente URL en la caja de texto etiquetada New KeyStore URL.
file:/C:/Test/raystore
Podemos dejar en blanco la caja de texto etiquetada New KeyStore Type si el tipo de keystore es uno por defecto, como se especifica en fichero de propiedades de seguridad. Nuestro keystore ser� del tipo por defecto, por eso dejamos la caja de texto en blando. El resultado lo muestra la siguiente figura.
![](/cursos_descargas/security1dot2/images/WTaddKeystore.gif)
Nota: el valor de New KeyStore URL es una URL y por eso siempre se deben usar barras inclinadas (nunca barras inclinadas inversas), como separadores de directorio.
Cuando hayamos especificado la URL, elegios OK. La caja de texto etiquetada Keystore se rellena con la URL.
![](/cursos_descargas/security1dot2/images/WTptKeystore.gif)
Luego, necesitamos especificar la nueva entrada de pol�tica.
�A�adir una Entrada de Pol�tica con un SignedBy Alias
Para conceder permiso al c�digo firmado por susan para leer cualquier fichero en el directorio C:\TestData, necesitamos crear una entrada de pol�tica concediendo este permiso. Observa que "Code signed by susan" es una abreviatura de decir "C�digo en un fichero class contenido en un fichero JAR, donde JAR fue firmado usando la clave privada correspondiente a la clave p�blica que aparece en un certificado del keystore en una entrada con el alias susan."
Elegimos el bot�n Add Policy Entry en la ventana principal de Policy Tool. Esto nos trae la caja de di�logo Policy Entry.
![](/cursos_descargas/security1dot2/images/AddEntryBlank1.gif)
Usando esta caja de di�logo, tecleamos el siguiente alias en la caja de texto SignedBy.
susan
Dejamos la caja de texto CodeBase en blanco, para cenceder permiso a todo el c�digo firmado por susan, el permiso, sin importar de donde venga.
Nota: si queremos restringir el permiso s�lo para el c�digo firmado por susan que venga del directorio C:\Test\, deber�amos teclear la siguiente URL en la caja de texto CodeBase.
file:/C:/Test/*
Para a�adir el permiso, elgimos el bot�n Add Permission. Esto nos trae la caja de di�logo Permissions.
![](/cursos_descargas/security1dot2/images/AddPermBlank.gif)
Hcemos lo siguiente.
- Elegimos File Permission desde la lista desplegable Permission. El nombre del permiso completo (java.io.FilePermission) aparece en la caja de texto que hay a la derecha de la lista desplegable.
- Tecleamos esto en la caja de texto que hay a la derecha de la lista etiquetada Target Name para especificar todos los ficheros del directorio C:\TestData\.
C:\TestData\*
- Escpecificamos el acceso de lectura eligiendo la opci�n read en la lista desplegable Actions.
Ahora la caja de Di�logo Permissions se parecer� a esto.
![](/cursos_descargas/security1dot2/images/WTaddFilePerm.gif)
Elegimos el bot�n OK. El nuevo permiso aparece en una l�nea en el di�logo Policy Entry, de esta forma.
![](/cursos_descargas/security1dot2/images/WTaddEntry.gif)
Nota: Cada barra invertida que hayamos tecleado en el path del fichero ha sido reemplazada por dos barras invertidas, por conveniencia. Las cadenas en un fichero de pol�tica son procesadas por un tokenizer que permite usar "\" como caracter de escape (por ejemplo \n para indicar nueva l�nea), por eso el fichero de pol�tica requiere dos barras invertidas para indicar una s�la barra invertida. Si usamos una sola barra invertida como separadores de directorios, Policy Tool las convierte autom�ticamente en dobles barras invertidas.
Ahora ya hemos especificado la entrada de pol�tica, elegimos el bot�n Done en el di�logo Policy Entry. La ventana Policy Tool contiene una l�nea que representa la entrada de pol�tica, mostrando el valor SignedBy, como se ve en la figura.
![](/cursos_descargas/security1dot2/images/WTptOneSB.gif)
�Grabar el Fichero de Pol�tica
Para grabar el nuevo fichero de pol�cia que hemos creado, elegimos el comando Save As en el men� File. Esto nos trae la caja de di�logo Save As.
Navegamos por la estructura de directorio para obtener el directorio en el que salvar el fichero de pol�tica: el directorio Test del disco C:. Tecleamos el nombre de fichero.
raypolicy
Luego elegimos el bot�n Save. Entonces se graba el fichero de pol�tica, y su nombre y path se muestran en la caja de texto etiquetada Policy File, como se muestra en la siguiente figura.
![](/cursos_descargas/security1dot2/images/WTptWithFilename.gif)
Luego salimos de Policy Tool seleccionando el comando Exit del men� File.
�Ver los efectos del Fichero de Pol�tica
En los pasos anteriores hemos creado una entrada en el fichero de pol�tica raypolicy concediendo permiso al c�digo firmado por susan para leer ficheros en el directorio C:\TestData\ (o el directorio testdata en tu directorio home si est�mos trabajando en UNIX). Ahora deber�amos poder ejecutar con �xito el programa Count para leer y contar los caracteres de un fichero del directorio especificado, incluso aunque estemos ejecutando la aplicaci�n con un controlador de seguridad.
Como se describe al final de la lecci�n Visi�n R�pida para Controlar Applet, hay dos formas posibles en la podemos considerar el fichero de pol�tica raypolicy como parte de la pol�tica general, adem�s de los ficheros de pol�tica especificados en el fichero de propiedades de seguridad. La primera aproximaci�n es especificar el fichero de pol�tica adicional en una propiedad pasada el sistema de ejecuci�n. La segunda aproximaci�n es a�adir una l�nea al fichero de propiedades de segurdad espec�ficando el fichero de pol�tica adicional.
�Aproximaci�n 1
Podemos usar un argumento de la l�nea de comandos -Djava.security.policy para especificar un fichero de pol�tica que deber�a usarse en adicci�n o en lugar de alguno de los especificados en el fichero de propiedades de seguridad.
Para ejecutar la aplicaci�n Count y tener incluido el fichero de pol�tica raypolicy, tecleamos esto, en una s�la l�nea, en el directorio que contiene los ficheros sCount.jar y raypolicy.
java -Djava.security.manager -Djava.security.policy=raypolicy -cp sCount.jar Count C:\TestData\data
El programa deber�a devolver el n�mero de caracteres en el fichero especificado.
Si todav�a informa un error, algo hay err�neo en el fichero de pol�tica. Usamos Policy Tool para comprobar el permiso que acabamos de crear en el "paso anterior".
�Aproximaci�n 2
Podemos especificar un n�mero de URLs -- incluidas algunas con la forma "http://" -- en propiedades policy.url.n en el fichero de propiedades de seguridad, y se cargar�n todos los ficheros de pol�tica especificados.
Por eso una forma de hacer que nuestra entrada en el fichero de pol�tica raypolicy sea considerada por el int�rprete es a�adir una entrada indicando este fichero en el fichero de propiedades de seguridad.
Importante: Si estas ejecutando tu propia copia del JDK, puedes f�cilmente editar tu fichero de propiedades de seguridad. Si est�s ejecutando una versi�n compartida con otros, s�lo podr�s modificarlo si tienes acceso de escritura, o si pides al admistrados que modifique el fichero de la forma apropiada. Sin embargo, no es apropiado realizar modificaciones en un fichero de seguridad para todo el sistema s�lo para probar este tutorial. Te sugerimos que leas los pasos siguientes para ver c�mo se hace o que te instales tu propia versi�n privada del JDK para usar con las lecciones del tutor.
El fichero de propiedades de seguridad est� alojado en
Windows. java.home\lib\security\java.security UNIX. java.home/lib/security/java.security
La porci�n java.home indica el directorio en el que se instal� el JRE.
Para modificar el fichero de propiedades de seguridad, lo abrimos en un editor que permita editar ficheros de texto ASCII. Luego a�adimos la siguiente l�nea despu�s de la l�nea que empieza con policy.url.2.
Windows. policy.url.3=file:/C:/Test/raypolicy UNIX. policy.url.3=file:${user.home}/test/raypolicy
En un sistema UNIX podemos espec�ficar expl�citamente nuestro directorio home, como
policy.url.3=file:/home/susanj/test/raypolicy
Luego, en nuestra ventana de comandos, vamos al directorio que contiene el fichero sCount.jar, que es, el directorio C:\Test o ~/test. Y tecleamos el siguiente comando.
java -Djava.security.manager -cp sCount.jar Count C:\TestData\data
Como en la aproximaci�n 1, si el programa a�n muestra alg�n error, tenemos algo err�neo en el fichero de pol�tica. Usamos Policy Tool para comprobar el permiso que acabamos de crear en el "paso anterior".
Importante: Antes de continuar probablemente querr�s borrar la l�nea que acabamos de a�adir al fichero de propiedades de seguridad, ya que no querr�s que el fichero raypolicy sea incluido cuando no est�s ejecutando las lecciones del tutor.