Ir a contenido principal

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

La primera vez que se registra en developerWorks, se crea un perfil para usted. Información sobre su perfil (nombre, país/región y compañia) estará disponible al público y acompañará cualquiera de sus publicaciones. Puede actualizar su cuenta IBM en cualquier momento.

Toda la información enviada es segura.

  • Cerrar [x]

La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

Toda la información enviada es segura.

  • Cerrar [x]

Crear un cliente SOAP seguro para J2ME, Parte 2: Mejorar clases de stub en APIs de servicios web (WSA) para J2ME

Implementación de algoritmos de seguridad

Bilal Siddiqui, Ingeniero Electrónico
Bilal Siddiqui es ingeniero electrónico, consultor XML y fundador de XML4Java.com, una empresa dedicada a simplificar el comercio electrónico. Luego de graduarse en 1995 en Ingeniería Electrónica en la Universidad de Ingeniería y Tecnología de Lahore, Bilal comenzó a diseñar soluciones de software para sistemas de control industrial. Luego, se volcó a XML y se valió de su experiencia en programación en C++ para construir herramientas de procesamiento XML basadas en Web y Wap, soluciones de análisis del extremo del servidor y aplicaciones de servicios. Bilal es evangelista tecnológico y un autor técnico muy publicado.

Resumen:  En esta serie de tutoriales de tres partes, usted aprenderá cómo crear un cliente seguro de servicios web basado en Java™ 2, Micro Edition (J2ME). Esta segunda entrega considera las clases de stub para un servicio de correo electrónico seguro y explica cómo mejorarlas para proporcionar características de seguridad. También exploramos en detalle algunos algoritmos importantes de seguridad y mostramos cómo implementarlos en un dispositivo J2ME.

Ver más contenido de esta serie

Fecha:  05-08-2011
Nivel:  Intermediaria

Actividad:  5924 vistas

Sección 2. Explorar el servicio de correo electrónico seguro

El servicio de correo electrónico seguro

La Parte 1 de este tutorial explicó el funcionamiento de las clases de stub de WSA considerando dos aplicaciones de muestra llamadas “servicio de correo electrónico simple” y “servicio de correo electrónico extendido”. Discutimos estas aplicaciones de muestra en detalle y concluimos la Parte 1 de este tutorial introduciendo un nombre de “servicio de correo electrónico seguro”, que es una forma segura del servicio de correo electrónico extendido.

El archivo WSDL para el servicio de correo electrónico seguro se incluyó en la Parte 1. Comencemos con una explicación de cómo el WSDL del servicio de correo electrónico seguro (ver Parte 1, Listado 23) es diferente del archivo WSDL del servicio de correo electrónico extendido (ver Parte 1, Listado 19.)

Servicio de correo electrónico seguro frente a extendido

Tanto el servicio de correo electrónico seguro como extendido definen dos operaciones de servicio web, getSubjects y getMessage.

Hay sólo dos diferencias entre los archivos WSDL de los dos servicios de correo electrónico:

1. La sección de tipos de datos de archivo WSDL para el servicio de correo electrónico seguro contiene la definición de un elemento Signature..
El elemento Signature se ha copiado al Listado 1. El elemento Signature lleva la información de autenticación del usuario que intenta acceder al servicio de correo electrónico seguro. El servicio de correo electrónico extendido no tenía el elemento Signature.


Listado 1. Definición del elemento Signature (Firma) para el servicio de correo electrónico seguro

<xsd:complexType name="Signature"> <xsd:sequence> <xsd:element name="SignedInfo"> <xsd:complexType> <xsd:sequence> <xsd:element name="CanonicalizationMethod" type="xsd:string"/> <xsd:element name="SignatureMethod" type="xsd:string"/> <xsd:element name="Reference"> <xsd:complexType> <xsd:sequence> <xsd:element name="DigestMethod" type="xsd:string"/> <xsd:element name="DigestValue" type="xsd:string"/> <xsd:element name="URI" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="SignatureValue" type="xsd:string"/> <xsd:element name="KeyInfo"> <xsd:complexType> <xsd:sequence> <xsd:element name="KeyName" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType>

