sábado, 10 de octubre de 2009

Instalar Bouncy Castle en JBoss

Si alguna vez habéis intentado instalar en JBoss una o varias aplicaciones que hacen uso de la librería criptográfica Bouncy Castle, y sin explicación alguna habéis obtenido errores del tipo:

java.lang.SecurityException: JCE cannot authenticate the provider BC
o
java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: SHA1WithRSAEncryption, provider: BC, class: org.bouncycastle.jce.provider.JDKDigestSignature$SHA1WithRSAEncryption)

os contaré como he solucionado el problema.

En la documentación de Bouncy Castle nos comentan que hay varias formas de inicializar la librería.

De forma estática

Consiste en instalar la librería en nuestro JRE (Java Runtime Environment), y configurarlo como un proveedor de seguridad válido. Los pasos son los siguientes:

  1. Buscar el directorio de nuestro JRE
    Dependiendo de nuestro sistema operativo (Windows, Linux, o Mac OS), el directorio del JRE se encuentra en un sitio distinto. Llamaremos JRE_HOME a este directorio.

  2. Copiar la librería de Bouncy Castle en el siguiente directorio:
    JRE_HOME/lib/ext
    Yo he usado el fichero 'bcprov-jdk16-144.jar', que es la versión 1.44 de la librería, compilada para Java 6.

  3. Editar el archivo JRE_HOME/lib/security
    El contenido será algo como esto:

    security.provider.1=sun.security.provider.Sun
    security.provider.2=sun.security.rsa.SunRsaSign
    security.provider.3=com.sun.net.ssl.internal.ssl.Provider
    security.provider.4=com.sun.crypto.provider.SunJCE
    security.provider.5=sun.security.jgss.SunProvider
    security.provider.6=com.sun.security.sasl.Provider
    security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
    security.provider.8=sun.security.smartcardio.SunPCSC

    Sólo tendremos que añadir una línea más, añadiendo nuestro nuevo proveedor de seguridad, quedando de la siguiente forma:

    security.provider.1=sun.security.provider.Sun
    security.provider.2=sun.security.rsa.SunRsaSign
    security.provider.3=com.sun.net.ssl.internal.ssl.Provider
    security.provider.4=com.sun.crypto.provider.SunJCE
    security.provider.5=sun.security.jgss.SunProvider
    security.provider.6=com.sun.security.sasl.Provider
    security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
    security.provider.8=sun.security.smartcardio.SunPCSC
    security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider

    Nota: Como puedes observar, nosotros hemos añadido nuestro nuevo proveedor en la posición 9, pero esto puede variar de un sistema a otro. Hay que añadirlo el último.

Y eso sería todo! La verdad es que no me gusta mucho esta forma de instalar Bouncy Castle, porque me parece excesivo tener que copiar ficheros a nuestro JRE y tocar archivos de configuración del mismo. Creo que es pedirle demasiado a la persona que quiera probar nuestra aplicación. Pero por otro lado, reconozco que esta forma es la que menos problemas da, y en instalaciones de producción esta podría ser una buena solución. Hay que tener en cuenta que de esta forma estamos instalando el proveedor de seguridad a nivel de la máquina virtual, es decir, cualquier aplicación Java que ejecutemos en nuestro sistema tendrá acceso a la librería Bouncy Castle (en tiempo de ejecución).

De forma dinámica

Consiste en poner al principio de nuestro código una instrucción del tipo:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
...
Security.addProvider(new BouncyCastleProvider());

Esta forma, cuando nuestra aplicación es una aplicación de escritorio (una aplicación JavaSE), es la más sencilla de todas, ya que sólo tendremos que asegurarnos que la librería de Bouncy Castle (fichero .jar) esté en nuestro CLASSPATH, es decir, no sería necesario instalar la librería en nuestro JRE. Como se puede observar, de esta forma estaremos inicializando la librería a nivel de aplicación, es decir, cada una de las aplicaciones tendría que inicializar la librería de la forma antes descrita, de forma independiente.

