Descripción de las partes de WS-Security y XML-Enc de una solicitud SOAP

0

Estoy intentando crear un cliente SOAP para consumir los servicios proporcionados por eMedNy . Me han proporcionado un certificado de cliente X.509 junto con su certificado de servidor X.509 .

Su guía de usuario contiene la siguiente solicitud SOAP de muestra:

    <?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>

Solo quería verificar los siguientes dos puntos para asegurarme de que mi comprensión es precisa:

  1. El cuerpo SOAP se encripta usando el certificado del servidor eMedNy usando TRIPLE-DES . Luego, ciframos este certificado de servidor con RSA y lo enviamos como encabezado de mensaje.

  2. Para generar la firma digital, tomamos el cuerpo del mensaje cifrado TRIPLE-DES y obtenemos un resumen SHA-1 . Al utilizar el certificado de cliente X.509 proporcionado por eMedNy, ciframos el resumen que nos da la firma.

pregunta Isaac Kleinman 20.01.2014 - 20:03
fuente

1 respuesta

2

El cliente procede de la siguiente manera (estoy considerando solo los pasos de cifrado y firma, ya que son relevantes para usted):

1) Cifrado:

  • Genera una nueva clave simétrica 3DES
  • Encripta la clave simétrica recién generada con la clave pública del servidor (usando el algoritmo RSA-PKCS1, vea el algoritmo EncryptionMethod) y la coloca en el elemento EncryptedKey / CipherData / CipherValue.
  • Se hace referencia a la clave pública utilizada para el cifrado mediante el elemento EncryptedKey / KeyInfo / SecurityTokenReference / Reference. Allí podemos ver que se usó la clave pública del certificado wsu: Id="Sec ... 1685". Una vez que el servidor acepta el mensaje, sabe que debe usar la clave privada correspondiente para el descifrado.
  • La clave simétrica generada se usa para el cifrado de cuerpo de SOAP, con un algoritmo 3DES-CBC.

2) Firma:

  • El cliente calcula un resumen de SHA-1 sobre todo el Cuerpo de SOAP. Puede ver esto ya que el elemento de referencia hace referencia a un elemento con wsu: Id="Id ... 05b", que pertenece al cuerpo de SOAP. El valor de resumen se coloca en Signature / SignedInfo / Reference / DigestValue.
  • El cliente utiliza su clave privada y calcula una firma RSA-SHA1 sobre el elemento SignedInfo. El valor de la firma se coloca en el elemento SignatureValue.
  • Para validar la firma, el servidor debe conocer la clave pública del cliente. Para este propósito, el cliente coloca su certificado en el mensaje y lo remite en Signature / KeyInfo / SecurityTokenReference / Reference. Una vez que el servidor acepta el mensaje, sabe que tiene que usar un certificado con wsu: Id="Seguridad ... bb3d" para obtener la clave pública y verificar la firma.
respondido por el Juraj 16.03.2014 - 12:57
fuente

Lea otras preguntas en las etiquetas