Discutiremos el elemento Signature más adelante en la sección Clases de stub para el tipo complejo de Signature.

2. Las llamadas de invocación de métodos getSubjects y getMessage del servicio de correo electrónico necesitan llevar una instancia del elemento Signature.
La instancia Signature se usará del lado del servidor para la autenticación. Esto se refleja en la sección de tipo de datos del archivo WSDL del servicio de correo electrónico seguro. Usted ya vio los tipos de datos de un archivo WSDL en la sección “WSDL components of the hotel Web service” [Componentes WSDL del servicio web de hotel] de la Parte 1.

El Listado 2 muestra la sección de tipos de datos del archivo WSDL de su servicio de correo electrónico seguro.


Listado 2. Sección de tipos de datos del archivo WSDL para el servicio de correo electrónico seguro

<types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace= "http://www.everydaywebservices.com/secureemailservice"> <xsd:element name="getSubjects"> <xsd:complexType> <xsd:sequence> <xsd:element name="senderEmailAddress" type="xsd:string"/> <xsd:element name="Signature" type="tns:Signature"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="getMessage"> <xsd:complexType> <xsd:sequence> <xsd:element name="subject" type="xsd:string"/> <xsd:element name="from" type="xsd:string"/> <xsd:element name="Signature" type="tns:Signature"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="subjectsList"> <xsd:complexType> <xsd:sequence> <xsd:element name="subjectLine" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="message"> <xsd:complexType> <xsd:sequence> <xsd:element name="subject" type="xsd:string"/> <xsd:element name="from" type="xsd:string"/> <xsd:element name="messageText" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="Signature"> <!-- Same as Listing 1 --> </xsd:complexType> </xsd:schema> </types>

Observe que el elemento Signature aparece como elemento secundario de las definiciones de tipos de complejo getSubjects y getMessage del Listado 2. La llamada de invocación de método getSubjects llevará el tipo de complejo getSubjects y el método getMessagellevará el tipo de complejo getMessage. Como el elemento Signature es parte de ambos tipos de complejo, aparecerá en ambas llamadas de invocación de método.


Simplificación del elemento Signature

Usamos la especificación XML Digital Signature (XMLDS) de W3C para incorporar las características de autenticación en aplicaciones WSA.

Una limitación de WSA al usar XMLDS se describe en la sección “Una limitación importante de WSA” de la Parte 1. La sección “Superar la limitación de WSA” de la Parte 1 explica cómo superar la limitación de WSA.

También introdujimos las siguientes simplificaciones al definir el elemento Signature en el Listado 1.

  1. La definición original del elemento Signature en XMLDS tienen muchos puntos de extensibilidad que permiten que los elementos de otros espacios de nombres y esquemas estén incrustados en un elemento Signature.
    Por ejemplo, XMLDS especifica un elemento xsd:Any dentro de su elemento KeyInfo, lo que significa que un documento de instancia puede contener cualquier elemento dentro de un elemento KeyInfo.
    En la definición de Signature del Listado 1, se han quitado todos los puntos de extensibilidad del elemento Signature. Esto se debe a que el cliente J2ME necesita componer una estructura fija y por lo tanto no necesita extensibilidad.
  2. XMLDS incluye una variedad de elementos para cubrir diferentes escenarios de aplicaciones. Por ejemplo, el elemento secundario KeyInfo del elemento Signature lleva información acerca de qué clave se usó para firmar un mensaje. XMLDS define varios tipos de elementos que se pueden colocar dentro del elemento KeyInfo. Dos de tales elementos son KeyName y X509Data.
    El elemento KeyName contiene el nombre de una clave. Por lo tanto, si usted desea identificar sus claves criptográficas por nombre, deberá usar el elemento KeyName.
    Si, por el contrario, usted quiere usar certificados X509 en lugar de nombres de clave, puede usar un elemento X509Data en lugar de un elemento KeyName. El elemento X509Data contendrá los datos del certificado en lugar del nombre de clave.