¿Pero que pasa si nuestra aplicación es una aplicación Web y tiene que funcionar en un servidor de aplicaciones como JBoss? En este caso la instrucción anterior afectará también al resto de aplicaciones instaladas en el servidor (ya que supongo que todas comparten el mismo ClassLoader), es decir, si una aplicación inicializa la librería, el resto de aplicaciones en el servidor también verán el proveedor Bouncy Castle como un proveedor disponible. Pero el problema no es ese, el problema es que si una aplicación intenta utilizar la librería Bouncy Castle, habiendo ésta sido inicializada en otra aplicación Web distinta, obtendremos el temido mensaje de: "JCE cannot authenticate the provider BC".

¿Como solucionamos esto? La solución consiste en no añadir la librería (fichero .jar) en el interior de nuestras aplicaciones Web (ficheros .war), sino de instalarla de forma global, en la propia instancia de JBoss. Para ellos sólo tendremos que seguir los siguientes pasos:

  1. Instalar la librería de Bouncy Castle (en nuestro caso el fichero 'bcprov-jdk16-144.jar') en el directorio:
    JBOSS_HOME/server/INSTANCIA/lib
    Donde JBOSS_HOME es el directorio donde tenemos instalado JBoss, e INSTANCIA es la instancia del servidor JBoss que estamos usando, normalmente 'default'.
  2. En el código de nuestra aplicación Web, antes de utilizar cualquier función de la librería, escribir el siguiente código:

    // Inicializa el Proveedor de Seguridad BouncyCastle
    if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME)==null)
    {
    BouncyCastleProvider BC_provider = new BouncyCastleProvider();
    Security.addProvider(BC_provider);
    System.out.println("Cargado " + BC_provider.getInfo());
    }

Y eso es todo! Observa que aquí la librería se ha instalado a nivel del servidor de aplicaciones (JBoss) y todas las aplicaciones Web que corran sobre él no tendrán problemas para acceder al proveedor de seguridad.

Nota para usuarios de Eclipse: Como he comentado antes, la librería (fichero .jar) de Bouncy Castle no puede quedar en el archivo .WAR. Por lo tanto, no debéis copiar la librería en el directorio WebContent/WEB-INF/lib del proyecto. Sin embargo, sí debéis poner la librería en el CLASSPATH del proyecto, para la aplicación compile correctamente.

sábado, 25 de abril de 2009

Instalar Memcached en Mac OS X

Memcached es un sistema distribuido de memoria caché, genérico y de alto rendimiento, usado para aumentar la eficiencia de aplicaciones web dinámicas.

Lo que se pretende es reducir la carga que se realiza sobre la Base de Datos, sobretodo en sistemas distribuidos, donde los tiempos de propagación de la información pueden llegar a ser bastante altos.

En este artículo veremos cómo instalar el sistema en Mac OS X, que es prácticamente igual que el proceso de instalación en Linux.

Antes de empezar, decir que es necesario tener instalado las Xcode Tools de Apple, las cuales se encuentran en el DVD de instalación de Mac OS X, o que podemos descargar de Apple Developer Connection. El motivo es que necesitamos el compilador gcc y todas las librerías necesarias para compilarlo todo.

Instalar libevent

Memcached depende de la librería de notificación de eventos libevent, por lo que lo primero que tenemos que hacer es descargarnos e instalar la última versión estable de la misma:

La página oficial de libevent es: http://www.monkey.org/~provos/libevent/

En el momento de escribir este artículo, la última versión estable de libevent es la 1.4.10. Podemos descargar el código fuente desde la página web, o directamente con el comando:

curl -O http://www.monkey.org/~provos/libevent-1.4.10-stable.tar.gz

Una vez descargado el fichero, lo descomprimimos con el comando:

tar xfz libevent-1.4.10-stable.tar.gz

Tras esto, nos metemos en la carpeta que se ha creado (libevent-1.4.10-stable), y tecleamos los siguientes comandos para compilar e instalar la librería:

./configure --prefix=/usr/local
make
sudo make install

Para el último comando se nos pedirá la contraseña de administrador. Si no ha habido ningún problema, se habrá instalado la librería en el directorio /usr/local

Nota: Para desinstalar libevent sólo tendremos que introducir el comando:

sudo make uninstall

Instalar memcached

Después de instalar libevent, pasamos ya ha instalar memcached. La página oficial es: http://www.danga.com/memcached/

En el momento de escribir este artículo, la última versión estable de memcached es la 1.2.8. Podemos descargarla desde la página web, o directamente con el comando:

