Uno de los problemas que tienen los servicios web es sin duda su excesiva complejidad. Pero los web services no son realmente un estándar, más bien es un conjunto de estándares que abordan los propios mensajes, el formato SOAP, el contrato, el WSDL, los registros de servicios UDDI, y también la seguridad en los mensajes.

Seguridad con WS-Security

Uno de los estándares más importantes es el que se trata la seguridad en los servicios web, el WS-Security. ¿Para qué sirve?

Básicamente para tres cosas:

  1. Para firmar mensajes para asegurar su origen y su integridad.
    Igual que sabemos quién ha firmado contrato mirando la firma manuscrita, podemos saber en este caso quien envía una petición a un servicio web o de quién es la respuesta con WS-Signature.
    También sirve para asegurarnos de que alguien ha modificado el mensaje. Que si dice que depositemos 100€ en una cuenta de la islas caimán, no venga alguien y diga que son 1.000.000 de €. Si alguien modifica el mensaje por el camino, lo sabremos.
  2. Para encriptar el mensaje y asegurarnos de que nadie puede leer el contenido con XML-Encryption
  3. Asegurarnos de la identidad del que envía el mensaje

¿y que pinta tiene todo esto?

Aquí tenéis un ejemplo sacado de esta estupenda guía. Como veis, para un humano es difícil de leer aunque para una aplicación es bastante más sencillo. Sobre todo si lo comparamos con las alternativas que teníamos antes de estos estándares:

 <?xml version="1.0" encoding="utf-8"?>
<S:Envelope
xmlns:S="http://www.w3.org/2001/12/soap-envelope"
            xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
       xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext"
            xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<S:Header>
      <m:path xmlns:m="http://schemas.xmlsoap.org/rp/">
        <m:action>http://fabrikam123.com/getQuote</m:action>
         <m:to>http://fabrikam123.com/stocks</m:to>
         <m:from>mailto:johnsmith@fabrikam123.com</m:from>
       <m:id>uuid:84b9f5d0-33fb-4a81-b02b-5b760641c1d6</m:id>
     </m:path>
      <wsse:Security>
         <wsse:BinarySecurityToken
                     ValueType="wsse:X509v3"
                     Id="X509Token"
                     EncodingType="wsse:Base64Binary">
         MIIEZzCCA9CgAwIBAgIQEmtJZc0rqrKh5i...
         </wsse:BinarySecurityToken>
         <xenc:EncryptedKey>
            <xenc:EncryptionMethod Algorithm=
                    "http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
             <ds:KeyInfo>
          <ds:KeyName>CN=Hiroshi Maruyama, C=JP</ds:KeyName>
             </ds:KeyInfo>
             <xenc:CipherData>
                <xenc:CipherValue>d2FpbmdvbGRfE0lm4byV0...
                </xenc:CipherValue>
             </xenc:CipherData>
             <xenc:ReferenceList>
                 <xenc:DataReference URI="#enc1"/>
             </xenc:ReferenceList>
         </xenc:EncryptedKey>
         <ds:Signature>
            <ds:SignedInfo>
               <ds:CanonicalizationMethod
            Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
               <ds:SignatureMethod
         Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
               <ds:Reference>
                  <ds:Transforms>
                     <ds:Transform
                        Algorithm="http://...#RoutingTransform"/>
                     <ds:Transform
            Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                  </ds:Transforms>
                  <ds:DigestMethod
            Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                  <ds:DigestValue>LyLsF094hPi4wPU...
                   </ds:DigestValue>
               </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>
                     Hp1ZkmFZ/2kQLXDJbchm5gK...
            </ds:SignatureValue>
            <ds:KeyInfo>
                <wsse:SecurityTokenReference>
                    <wsse:Reference URI="#X509Token"/>
                </wsse:SecurityTokenReference>
            </ds:KeyInfo>
         </ds:Signature>
      </wsse:Security>
   </S:Header>
   <S:Body>
      <xenc:EncryptedData
                  Type="http://www.w3.org/2001/04/xmlenc#Element"
                  Id="enc1">
         <xenc:EncryptionMethod
         Algorithm="http://www.w3.org/2001/04/xmlenc#3des-cbc"/>
         <xenc:CipherData>
            <xenc:CipherValue>d2FpbmdvbGRfE0lm4byV0...
            </xenc:CipherValue>
         </xenc:CipherData>
      </xenc:EncryptedData>
   </S:Body>
 </S:Envelope>

Comparte esta entrada:
Share

Anuncios