En esta serie de tutoriales usamos exclusivamente los nombres de clave para identificar claves criptográficas. Por lo tanto, el tipo complejo de Signature del Listado 1 sólo permite colocar un elemento, (KeyName), dentro de un elemento KeyInfo.

En resumidas cuentas, estamos tratando de simplificar el cliente WSA seguro sin comprometer su interoperabilidad con XMLDS.


Solicitudes SOAP seguras para el servicio de correo electrónico seguro

Mire el Listado 3, que muestra una solicitud SOAP segura (o una llamada de invocación de método SOAP seguro) para operaciones getSubjects.El Listado 3 contiene una instancia del elemento Signature según la definición Signature del Listado 1.


Listado 3. Solicitud SOAP segura para una operación getSubjects

<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://www.everydaywebservices.com/secureemailservice"> <soap:Body> <tns:getSubjects> <tns:senderEmailAddress> bob@mycompany.com </tns:senderEmailAddress> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <CanonicalizationMethod xmlns="http://www.w3.org/2000/09/xmldsig#"> http://www.w3.org/2000/09/xmldsig#rsa-sha1 </CanonicalizationMethod> <SignatureMethod xmlns="http://www.w3.org/2000/09/xmldsig#"> http://www.w3.org/2001/10/xml-exc-c14n# </SignatureMethod> <Reference xmlns="http://www.w3.org/2000/09/xmldsig#"> <DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#"> http://www.w3.org/2000/09/xmldsig#sha1 </DigestMethod> <DigestValue xmlns="http://www.w3.org/2000/09/xmldsig#"> gmwIRIS+Od1t7+kBmCEsflI4I3U= </DigestValue> <URI xmlns="http://www.w3.org/2000/09/xmldsig#"> //soap:Envelope/soap:Body/* </URI> </Reference> </SignedInfo> <SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#"> fWjfJqN7AV78v+Ye8B3qACRmhzC+FCXZT 5pEfmy+Um1/1I+EBOrTNxFPMyykBq3JhR </SignatureValue> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName xmlns="http://www.w3.org/2000/09/xmldsig#"> Alice </KeyName> </KeyInfo> </Signature> </tns:getSubjects> </soap:Body> </soap:Envelope>

El Listado 3 muestra tanto la estructura como los datos contenidos en la solicitud SOAP getSubjects. Examine las porciones del Listado 3 que se muestran en negrita. Éstas son las únicas porciones que se componen dinámicamente para cada solicitud getSubjects. El resto de la estructura será el mismo en todas las solicitudes getSubjects.

A continuación figura una explicación de cada una de las porciones dinámicas que se muestran en negrita en el Listado 3.

  1. Contenido del elemento senderEmailAddress, que especifica la dirección de correo electrónico del remitente que usted está buscando.
  2. Contenido del elemento DigestValue, que representa la forma codificada en base 64 de un valor implícito. Discutiremos el procedimiento para calcular el valor implícito en la sección Implementación del algoritmo implícito SHA-1 en J2ME y los detalles de la codificación en base 64 en la parte siguiente de este tutorial.
  3. Contenido del elemento SignatureValue, que representa la forma codificada en base 64 de una firma criptográfica. Discutiremos los detalles del cálculo del valor de firma en la parte siguiente de este tutorial.
  4. Contenido del elemento KeyName, que especifica el nombre de la clave criptográfica usada para firmar el mensaje. La autoría del elemento KeyName se explica en la sección Creación de una instancia GetSubjectsSignatureKeyInfo.

De manera similar, examinemos la solicitud SOAP segura para la operación getMessage que se muestra en el Listado 4. Usted puede identificar fácilmente las secciones dinámicamente compuestas del Listado 4 que se muestra en negrita.


Listado 4. Solicitud SOAP segura para la operación getMessage

