Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

A primeira vez que acessar o developerWorks, um perfil será criado para você. Informações do seu perfil (tais como: nome, país / região, e empresa) estarão disponíveis ao público, que poderá acompanhar qualquer conteúdo que você publicar. Seu perfil no developerWorks pode ser atualizado a qualquer momento.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Entendendo Especificações de Serviços da Web, Parte 4: WS-Security

Nicholas Chase, Freelance writer, Backstop Media
Nicholas Chase esteve envolvido no desenvolvimento de Web sites para empresas como a Lucent Technologies, a Sun Microsystems, a Oracle e a Tampa Bay Buccaneers. Nick foi professor de física para turmas de ensino médio, gerente de instalação de resíduos radioativos de nível inferior, editor de revista de ficção científica on-line, engenheiro de multimídia, instrutor de Oracle e Chief Technology Officer de uma empresa de comunicações interativas. Ele é autor de diversos livros, incluindo XML Primer Plus (Sam's).

Resumo:  Há poucos (se algum) sistemas de nível corporativo que não requerem uma ou outra forma se segurança. Em serviços da Web, esse processo é mais complicado do que em outras áreas devido à sua natureza stateless distribuída. Este tutorial, Parte 4 da série Entendendo as Especificações de Serviços da Web, explica os conceitos por trás de WS-Security e padrões relacionados, como Assinatura XML, que se combinam para tornar a segurança no mundo de serviços da Web não apenas possível, mas prático.

Visualizar mais conteúdo nesta série

Data:  16/Set/2011
Nível:  Intermediário

Atividade:  4011 visualizações

Reunindo tudo

Neste ponto, Frances e Gene têm alguns exemplos desencontrados, então, eles decidem juntar tudo em uma única implementação para mostrar a Rudy.

A especificação de serviço final

Rudy quer que o serviço aceite somente solicitações de indivíduos (ou entidades) autorizados e n!ao quer que as respostas possam ser lidas pela concorrência. Para fazer isso, Gene e Frances configuram as coisas da seguinte forma:

  1. O cliente incluirá o registro de data e hora, que ele precisará assinar com a chave privada de um usuário aprovado. Isso cuida do problema de acesso autorizado e evita que mensagens sejam interceptadas e reproduzidas.
  2. O servidor incluirá um registro de data e hora, mas também criptografará o corpo da resposta para que se houver alguém na escuta não possa ver os dados que são retornados.

vamos ver como tudo se junta.

O serviço

Do lado do serviço, Gene configura o arquivo services.xml conforme visto na Listagem 31.


Listagem 31. O arquivo services.xml final
                    
<service name="CMSService">

    <description>
        This is a sample web service for the newspaper's 
        Content Managment System.
    </description>

    <parameter name="ServiceClass" 
               locked="false">CMSService</parameter>

    <parameter name="InflowSecurity">
       <action>
            <items>Timestamp Signature</items>
           
 <passwordCallbackClass>PWCallback</passwordCallbackClass>
           
 <signaturePropFile>security.properties</signaturePropFile>
       </action>
    </parameter>

    <parameter name="OutflowSecurity">
      <action>
        <items>Timestamp Signature Encrypt</items>
        <user>gene</user>
        <passwordCallbackClass>PWCallback</passwordCallbackClass>
       
 <signaturePropFile>security.properties</signaturePropFile>
        <signatureKeyIdentifier
                        >SKIKeyIdentifier</signatureKeyIdentifier>
        <encryptionKeyIdentifier
                       >SKIKeyIdentifier</encryptionKeyIdentifier>
        <encryptionUser>frances</encryptionUser>
        <signatureParts>
           {Element}{http://schemas.xmlsoap.org/soap/envelope/}Body
        </signatureParts>
        <optimizeParts>
            //xenc:EncryptedData/xenc:CipherValue/xenc:CipherData
        </optimizeParts> 
       </action>
    </parameter>

    <operation name="getNumberOfArticles">
        <messageReceiver class=
           "org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
    </operation>

</service>

InflowSecurity é o que o servidor espera -- uma mensagem que teve um registro de data e hora incluído e, em seguida, foi assinada -- e OutflowSecurity é o que enviará de volta ao cliente -- uma mensagem que tenha registro de data e hora e tenha sido assinada, com os dados criptografados.


O cliente

Do lado do cliente, Frances configura o reverso, como é possível ver na Listagem 32.


Listagem 32. O arquivo axis2.xml final
                    
<axisconfig name="AxisJava2.0">

    <!-- Engage the security module -->
    <module ref="rampart"/>
    
    <parameter name="OutflowSecurity">
      <action>
        <items>Timestamp Signature</items>
        <user>gene</user>
        <passwordCallbackClass>PWCallback</
passwordCallbackClass>
       
 <signaturePropFile>security.properties</signaturePropFile>
        <signatureKeyIdentifier
                        >SKIKeyIdentifier</signatureKeyIdentifier>
        <signatureParts>
            {Element}{http://docs.oasis-open.org/wss/2004/01/oasis
-200401-wss-wssecurity-utility-1.0.xsd}Timestamp</signatureParts>
      </action>
    </parameter>

    <parameter name="InflowSecurity">
      <action>
        <items>Timestamp Signature Encrypt</items>
        <user>gene</user>
        <passwordCallbackClass>PWCallback</passwordCallbackClass>
       
 <signaturePropFile>security.properties</signaturePropFile>
        <signatureKeyIdentifier
                        >SKIKeyIdentifier</signatureKeyIdentifier>
        <encryptionKeyIdentifier
                       >SKIKeyIdentifier</encryptionKeyIdentifier>
        <encryptionUser>frances</encryptionUser>
        <signatureParts>
           {Element}{http://schemas.xmlsoap.org/soap/envelope/}Body
        </signatureParts>
        <optimizeParts>
           //xenc:EncryptedData/xenc:CipherValue/xenc:CipherData
        </optimizeParts> 
      </action>
    </parameter>

    <!-- ================================================= -->
    <!-- Parameters -->
    <!-- ================================================= -->
    <parameter name="hotdeployment" locked="false">true</parameter>
...

Agora o cliente enviará mensagens com registro de data e hora e assinadas e insiste que quaisquer respostas tenham registro de data e hora, estejam assinadas e criptografadas.

Vamos ver o que isso significa para as mensagens em si.


A solicitação

A Listagem 33 mostra a solicitação final.


Listagem 33. A solicitação final
                    
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv=
          "http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
      <wsse:Security xmlns:wsse="http://docs.oasis-
open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
soapenv:mustUnderstand="1">
         <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
                                             Id="Signature-5525185">
            <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 URI="#Timestamp-1741620">
                  <ds:Transforms>
                     <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>
                     TQSR9wUuJ7rJi582TsbNjiAUqZI=
                  </ds:DigestValue>
               </ds:Reference>
            </ds:SignedInfo>
             <ds:SignatureValue>aRI5mvvvXZusAB/5cKCx/fOcW+CDjdk1F3Icl
lObVcEOWws9/mV4X2kWEX3hhwK7koX5jMPpl7AtLSbEh8UQGCa8yBua++yveprFl020To
VtePVOcWsBLM+9VHu9bJbhvaaps43RiUkym6xvVU/yL3eKTbhdhB/RQDI3kylXdas=
</ds:SignatureValue>
             <ds:KeyInfo Id="KeyId-26644003">
                <wsse:SecurityTokenReference xmlns:wsu=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
utility-1.0.xsd" wsu:Id="STRId-26174005">
                   <wsse:KeyIdentifier EncodingType="http://docs.oasi
s-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Bas
e64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-
200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"
>CuJdE1B2dUFd1dkLZSzQ5vj6MYg=</wsse:KeyIdentifier>
                </wsse:SecurityTokenReference>
             </ds:KeyInfo>
          </ds:Signature>
          <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/20
04/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
                                          wsu:Id="Timestamp-1741620">
             <wsu:Created>2006-06-22T11:34:02.453Z</wsu:Created>
             <wsu:Expires>2006-06-22T11:39:02.453Z</wsu:Expires>
          </wsu:Timestamp>
       </wsse:Security>
    </soapenv:Header>
    <soapenv:Body>
       <cms:getNumberOfArticles 
                     xmlns:cms="http://daily-moon.com/cms">
          <cms:category>classifieds</cms:category>
       </cms:getNumberOfArticles>
    </soapenv:Body>
 </soapenv:Envelope>


A resposta

A Listagem 34 mostra a resposta final.


Listagem 34. A resposta final
                    
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv=
            "http://schemas.xmlsoap.org/soap/envelope/" 
            xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
   <soapenv:Header>
      <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004
/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
soapenv:mustUnderstand="1">
         <xenc:EncryptedKey Id="EncKeyId-28585008">
            <xenc:EncryptionMethod Algorithm=
                "http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
            <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <wsse:SecurityTokenReference>
               <wsse:KeyIdentifier EncodingType="http://docs.oasis-
open.org/wss/2004/01/oasis-200401-wss-soap-message-security-
1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2
004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKey
Identifier">Xeg55vRyK3ZhAEhEf+YT0z986L0=</wsse:KeyIdentifier>
            </wsse:SecurityTokenReference>
         </ds:KeyInfo>
         <xenc:CipherData>
            <xenc:CipherValue>NSkylkASezzHSp37izSN3xnxf6v/zwN3C70uU2n
UTNk4a9xYxhNcgiVQuS2/Tm3/x3Jm1d9rj2V8x1uqlKmi89MFifN34SDxaDTMBFzhfRv4
CmQSITEFjY1ySVDvMb7WZszGDhVIGYkjcDkoK+SfWdxyuaUdNUbPgEihSnFVRXs=</xen
c:CipherValue>
         </xenc:CipherData>
         <xenc:ReferenceList>
            <xenc:DataReference URI="#EncDataId-19400027" />
         </xenc:ReferenceList>
      </xenc:EncryptedKey>
      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
                                      Id="Signature-17174249">
         <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 URI="#id-19400027">
                  <ds:Transforms>
                     <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>HfdufYEGpvPpfz2+HWKui4npV9s=</ds:Di
gestValue>
               </ds:Reference>
               <ds:Reference URI="#SigConf-17122634">
                  <ds:Transforms>
                     <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>e88WWqudpvW69wN23fgZjQ9ZAio=</ds:Di
gestValue>
               </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>aZLon//vwkw2G2Jxcligxod/CgxMjwtlefZiho
yUz5FpgSY6RUoI5vuHX2unrWV+EVA2vWdtz/Iyq+RS7j4QtE2XTYovxdyiZPbKXNdFKHy
AkpDr0aDLG9rSjyFVcTrUKgAY06t10zi13Daq95nDMH+wAJCYUO0Vor/u0V9Iv7I=</ds
:SignatureValue>
            <ds:KeyInfo Id="KeyId-22768665">
               <wsse:SecurityTokenReference xmlns:wsu="http://docs.oa
sis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
wsu:Id="STRId-18220809">
                  <wsse:KeyIdentifier EncodingType="http://docs.oasis-
open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Bas
e64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-
200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"
>CuJdE1B2dUFd1dkLZSzQ5vj6MYg=</wsse:KeyIdentifier>
               </wsse:SecurityTokenReference>
            </ds:KeyInfo>
         </ds:Signature>
         <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/20
04/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
wsu:Id="Timestamp-6400133">
            <wsu:Created>2006-06-22T11:34:04.062Z</wsu:Created>
            <wsu:Expires>2006-06-22T11:39:04.062Z</wsu:Expires>
         </wsu:Timestamp>
         <wsse11:SignatureConfirmation xmlns:wsse11="http://docs.oasi
s-open.org/wss/2005/xx/oasis-2005xx-wss-wssecurity-secext-1.1.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-
wssecurity-utility-1.0.xsd" Value="aRI5mvvvXZusAB/5cKCx/fOcW+CDjdk1F3
IcllObVcEOWws9/mV4X2kWEX3hhwK7koX5jMPpl7AtLSbEh8UQGCa8yBua++yveprFl02
0ToVtePVOcWsBLM+9VHu9bJbhvaaps43RiUkym6xvVU/yL3eKTbhdhB/RQDI3kylXda
s=" wsu:Id="SigConf-17122634" />
      </wsse:Security>
   </soapenv:Header>
   <soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/o
asis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-19400027">
      <xenc:EncryptedData Id="EncDataId-19400027" Type=
"http://www.w3.org/2001/04/xmlenc#Content">
         <xenc:EncryptionMethod Algorithm=
              "http://www.w3.org/2001/04/xmlenc#aes128-cbc" />
         <xenc:CipherData>
               <xenc:CipherValue>f6uWHGsYmGwHuno2j4H7a4qCMhPLTlCIg40p
KLciESBzeCT8rvyl+qHXsFkZJq2m4uj9TEFtRX6efQ5MHBEJozMgI03LSVanh6MmHgt5o
ilIJClWcQifEx0Azeo3KWnQKSc9lg0ywhKJH+JVBsPSP7E19jZAsR77wUEBBIprxs5W59
7C/mJh38iXSncwWccE7OCckf1x34FCfKHSqn46MCohZWiPZRjSmAI5dGFMKwttzpmsmXr
LHLVrsjm4w9onis+Xr5gbi3Gcx6P0F2ZJGLBb9bkGh/IvjYutgzRD7zhyRZxUmM/oZTVs
JJ7dA9YOED5l1C64f4yuqR6TtuVw3gIiuspxWafKwlJuuD0/9m6Ri4AvQuOVEioz45MM
5FBCQU+0LFceSlEFFKhN9yLUI9hgLsCYRzc8eedPAhZDjJEDHec5M9LZ0C07sKu7Cvnr
jiino53xZmk5uQHs4JlNoA==</xenc:CipherValue>
         </xenc:CipherData>
      </xenc:EncryptedData>
   </soapenv:Body>
</soapenv:Envelope>

7 de 11 | Anterior | Próximo

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Tecnologia Java
ArticleID=757426
TutorialTitle=Entendendo Especificações de Serviços da Web, Parte 4: WS-Security
publish-date=09162011
author1-email=ibmquestions@nicholaschase.com
author1-email-cc=