martes, 26 de marzo de 2013

Consumir webservices bajo Https en Java

Usualmente cuando desarrollamos aplicaciones en Java que van a hacer uso de recursos seguros (como en este caso, consumir webservices a través de un canal cifrado), debemos asegurarnos de tener instalados los certificados digitales necesarios puesto que al ser Java un lenguaje multiplataforma, no utiliza los certificados alojados en el sistema operativo [1]. Es por esa razón que decidí escribir este artículo dedicado a este tema. Los pasos para realizar esto los voy a detallar a lo largo de este post, en donde así mismo mostraré un ejemplo práctico. Bueno... ¡manos a la obra!

Descargando el certificado digital:
El Keysotre o JKS (Java Key Store) es un repositorio de certificados de seguridad, certificados de autorización o certificados de clave pública, utilizados por ejemplo en el cifrado SSL. Usualmente el JDK contiene un almacén de claves de certificados de autorización (CA) en la ruta jre/lib/security/cacerts. Así mismo el JDK provee una herramienta llamada keytool para manipual el keystore.
Para importar un certificado a nuestro keystore, lo primero que debemos hacer es descargar  dicho certificado desde la dirección url del wsdl. En este caso les mostraré cómo se hace utilizando el navegador Google Chrome por ser uno de los más populares (Y espero que no me condenen por lo último dicho). Bueno, accedemos al wsdl mediante la url tal como se muestra en la siguiente imagen:

Ahora hacemos clic en el candado verde y se desplegará un panel con dos pestañas. Debemos posicionarnos en la pestaña Conexión como muestro a continuación:


Ahora hacemos clic en Datos del certificado y se abrirá la siguiente ventana:


En la ventana anterior debemos hacer clic en el botón Copiar en archivo... para importar el certificado. Esto nos abrirá un asistente (el clásico siguiente-siguiente) tal como se muestra en la imagen siguiente:


Hacemos clic en Siguiente> y vamos a la siguiente imagen:


Seleccionamos X.509 codificado base 64 (.CER) y hacemos clic en Siguiente>. Ahora toca seleccionar la ruta donde queremos guardar nuestro certificado, en el caso de la imagen he seleccionado el escritorio. Elegimos la carpeta que gustemos y hacemos clic en Siguiente>.


Ahora solo nos falta hacer clic en el botón finalizar de la siguiente ventana:


Con esto ya tenemos el certificado, ahora solo hace falta importarlo a nuestro keystore, para lo cual haremos uso del keytool. 

Importando el certificado digital a nuestro keystore:
Para importa el certificado digital descargado a nuestro keystore vamos a usar el keytool (del cual ya les comenté al principio de este post) que se encuentra ubicado en: ..\Java\jdk1.6.0_23\jre\bin tal como se muestra en la siguiente imagen.


Lo que debemos hacer es llamar a la herramienta keytool.exe desde una consola, con el siguiente comando: 

keytool -import -keystore "C:\Archivos de programa\Java\jre1.6.0_05\lib\security\cacerts" -file c:\NuevaEntidadCertificadora.cer -alias CA_SRI -storepass changeit

En donde las partes de color azul son valores relativos de: nuestra instalación de java, la ruta en donde descargamos nuestro certificado y el alias que le asignaremos y que debe ser único.
Lo primero que debemos recordar es que debemos ejecutar la consola de windows como administrador ya que vamos a sobreecribir un archivo en una carpeta con privilegios especiales. Para hacer esto debemos ejecutar la consola tal como se muestra en la siguiente imagen:


Luego ejecutamos el comando que se mencionó anteriormente:


E indicamos que confiamos en el certificado que vamos a agregar con un si.


Descargando el wisdel:
Ahora solo resta descargar el wsdl, para lo cual ejecutamos los tres sencillos pasos que detallo a continuación en imágenes:




Creando el proyecto en netbeans:
Creamos una sencilla aplicación de escritorio y luego agregamos un nuevo cliente para consumir el webservice.


Seleccionamos el wisdel que hemos descargado anteriormente.


Y con eso nos deberá generar una estructura similar a la mostrada en la siguiente imagen:


Luego de eso, debemos agregar la siguiente clase que contiene el método main que nos servirá para poder probar la aplicación.
package com.rolandopalermo.ejemplos.test;

import com.rolandopalermo.ejemplos.RespuestaSolicitud;

/**
 *
 * @author Rolando
 */
public class Main {

    private static RespuestaSolicitud validarComprobante(byte[] xml) {
        com.rolandopalermo.ejemplos.RecepcionComprobantesService service = new com.rolandopalermo.ejemplos.RecepcionComprobantesService();
        com.rolandopalermo.ejemplos.RecepcionComprobantes port = service.getRecepcionComprobantesPort();
        return port.validarComprobante(xml);
    }

    public static void main(String[] args) {
        System.setProperty("javax.net.ssl.keyStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts");
        System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
        System.setProperty("javax.net.ssl.trustStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts");
        System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
        RespuestaSolicitud respuesta = validarComprobante(null);
        System.out.println(respuesta.getEstado());
    }
}
Y con eso ejecutamos la aplicación recibiendo una respuesta lo que nos indica que nuestra aplicación ha funcionado correctamente.