<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://www.everydaywebservices.com/secureemailservice"> <soap:Body> <tns:getMessage> <tns:subject>Recent Project</tns:subject> <tns:from>bob@mycompany.com</tns:from> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <CanonicalizationMethod xmlns="http://www.w3.org/2000/09/xmldsig#"> http://www.w3.org/2000/09/xmldsig#rsa-sha1 </CanonicalizationMethod> <SignatureMethod xmlns="http://www.w3.org/2000/09/xmldsig#"> http://www.w3.org/2001/10/xml-exc-c14n# </SignatureMethod> <Reference xmlns="http://www.w3.org/2000/09/xmldsig#"> <DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#"> http://www.w3.org/2000/09/xmldsig#sha1 </DigestMethod> <DigestValue xmlns="http://www.w3.org/2000/09/xmldsig#"> Tp9KxmwIRIS+kBsvD5+mCEsflI4I3U= </DigestValue> <URI xmlns="http://www.w3.org/2000/09/xmldsig#"> //soap:Envelope/soap:Body/* </URI> </Reference> </SignedInfo> <SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#"> WcDcxS5yDsfWjfJqN7AV78v+Ye8B3qACRmhzC+FCXZT Ds+FE4dx5pEfmy+Um1/1I+EBOrTNxFPMyykBq3JhR </SignatureValue> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName xmlns="http://www.w3.org/2000/09/xmldsig#"> Alice </KeyName> </KeyInfo> </Signature> </tns:getMessage> </soap:Body> </soap:Envelope>

Ahora que hemos discutido el archivo WSDL y las solicitudes SOAP para el servicio de correo electrónico seguro, es el momento de generar clases de stub para el servicio de correo electrónico seguro.

Usted puede usar una herramienta generadora de clases de stub para generar clases de stub para el archivo WSDL del servicio de correo electrónico seguro. Para su conveniencia, usted encontrará el archivo WSDL acompañado de su código fuente de clases de stub en la sección Descargas de este tutorial.


Clases de stub para el servicio de correo electrónico seguro

El generador de stub genera un total de diez clases para el servicio de correo electrónico seguro. Cuatro de las diez clases (GetMessage, GetSubjects, SubjectsList y Message) representan parámetros de entrada y salida de las operaciones getSubjects y getMessage. La herramienta generadora de stub nombra estas cuatro clases según los nombres de los elementos del tipo de complejo en el archivo WSDL.

El resto de las clases son:

  1. SecureMobileEmailService_PortType
  2. SecureMobileEmailService_PortType_Stub
  3. Signature
  4. GetSubjectsSignatureKeyInfo
  5. GetSubjectsSignatureSignedInfo
  6. GetSubjectsSignatureSignedInfoReference

SecureMobileEmailService_PortType es una interfaz similar a la interfaz ExtendedMobileEmailService_PortType que usted vio antes en la sección “Clases de stub para el servicio de correo electrónico extendido” de la Parte 1 que contiene definiciones getSubjects() y métodos getMessage().

SecureMobileEmailService_PortType_Stub implementa los métodos getSubjects() y getMessage(). Esto significa que SecureMobileEmailService_PortType_Stub contiene el código que usa clases e interfaces WSA para:

  1. comunicarse en forma segura con el servicio de correo electrónico remoto,
  2. capturar y analizar la respuesta del servicio remoto, y
  3. devolver los resultados a la aplicación de llamada.

Como podrá adivinar, SecureMobileEmailService_PortType_Stub es la más importante de todas las clases de stub. La definiremos como una clase “de stub de servicio seguro”. Usted verá cómo modificar (o mejorar) esta clase más adelante en la sección Mejorar la clase de stub de servicio seguro.

Pero presentemos primero las cuatro clases restantes (Signature, GetSubjectsSignatureSignedInfo, GetSubjectsSignatureSignedInfoReference y GetSubjectsSignatureKeyInfo), que representan el tipo de complejo Signature que se muestra en el Listado 1.


Clases de stub para el tipo de complejo Signature

Examine la clase Signature, que se ha copiado alListado 5 para una sencilla referencia.


Listado 5. Clase de Signature
public class Signature {
    protected secure.GetSubjectsSignatureSignedInfo signedInfo;
    protected java.lang.String signatureValue;
    protected secure.GetSubjectsSignatureKeyInfo keyInfo;
    
    public Signature() {
    }
    
