Informazioni sulle parti WS-Security e XML-Enc di una richiesta SOAP

0

Sto tentando di creare un client SOAP per utilizzare i servizi forniti da eMedNy . Mi hanno fornito un certificato X.509 del client insieme al relativo certificato X.509 del server.

La guida dell'utente contiene la seguente richiesta SOAP di esempio:

    <?xml version="1.0" encoding="utf-8" ?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mhs="http://org/emedny/mhs/" xmlns:urn="urn:hl7-org:v3">
  <soapenv:Header>
    <wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:BinarySecurityToken ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-e00c8062-83d2-4f04-88fc-996218e7bb3d">MIICeDCC....(eMedNY signed user MLS cert).......</wsse:BinarySecurityToken>
      <wsse:BinarySecurityToken ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-c0cc2cd4-cb77-4fa5-abfa-bd485afd1685">MIIDFj.....( eMedNY MLS web-service end-point public cert)........</wsse:BinarySecurityToken>
      <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-970e9a80-00cc-4c86-8ec4-3ba16e029a5b">
        <wsse:Username>....your_username.....</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">.....your_plaintext_password....</wsse:Password>
        <wsse:Nonce>KNyu6MsXCkTg4DDyvwvEiw==</wsse:Nonce>
        <wsu:Created>2010-09-15T18:00:30Z</wsu:Created>
      </wsse:UsernameToken>
      <xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
        <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <wsse:SecurityTokenReference>
            <wsse:Reference URI="#SecurityToken-c0cc2cd4-cb77-4fa5-abfa-bd485afd1685" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
          </wsse:SecurityTokenReference>
        </KeyInfo>
        <xenc:CipherData>
          <xenc:CipherValue>gpBAWt91pdwhKva............</xenc:CipherValue>
        </xenc:CipherData>
        <xenc:ReferenceList>
          <xenc:DataReference URI="#Enc-0641b860-b16d-4941-91c0-d60bece67794"/>
        </xenc:ReferenceList>
      </xenc:EncryptedKey>
      <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
          <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
          <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
          <Reference URI="#Id-f10674fd-b999-47c9-9568-c11fa5e5405b">
            <Transforms>
              <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <DigestValue>wRUq.........</DigestValue>
          </Reference>
        </SignedInfo>
        <SignatureValue>tBSsaZi........</SignatureValue>
        <KeyInfo>
          <wsse:SecurityTokenReference>
            <wsse:Reference URI="#SecurityToken-e00c8062-83d2-4f04-88fc-996218e7bb3d" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
          </wsse:SecurityTokenReference>
        </KeyInfo>
      </Signature>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body wsu:Id="Id-f10674fd-b999-47c9-9568-c11fa5e5405b" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <xenc:EncryptedData Id="Enc-0641b860-b16d-4941-91c0-d60bece67794" Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
      <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
      <xenc:CipherData>
        <xenc:CipherValue>SQsTCAK6ZaVhojB8+Y.........</xenc:CipherValue>
      </xenc:CipherData>
    </xenc:EncryptedData>
  </soapenv:Body>
</soapenv:Envelope>

Volevo solo verificare i seguenti due punti per assicurarmi che la mia comprensione fosse accurata:

  1. Il corpo SOAP viene crittografato utilizzando il certificato del server eMedNy utilizzando TRIPLE-DES . Quindi crittografiamo questo certificato del server utilizzando RSA e invialo come intestazione del messaggio.

  2. Per generare la firma digitale, prendiamo il corpo del messaggio crittografato TRIPLE-DES e otteniamo un digest SHA-1 . Usando il certificato del client X.509 fornito da eMedNy, crittografiamo il digest che ci dà la firma.

posta Isaac Kleinman 20.01.2014 - 20:03
fonte

1 risposta

2

Il cliente procede come segue (sto considerando solo i passaggi di crittografia e firma in quanto questi sono rilevanti per te):

1) Crittografia:

  • Genera un nuovo tasto simmetrico 3DES
  • Crittografa la chiave simmetrica di nuova generazione con la chiave pubblica del server (utilizzando l'algoritmo RSA-PKCS1, vedi algoritmo EncryptionMethod) e la inserisce nell'elemento EncryptedKey / CipherData / CipherValue.
  • La chiave pubblica utilizzata per la crittografia viene referenziata utilizzando l'elemento EncryptedKey / KeyInfo / SecurityTokenReference / Reference. Qui possiamo vedere che è stata utilizzata la chiave pubblica dal certificato wsu: Id="Sec ... 1685". Una volta che il server accetta il messaggio, sa che dovrebbe utilizzare la chiave privata corrispondente per la decrittografia.
  • La chiave simmetrica generata viene utilizzata per la crittografia SOAP Body, con un algoritmo 3DES-CBC.

2) Firma:

  • Il cliente calcola un digest SHA-1 sull'intero corpo SOAP. È possibile vedere questo poiché l'elemento di riferimento fa riferimento a un elemento con wsu: Id="Id ... 05b", che appartiene al corpo SOAP. Il valore del digest viene quindi inserito in Signature / SignedInfo / Reference / DigestValue.
  • Il client utilizza la sua chiave privata e calcola una firma RSA-SHA1 sull'elemento SignedInfo. Il valore della firma viene quindi inserito nell'elemento SignatureValue.
  • Per convalidare la firma, il server deve conoscere la chiave pubblica del client. A tale scopo, il client inserisce il suo certificato nel messaggio e lo fa riferimento in Signature / KeyInfo / SecurityTokenReference / Reference. Una volta che il server accetta il messaggio, sa che deve utilizzare un certificato con wsu: Id="Sicurezza ... bb3d" per ottenere la chiave pubblica e verificare la firma.
risposta data 16.03.2014 - 12:57
fonte

Leggi altre domande sui tag