Es muy imporatnte indicar que el método main deberá contener las siguientes líneas de código lo cual le indicará a la aplicación en dónde se encuentra nuestro repositorio de certificados.
System.setProperty("javax.net.ssl.keyStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Espero que este artículo les sea de utilidad y cualquier pregunta no duden en comentarla. Saludos y hasta una próxima oportunidad.

Y para los interesados, brindamos asesoría en el tema de facturación electrónica. El temario del taller lo pueden descargar aquí: Temario del Taller.

lunes, 25 de marzo de 2013

Cálculo del dígito verificador utilizando la función Módulo11

El código de control es un mecanismo de detección de errores utilizado para verificar la corrección de un dato, generalmente en soporte informático [1]. Los dígitos de control o dígitos verificadores se usan principalmente para detectar errores en el tecleo o transmisión de los datos. Generalmente consisten en uno o más caracteres numéricos o alfabéticos añadidos al dato original y calculados a partir de éste mediante un determinado algoritmo. Algunos de los ejemplos de uso frecuentes son los números de identificación personal, códigos de barras, tarjetas de crédito y códigos bancarios, como es el caso del Sistema de Rentas Internas (SRI) del Ecuador que utiliza el dígito de verificación como parte de su clave de acceso dentro del proceso de solicitud de números de autorización utilizando el mecanismo del Módulo 11.
Módulo 11
En el caso del SRI el dígito verificador será aplicado sobre toda la clave de acceso (48 dígitos) y deberá ser incorporado por el contribuyente a través del método denominado Módulo 11, con un factor de chequeo ponderado (2), este mecanismo de detección de errores, será verificado al momento de la recepción del comprobante. Cuando el resultado del dígito verificador obtenido sea igual a once (11), el digito verificador será el cero (0) y cuando el resultado del dígito verificador obtenido sea igual a diez 10, el digito verificador será el uno (1).

Como podemos ver en la figura siguiente, el dígito verificador forma parte de la estructura que debemos enviarle al WS del SRI. Para este ejemplo les mostraré una manera de implementar dicha función a través de un método en Java.


El algoritmo deberá realizar el siguiente procedimiento:

public class Modulo11 {

    public String invertirCadena(String cadena) {
        String cadenaInvertida = "";
        for (int x = cadena.length() - 1; x >= 0; x--) {
            cadenaInvertida = cadenaInvertida + cadena.charAt(x);
        }
        return cadenaInvertida;
    }

    public int obtenerSumaPorDigitos(String cadena) {
        int pivote = 2;
        int longitudCadena = cadena.length();
        int cantidadTotal = 0;
        int b = 1;
        for (int i = 0; i < longitudCadena; i++) {
            if (pivote == 8) {
                pivote = 2;
            }
            int temporal = Integer.parseInt("" + cadena.substring(i, b));
            b++;
            temporal *= pivote;
            pivote++;
            cantidadTotal += temporal;
        }
        cantidadTotal = 11 - cantidadTotal % 11;
        return cantidadTotal;
    }

    public static void main(String args[]) throws Exception {
        Modulo11 a = new Modulo11();
        System.out.println(a.obtenerSumaPorDigitos(a.invertirCadena("41261533")));
    }
}
Espero que esta explicación les sea de utilidad y cualquier consulta no duden en comentarla. Saludos.

Y para los interesados, brindamos asesoría en el tema de facturación electrónica. El temario del taller lo pueden descargar aquí: Temario del Taller.

martes, 19 de marzo de 2013

Consulta de nombres de contribuyentes al SRI utilizando soapUI

Muchas veces necesitamos interactuar con sistemas externos para validar ciertos datos. En este post voy a mostrarles la forma de cómo obtener la razón social de una empresa a partir de su número de R.U.C mediante una interacción con el sitio del SRI a través de webservices. El servicio web se encuentra publicado a través del portal de un tercero en la siguiente dirección: http://merlyna.com/merlyna/abc/webserviceSRI-RegistroCivil.php.
Lo único que tenemos que hacer utilizar una versátil herramienta para consumir el webservice mencionado anteriormente. La aplicación se llama soapUI y la podemos descargar desde su sitio en sourceforge o haciendo clic en el siguiente enlace: http://sourceforge.net/projects/soapui/files/soapui/4.5.1/soapUI-x32-4.5.1.exe/download. Una vez descargado e instalado vamos a seguir los siguientes pasos:

Figura 1. Entorno de trabajo de soapUI 4.5.1
El WDSL es el siguiente: http://merlyna.com/merlyna/abc/webserviceSRI-RegistroCivil.php?wsdl

Figura 2. Asistente para la creación de proyectos de soapUI 4.5.1
Al finalizar el asistente, el árbol de nuestro proyecto quedará tal como se muestra en la Figura 3. Los ejemplos de prueba son creados con nombres por defecto tales como Request 1 y solo bastaría hacer doble clic sobre uno de ellos para proceder a consumir el webservice. En este ejemplo utilizaremos el segundo webservices, el cual tiene está designado como nombreRUCSRI.

Figura 3. Proyecto de prueba para la consulta de nombres al SRI
Ahora hay que reemplazar el caracter '?' por los valores que queremos enviarles. En nuestro caso, para poder consultar el nombre del contribuyente, solo tenemos que cambiar el primer valor y luego enviar nuestra consultar haciendo clic en el botón . La Figura 4 ilustra este escenario.

Figura 4. Resultado de la consulta al webservice para obtener el nombre de contribuyentes al SRI. Solo tenemos que enviarle el número de R.U.C. el cual se encuentra subrayado en rojo en el lado izquierdo de la imágen; el resultado también se encuentra subrayado en rojo en el lado derecho.
Y para los interesados, brindamos asesoría en el tema de facturación electrónica. El temario del taller lo pueden descargar aquí: Temario del Taller.

Espero que este ejemplo les sea de utilidad, no duden en comentar sus dudas y experiencias. Hasta una próxima oportunidad.

Cómo conectarse a una base de datos en PostgreSQL utilizando JDBC

PostgreSQL es, hoy por hoy, uno de los mejores manejadores de base de datos relacionales libres y, desde mi particular punto de vista, una mejor opción frente a MySQL. Bueno, en esta oportunidad voy a mostrarles la manera de cómo conectarse a una base de datos en PostgreSQL utilizando Java y su biblioteca JDBC. 

Como pre-requisito debemos tener creada nuestra base de datos utilizando Pgadmin llamada 'test' luego de lo cual debemos ejecutar el siguiente script:

CREATE TABLE usuarios
(
  nombres text,
  apellidos text,
  id serial NOT NULL,
  CONSTRAINT usuarios_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE usuarios
  OWNER TO postgres;
Una vez creada nuestra base de datos es momento de relizar la conexión; para esto debemos agregar el conector que nos brinda PostgreSQL en el siguiente enlace: http://jdbc.postgresql.org/ y anexarlo a nuestro proyecto tal como se muestra en la siguiente figura:
Figura. Vista del árbol de dependencias de un proyecto en Netbeans
La clase ConexionSQL debe quedar como se muestra a continuación:

package biz.csti.pg;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 *
 * @author Rolando
 */
public class ConexionSQL {

    static String cadenaConexion = "jdbc:postgresql://127.0.0.1/test?" + "user=postgres&password=admin";

    public static void main(String[] arg) {
        Connection conexion = null;
        Statement sentencia = null;
        ResultSet resultado = null;
        try {
            Class.forName("org.postgresql.Driver");
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
            String consultaSQL = "SELECT * FROM USUARIOS";
            resultado = sentencia.executeQuery(consultaSQL);
            while (resultado.next()) {
                Long id = resultado.getLong("id");
                String nombres = resultado.getString("nombres");
                String apellidos = resultado.getString("apellidos");
                System.out.println(id + "t" + nombres + "t" + apellidos);
            }
        } catch (Exception e) {
            e.printStackTrace();
            conexion = null;
        } finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
Como podemos observar la manera de conectarse es bastante intuitiva, lo único que debemos cambiar es la contraseña en la cadena de conexión siguiente: 'jdbc:postgresql://127.0.0.1/test?" + "user=postgres&password=<contraseña>'. Espero que este ejemplo les sea de utilidad, muy pronto estaré presentando más cosas relacionadas a este gestor de base de datos.

martes, 12 de marzo de 2013

Cómo hacer que la imagen de fondo cubra toda la pantalla

Desarrollando un proyecto personal me topé con la necesidad de poder establecer una imagen como fondo de una página web de tal manera que ésta pueda ocupar todo el tamaño de la pantalla. Exiten muchas formas de hacerlo, incluso utilizando JQuery, sin embargo en esta oportunidad quiero presentarles una manera de hacerlo sin la necesidad de utilizar un framework como el mencionado anteriormente, ni javascript y menos flash.

La primera manera de hacerlo es simplemente agregando los siguientes estilos en la sección 'head' de nuestro archivo.
<style type="text/css">
    html, body {
        height: 100%;
        width: 100%;
        padding: 0;
        margin: 0;
    }

    #full-screen-background-image {
        z-index: -999;
        width: 100%;
        height: auto;
        position: fixed;
        top: 0;
        left: 0;
    }
</style>
Luego de esto debemos indicar cual será la imagen que usaremos de fondo, de la siguiente manera:
<body>
    <img alt="full screen background image" src="img/background.jpg" id="full-screen-background-image" /> 
</body>
Otra manera de hacerlo utilizando CSS3 es la siguiente:
html {
    background: url(img/background.jpg) no-repeat center center fixed;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;
}
Y los resultados son los siguientes:

Figura. Imágen de fondo a pantalla completa en navegador Chrome
Y si tienen algún problema con Opera, les recomiendo el siguiente enlace: http://dev.opera.com/articles/view/css3-border-background-boxshadow/. Espero que este artículo les sea de utilidad, me despido hasta una siguiente oportunidad.

Saludos.