Visualizzare messaggi SOAP protetti da SSL

Durante la mia sessione alla conferenza Basta!Italia ho fatto vedere come analizzare il traffico SOAP tra due servizi protetti da SSL presenti sulla stessa macchina di sviluppo (scenario molto comune quando si programma :-). L’obiettivo era quello di visualizzare il Security Token di tipo Username & Password definito da WS-Security all’interno dell’header SOAP. Nel caso specifico, poichè le Windows Web Services API (WWSAPI) non sono in grado di garantire la sicurezza a livello di messaggio, l’obiettivo era quello di visualizzare il Token creato dalle WWSAPI anche se usavamo SSL per il trasporto !!

Anche in questo caso, come in quello precedente, le impostazioni che faremo sono da considerarsi solo per le macchine degli sviluppatori e non in produzione !! Userò ancora il tag <WARNING> per evidenziare le configurazioni pericolose per la produzione.

In questo scenario ho fatto le seguenti configurazioni:
<WARNING> .

  1. Nel file hosts ho configurato : 127.0.0.1 BastaConferenceWebServices.com

  2. Certificati:

    1. Verificare che il nostro Reverse-Proxy (Charles, ma si può utilizzare anche Fiddler) abbia installato il proprio certificato in Current User->Trusted Root Certification Authorities.
    2. Creare il certificato SSL via makecert.exe (o via CA) con il parametro : -n "BastaConferenceWebServices.com" (Maggiori info qui)
    3. Installare il certificato appena creato in Local Computer ->Trusted Root Certification Authorities e in Local Computer –>Personal .
    4. Associare il certificato appena creato con la porta 127.0.0.1:8444 via netsh.exe (Maggiori info qui)
    5. Impostare l’URL reservation (con l’utility : netsh http add urlacl – maggiori info sempre qui ) dato che sicuramente il Web Service NON lo faremo girare con le credenziai di amministratore, nemmeno durante lo sviluppo… vero??? ;-)
  3. Configurare Charles come Reverse Proxy

    image 

  4. Dare OK e lanciare il Web Service e il client.

</WARNING> .

Alla fine della configurazione dovremo avere uno scenario di questo tipo:

image

dove il client parla sulla 2051 pensando di parlare con il nostro Web Service. Sulla 2051 c’è il Reverse Proxy che crea la connessione SSL con il client, accetta il messaggio SOAP, lo logga e diventa il client SSL per il Web Service (vero) sulla 8444.

Vi sembra familiare?? Ebbene si. Questo è il tipico esempio di attacco Man-in-the-Middle, ma usato a fin di bene :-). Prima che venga il dubbio che quindi SSL non è sicuro ricordo che nessun protocollo è veramente sicuro se sono amministratore di tutto l’ambiente !!! 

Infatti in questo modo possiamo visualizzare il messaggio del client:

    1 <s:Envelope … TRONCATO…>

    2   <s:Header>

    3     <a:Action s:mustUnderstand="1">https://Example.org/ICalculator/Add</a:Action>

    4     <a:MessageID>urn:uuid:1bcbe628-18e6-484b-8ed4-363d59ad0fae</a:MessageID>

    5     <a:To s:mustUnderstand="1">https://BastaConferenceWebServices.com:2051/example</a:To>

    6     <o:Security s:mustUnderstand="1" xmlns:o="https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

    7       <Timestamp xmlns="https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

    8         <Created>2009-03-26T15:21:04.786Z</Created>

    9         <Expires>2009-03-26T15:26:04.786Z</Expires>

   10       </Timestamp>

   11       <o:UsernameToken>

   12         <o:Username>usr1</o:Username>

   13         <o:Password Type="https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">

   14           pwd1

   15         </o:Password>

   16       </o:UsernameToken>

   17     </o:Security>

   18   </s:Header>

   19   <s:Body>

   20     <Add xmlns="https://Example.org">

   21       <a>1</a>

   22       <b>2</b>

   23     </Add>

   24   </s:Body>

   25 </s:Envelope>

 

Con relativa risposta :

    1 <s:Envelope … TRONCATO…>

    2   <s:Header>

    3     <a:Action s:mustUnderstand="1">https://Example.org/ICalculator/AddResponse</a:Action>

    4     <a:RelatesTo>urn:uuid:1bcbe628-18e6-484b-8ed4-363d59ad0fae</a:RelatesTo>

    5     <o:Security s:mustUnderstand="1" xmlns:o="https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

    6       <Timestamp xmlns="https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

    7         <Created>2009-03-26T15:21:05.921Z</Created>

    8         <Expires>2009-03-26T15:26:05.921Z</Expires>

    9       </Timestamp>

   10     </o:Security>

   11   </s:Header>

   12   <s:Body>

   13     <AddResponse xmlns="https://Example.org">

   14       <result>

   15         3

   16       </result>

   17     </AddResponse>

   18   </s:Body>

   19 </s:Envelope>

 

--Mario