curl -O http://www.danga.com/memcached/dist/memcached-1.2.8.tar.gz

Una vez descargado el fichero con el código fuente, lo descomprimimos con el comando:

tar xfz memcached-1.2.8.tar.gz

Tras esto, nos metemos en la carpeta que se ha creado (memcached-1.2.8), y tecleamos los siguientes comandos para compilar e instalar el sistema:

./configure --prefix=/usr/local
make
sudo make install

Para el último comando se nos pedirá la contraseña de administrador. Si no ha habido ningún problema, se habrá instalado el sistema en el directorio /usr/local

Nota: Para desinstalar memcached sólo tendremos que introducir el comando:

sudo make uninstall

Arrancar memcached

Si memcached se ha instalado correctamente podremos escribir lo siguiente para conocer las distintas opciones de las que dispone:

memcached -h

Para arrancar memcached tendríamos que introducir algo como:

memcached -d -m 2048 -l 10.0.0.40 -p 11211

Esto arrancaría memcached, haciendo uso de un máximo de 2GB de RAM, y escuchando en la IP 10.0.0.40, puerto 11211.

miércoles, 4 de abril de 2007

Nuevos firmwares para el LVS de Linksys

Después de un tiempo sin muchos cambios, hoy 4 de Abril, ha habido una actualización general de los firmwares para los productos del Sistema de Voz Linksys (LVS)

  • Linksys SPA-9000/9000T: Actualizado a versión 5.1.7
    Por lo que veo en la lista de cambios, quizá se solucionen algunos problemillas con las líneas compartidas, y los problemas que tuve para registrar un Cisco 7960. Habrá que probarlo. Pero, ¿para cuando se va a permitir los registros de clientes remotos sin necesidad de usar una VPN?
    (Zona de Descargas) (Lista de cambios)

  • Linksys SPA-3102: Actualizado a versión 5.1.7
    Algunas correcciones. Poco más se le puede pedir a un producto tan veterano como este.
    (Zona de Descargas) (Lista de cambios)

  • Linksys SPA-2102: Actualizado a versión 5.1.9
    ¿Por qué 5.1.9 y no 5.1.7? Mismas correcciones que en el SPA3102
    (Zona de Descargas) (Lista de cambios)

  • Linksys SPA-400: Actualizado a versión 1.0.0.9
    Según la lista de cambios, sólo han corregido un pequeño problema. Esperábamos mucho más de esta nueva actualización, ¿para cuando se va a poder elegir el FXO en las llamadas salientes?
    (Zona de Descargas) (Lista de cambios)

  • Linksys SPA-922/942: Actualizado a versión 5.1.7
    Correcciones varias (volumen del auricular, lineas compartidas, etc)
    (Zona de Descargas) (Lista de cambios)

  • Linksys SPA-962: Actualizado a versión 5.1.7
    Gran cantidad de bugs corregidos, y añadido lector de noticias RSS ! :P
    (Zona de Descargas) (Lista de cambios)
En los próximos días probablemente lleguen las actualizaciones del SPA921/941, y del PAP2T. Así que ya sabéis, a actualizar toca ;)

martes, 3 de abril de 2007

Nuevo curso LVS en Madrid


En los días 9 y 10 de Mayo se celebrará el próximo curso de formación "Linksys Voice System", impartido por Avanzada 7 y que tendrá lugar de nuevo en Madrid.

Como en ocasiones anteriores, el curso será de unas 15 personas, que formarán grupos de 3 o 4. Cada grupo dispondrá de un sistema LVS completo, formado por un SPA9000, un SPA400, y 3 SPA921/SPA941 para que realicen las prácticas.

Tras superar el examen final de aptitud se obtendrá el reconocimiento por parte de Linksys como técnico integrador capacitado de Soluciones LVS, que es requisito imprescindible para trabajar con este tipo de soluciones a corto/medio plazo.

Aún no se sabe el lugar exacto donde se celebrará el curso. En cuanto sepa algo os informo ;)

Para más información: linksys@avanzada7.com

jueves, 29 de marzo de 2007

Dispositivos Linksys que soportan T.38