    public Signature(secure.GetSubjectsSignatureSignedInfo signedInfo,
        java.lang.String signatureValue, 
        secure.GetSubjectsSignatureKeyInfo keyInfo) {
        this.signedInfo = signedInfo;
        this.signatureValue = signatureValue;
        this.keyInfo = keyInfo;
    }
    
    public secure.GetSubjectsSignatureSignedInfo getSignedInfo() {
        return signedInfo;
    }
    
    public void setSignedInfo(
        secure.GetSubjectsSignatureSignedInfo signedInfo) {
        this.signedInfo = signedInfo;
    }
    
    public java.lang.String getSignatureValue() {
        return signatureValue;
    }
    
    public void setSignatureValue(java.lang.String signatureValue) {
        this.signatureValue = signatureValue;
    }
    
    public secure.GetSubjectsSignatureKeyInfo getKeyInfo() {
        return keyInfo;
    }
    
    public void setKeyInfo(
        secure.GetSubjectsSignatureKeyInfo keyInfo) {
        this.keyInfo = keyInfo;
    }
}

La clase Signature comprende todo el contenido que contendrá una instancia de tipo de complejo Signature como el elemento Signature del mensaje SOAP del Listado 3. La clase Signature no contiene un código de autoría o procesamiento para los datos que comprende.

El procesamiento lógico propiamente dicho de la estructura XML de la firma se implementa en la clase de stub de servicio seguro.

La clase Signature contiene dos constructores; un constructor predeterminado sin argumento y un constructor de tres argumentos. El constructor de tres argumentos toma tres objetos, que se convierten en miembros de datos de la clase Signature:

  1. En primer lugar, hay una instancia de la clase GetSubjectsSignatureSignedInfo, que es otra clase de stub que representa el tipo de complejo SignedInfo definido en la estructura Signature del Listado 1.
  2. En segundo lugar, hay una cadena signatureValue que representa la forma codificada en base 64 de una firma criptográfica.
  3. Finalmente, hay una instancia de clase GetSubjectsSignatureKeyInfo, una clase de stub que representa el elemento KeyInfo del Listado 1.

La clase Signature tiene métodos establecedores y captadores para establecer y captar sus tres miembros de datos. Hemos mostrado a la clase Signature junto con sus miembros de datos como una estructura de una caja dentro de otra en la Figura 1.


Figura 1. Clase de firma con sus miembros de datos

Usted puede extender la Figura 1 para incluir miembros de datos de los miembros de datos de la firma. Usted obtendrá algo así como la Figura 2, que muestra en detalle cómo las clases de stub mantienen a otras clases de stub, así como a los tipos de datos primitivos y sus miembros de datos. Todos los nombres de clases de la Figura 2 se muestran en negrita mientras que los miembros de datos de tipo primitivo se muestra en cursiva.

Usted puede encontrar las cuatro clases de stub relacionadas con la firma en la Figura 2.


Figura 2. La estructura de firma completa

Observe que los nombres de clases generados por la herramienta generadora de stub son bastante extensos y contienen nombres de diferentes tipos de complejos en el archivo WSDL.

Por ejemplo, el nombre de clase GetSubjectsSignatureSignedInfo contiene nombres de todos los antecesores (GetSubjects y Signature) del elemento SignedInfo del archivo WSDL del Listado 1.

En aras de conveniencia, no usamos los nombres completos de clase GetSubjectsSignatureSignedInfo, GetSubjectsSignatureSignedInfoReference y GetSubjectsSignatureSignedInfoKeyInfo en la discusión de este tutorial. En su lugar, usamos las clases SignedInfo, Reference y KeyInfo, respectivamente.

Ahora que hemos presentado las clases de stub del servicio de correo electrónico seguro, explicaremos y demostraremos la estrategia para mejorar estas clases de stub en la siguiente sección.

2 de 11 | Anterior | Siguiente

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=SOA y servicios web
ArticleID=678273
TutorialTitle=Crear un cliente SOAP seguro para J2ME, Parte 2: Mejorar clases de stub en APIs de servicios web (WSA) para J2ME
publish-date=08052011
author1-email=bsiddiqui@xml4java.com
author1-email-cc=