jueves, 27 de octubre de 2011

Generar certificados autofirmados con OpenSSL


Software is like sex: It’s better when it’s free.
Linus Torvalds.


Tengo la suerte de trabajar en un lugar rodeado de extraordinarios profesionales como compañeros. El artículo que traigo aquí hoy es un resumen de un correo electrónico de uno de ellos que, con su permiso (y sugerencia) he convertido humildemente en otro post más para este blog. Gracias, Josete. Es un placer y un honor trabajar contigo.



Mini How-To: Generar certificados autofirmados con OpenSSL para Apache HTTP Server

-por José Morales Mora.

PASO 1. Generar Clave RSA

Ejecutar:

openssl genrsa -des3 -out server.key 1024

Genera una clave CA para realizar la firma del certificado. Nos pide la clave privada para este certificado. Podemos especificar el tamaño de la clave ( 1024, 2048)

PASO 2. Generar CSR ( Petición de Firma de Certificado)

Ejecutar:

openssl req -new -key server.key -out server.csr

Realiza una petición para la firma con clave privada especificado. Al realizarlo nos pide datos:

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: 
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
 

IMPORTANTE: El "Common Name" debe corresponder con la URL que queremos Securizar. Si la URL a poner por SSL es www.paco.es, este campo debe contener exactamente eso.


PASO 3. Eliminar Clave Privada DES3

Ejecutar:

cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

Esto es necesario porque en estos casos que tenemos un certificado firmado con clave primaria, Apache HTTP Server pide en cada arranque esa clave para utilizar el certificado. La solución es eliminar la encriptación DES3 para la clave.


PASO 4 . Generar Certificado Autofirmado.

Ejecutar:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Con este paso obtenemos el CRT autofirmado preparado para ser utilizado en apache.

PASO 5. Configurar Apache

Para utilizar estos certificados en apache, lo que tenemos que hacer es añadir al Virtual Host que queramos:

SSLEngine on
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key



Referencias y más información:

domingo, 9 de octubre de 2011

Combinando XPath con JAXB


El primer 90% del código ocupa el 90% del tiempo de desarrollo. El 10% restante del código ocupa el otro 90% de tiempo de desarrollo.


Usar JAXB es tremendamente cómodo si tenemos que procesar datos XML bien definidos y cuya estructura sea bastante estable en el tiempo: nos evitamos toda la fontanería de análisis, verificación y marshalling / unmarshalling. Por otro lado, nos resuelve de un plumazo convertir los datos XML a objetos DTO/VO de datos en nuestra aplicación ya que nos permitirá pasarlos directamente a Servicios de negocio o a vista (si usamos un MVC), en lugar de crearlos y mantenerlos manualmente cada vez que se modifican las especificaciones.

Pero no todo son ventajas. A la hora de acceder a un dato de un elemento, tratar con objetos puede suponer un verdadero engorro de iteraciones anidadas o tener que usar predicados para las colecciones de elementos, cuando con XPath podemos realizar un acceso rápido y directo al elemento a través de sencillas expresiones.

Por ejemplo, supongamos que tenemos el siguiente XML:
  
    
      1
      
        
          ...
          06002
        
      
    
    
      2
      
        
          ...
          28034
        
      
    
    
      3
      
        
          ...
          06002
        
      
    
  
Si necesitamos acceder a todos los elementos/objetos empleado cuyo elemento cp sea 06002, usando objetos generados por JAXB deberíamos iterar por la colección empleados, así:

List<Empleado> empleados06 = new ArrayList<Empleado>();
for ( Empleado empleado : empleados.getEmpleadoList() ) {
  for ( direccion : empleado.getDirecciones().getDireccionList() ) {
    if ( direccion.getCp().equals("06002") ) {
      empleados06.add(empleado);
    }
  }
}

con XPath es mucho más simple: podemos obtener una lista usando la expresión

//empleado[cp='06002']

Cuanto más niveles jerárquicos tenga nuestro árbol de información (más grados de anidación), más compleja se hace la recuperación de datos usando JAXB. Sin embargo, con XPath es tan simple como evaluar una expresión.

Hasta que descubrí JXPath, tenía que elegir entre XPath (y pagar la "penalización" de realizar el marshalling/unmarshalling manualmente) o JAXB (y pagar la penalización de la selección de elementos con código manual).

JXPath

JXPath es otro genial componente de Apache Commons: una librería que evalúa expresiones (basadas en) XPath contra jerarquías de objetos Java, permitiendo hacer complejas consultas e iteraciones sobre estructuras y conjuntos de simples objetos POJO.

Es decir, te permite usar XPath sobre objetos. Y no sólo sobre objetos serializados vía JAXB, sino cualquier POJO o colección de éstos. Si XPath es al XML lo que el SQL a las bases de datos, JXPath es el equivalente a los objetos Java. Es la solución perfecta para simplificar código que debe evaluar y filtrar conjuntos de objetos o, por ejemplo, cuando debemos seleccionar datos en objetos en tiempo de ejecución, en los que es sencillo construir una expresión XPath dinámica. El artículo "Java Object Querying Using JXPath", muestra una serie de ejemplos muy ilustrativos.

Referencias y más información:
Related Posts Plugin for WordPress, Blogger...
cookieassistant.com