Para los que le interese, estos son los dispositivos de Linksys que soportan el protocolo T.38 para el envío de Faxes:
  • SPA-2100: ATA con 2 puertos FXS y router.
  • SPA-2102: ATA con 2 puertos FXS y router.
  • SPA-3102: ATA con 1 FXS, 1 FXO, y router.
  • SPA-9000: PBX de hasta 16 extensiones, 2 puertos FXS, y router.
Recordar que no basta con que el dispositivo soporte T.38, también lo tiene que soportar nuestro servidor SIP (o proveedor de telefonía IP). Asterisk lo soporta a partir de la versión 1.4

miércoles, 28 de marzo de 2007

Conectar teléfono VoIP a la red wifi

Tras comprarme el Cisco 7960 y querer ponerlo en mi escritorio me surgió el problema de conectarlo al router ADSL de mi casa para que tuviese conexión a Internet. Así puedo tener una línea registrada en el Asterisk de la oficina, otra en voipbuster, otra en voztelecom, etc.

El router ADSL esta en otra habitación y, puesto que no tengo cableada mi casa con cable de red, la solución pasaba por una conexión wifi. El teléfono dispone sólo de conexión de red Ethernet (no wifi), por lo que se necesita de algún tipo de dispositivo que haga de bridge entre la conexión wifi y la conexión ethernet del teléfono.

La primera solución que se me ocurrió fue usar como intermediario un ordenador con tarjeta wifi y con tarjeta de red, como por ejemplo mi portátil. En Windows XP no hay nada más sencillo: sólo tenemos que seleccionar la conexión ethernet y la conexión wifi, pulsar con el botón derecho del ratón, y seleccionar 'Conexiones de puente'.


Tras esto ya tendremos nuestra conexión puente entre los dos interfaces de red. Sólo tendremos que editar sus propiedades TCP/IP para ponerla como cliente DHCP, IP fija, o como queramos.


Pero como comprenderéis, esta solución no es la más adecuada para una instalación permanente. Sólo nos sirve para salir del paso y hacer algunas pruebas.

Linksys tiene un dispositivo para hacer esta tarea para su gama de teléfonos VoIP. Es el llamado Wireless-G Bridge for Phone Adapters (WBP54G)

Aunque creo que no es muy caro, decidí no comprarlo por varios motivos:
  • Es demasiado específico de productos Linksys. Funciona con cualquier producto Linksys de 5V (PAP2, SPA1001, SPA2000, SPA2100, SPA3000, SPA9000, y los teléfonos SPA9xx). Hay que conectar la fuente de alimentación que viene con estos dispositivos al WBP54G, y de éste último sale un cable para alimentar el dispositivo final, por ejemplo, el teléfono.

  • Es poco configurable. Por lo que he visto, se configura con un asistente que viene en el CD, y no puede accederse vía web para configurar los parámetros 'a mano'.

  • Por lo que parece, aún no se comercializa en España.

Por tanto, el siguiente paso fue desempolvar mi viejo router WRT54G de Linksys y configurarlo para que hiciese de bridge entre la conexión wifi de mi casa y switch de 4 puertos ethernet que tiene incorporado.

Por defecto, los router de Linksys sólo permiten configurar su conexión wifi en modo 'Access Point'. Si queremos ponerlo en modo 'Bridge' o 'Repeater' no tendremos más remedio que flashear nuestro querido router con alguna distribución de Linux de las que existen por ahí.

Este tipo de distribuciones incorporan en el router funcionalidades avanzadas que originalmente no tenían. Yo en concreto le he instalado la distribución DD-WRT que, entre otros muchas cosas, añade las siguientes mejoras: El Kai Daemon para la Kai Console Gaming network, WDS, protocolos wireless para bridging/repeating, autentificación Radius para una comunicación wireless más segura, control de Quality of Service (QoS) para la asignación del ancho de banda, soporte software para la incorporación de tarjetas SD (mediante modificación del hardware), etc....

La lista de routers que se pueden flashear con esta distribución de Linux es bastante extensa, y podéis consultarla aquí. Opcionalmente, hay una versión de esta distribución específica para VoIP, que incorpora el proxy SIP SIPatH. También hay una versión específica para funcionar con Open VPN. Yo de momento tengo instalada la versión Standard, pero tengo que probar la versión VoIP en cuanto tenga tiempo :)

Bueno, y así es como lo tengo de momento, el router WRT54G conectado al wifi de mi casa, y el teléfono Cisco conectado con cable ethernet al router. Además, esta solución me permite conectar, a parte del teléfono, muchos más dispositivos a la red wifi de mi casa. Sólo tengo que conectarlos al switch del WRT54G.

IMG_0180

sábado, 3 de marzo de 2007

Configurar un PAP2 / PAP2T para conectar un FAX

Es mucha la gente interesada en conectar un FAX a un Servidor SIP, ya sea a un proveedor de telefonía por Internet, a un servidor Asterisk, a un SPA9000, o a cualquier otro tipo de proxy SIP. Una posible opción es utilizar un PAP2 o PAP2T de Linksys, que es un dispositivo con dos puertos FXS, por lo que nos permite registrar hasta dos teléfonos analógicos o máquinas de Fax a nuestro Servidor SIP.

Enviar faxes por VoIP ha sido siempre un tema bastante delicado debido a que al no existir retransmisiones, cualquier pequeño corte en la comunicación hace que se pierda el envío del fax. El problema se agrava si tenemos en cuenta que técnicas como la supresión de silencios, supresión de eco, cancelación de eco, y codecs con gran factor de compresión, pueden alterar de tal forma el sonido transmitido que también perdamos la comunicación entre los dos faxes.

Actualmente está empezando a utilizarse un nuevo protocolo para el envío de faxes por Internet. Es el llamado T.38 (Fax over IP), que intenta solucionar muchos de estos problemas . Sin embargo no todos los Servidores SIP soportan todavía este nuevo protocolo (Asterisk lo soporta a partir de la nueva versión 1.4.0).

Además, el PAP2T, del que trata este tutorial, aún NO soporta el protocolo T.38 (aunque es posible que se implemente en futuras versiones del firmware), por lo que emplearemos la técnica de hacer un 'passthrough' cuando detectemos un envío/recepción de Fax.


Una máquina de fax, cuando establece la llamada, emite un tono CNG (un tono corto a 1100Hz que se repite periódicamente), y la máquina de fax del otro extremo contesta con un todo CED (un tono largo y agudo de 2100Hz). Hay que configurar el PAP2T para que cuando detecte uno de estos tonos (CED o CNG) la línea correspondiente entre en modo 'fax/modem passthrough'. Cuando el PAP2T entra en modo passthrough se realizan automáticamente las siguientes acciones:

  1. Cambiar al codec G711 (y mandar también un evento NSE al otro extremo si es necesario)
  2. Desactivar el cancelador de eco.
  3. Desactivar la supresión de silencios.
  4. Desactivar las llamadas en espera.
  5. Incrementar el tamaño del 'jitter buffer' a 100ms e impedir que disminuya.

Todos estos cambios permanecerán hasta que finalice la llamada actual. Si la unidad recibe un evento NSE desde el otro extremo, también pasará al modo fax/modem passthrough.

En este tutorial supondremos que el lector conoce ya el PAP2T de Linksys y sabe acceder vía web al dispositivo para configurar cuestiones básicas como asignarle una IP, registrarlo en un Servidor SIP, etc. Únicamente nos centraremos en los parámetros necesarios para configurar correctamente la conexión con un fax.

En primer lugar, es altamente recomendable que actualicemos el firmware del PAP2T a la última versión disponible. Tras esto, entraremos a configurar el dispositivo vía web en modo Administrador Avanzado, y nos dirigiremos a la pestaña de ‘Line 1’ o ‘Line 2’ dependiendo de si hemos conectado el fax en el puerto ‘Phone 1’ o ‘Phone 2’ del PAP2T respectivamente. En esta pestaña configuraremos el apartado 'Audio Configuration' de la siguiente forma:


PAP2T_FAX_AudioConfiguration

También es conveniente configurar correctamente los parámetros regionales de dicha línea. Si estamos en España tendríamos que configurar los siguientes parámetros:

En la misma pestaña, en la sección ‘FXS Port Polarity Configuration

PAP2T_FXSPortPolarity

Y en la pestaña ‘Regional’, habría que ajustar los siguientes parámetros:


PAP2T_RingToneSpec

PAP2T_Miscellaneous

Esto debería ser suficiente para enviar y recibir faxes sin problemas con nuestro PAP2T.