Citrix ADC

Cifrar y descifrar cargas XML

Puede utilizar las funciones XML_ENCRYPT () y XML_DECRYPT () en expresiones de directiva avanzadas para cifrar y descifrar, respectivamente, datos XML. Estas funciones cumplen con el estándar W3C XML Encryption definido en “http://www.w3.org/TR/2001/PR-xmldsig-core-20010820/.” XML_ENCRYPT () y XML_DECRYPT () admiten un subconjunto de la especificación de cifrado XML. En el subconjunto, el cifrado de datos utiliza un método de cifrado masivo (RC4, DES3, AES128, AES192 o AES256) y se utiliza una clave pública RSA para cifrar la clave de cifrado masiva.

Nota: Si quiere cifrar y descifrar texto en una carga útil, debe utilizar las funciones ENCRYPT y DECRYPT. Para obtener más información acerca de estas funciones, consulte Cifrar y descifrar texto.

Las funciones XML_ENCRYPT () y XML_DECRYPT () no dependen del servicio de cifrado/descifrado utilizado por los comandos ENCRYPT y DECRYPT para el texto. El método de cifrado se especifica explícitamente como argumento para la función XML_ENCRYPT (). La función XML_DECRYPT() obtiene la información sobre el método de cifrado especificado del elemento <xenc:EncryptedData>. A continuación se presentan sinopsis de las funciones de cifrado y descifrado XML:

  • Elemento XML_ENCRYPT(<certKeyName>, <method> [, <flags>])**. Returns an <xenc:EncryptedData> que contiene el texto de entrada cifrado y la clave de cifrado, que a su vez se cifra mediante RSA.
  • XML_DECRYPT(<certKeyName>). Devuelve el texto descifrado del elemento <xenc:EncryptedData> de entrada, que incluye el método de cifrado y la clave cifrada RSA.

Nota: El elemento <xenc:EncryptedData> se define en la especificación de cifrado XML W3C.

A continuación se presentan descripciones de los argumentos:

  • CertKeyName: selecciona un certificado X.509 con una clave pública RSA para XML_ENCRYPT () o una clave privada RSA para XML_DECRYPT (). La clave de certificado debe haber sido creada previamente por un comando add ssl CertKey.

  • method: Especifica qué método de cifrado utilizar para cifrar los datos XML. Valores posibles: RC4, DES3, AES128, AES192, AES256.

  • flags: máscara de bits que especifica la siguiente información de clave opcional (<ds:KeyInfo>) que se incluirá en el elemento <xenc:EncryptedData> generado por XML_ENCRYPT():

    • 1: Incluir un elemento keyName con el certKeyName. El elemento es <ds:KeyName>.
    • 2: Incluir un elemento KeyValue con la clave pública RSA del certificado. El elemento es <ds:KeyValue>.
    • 4: Incluir un elemento X509IssuerSerial con el número de serie del certificado y el DN del emisor. El elemento es <ds:X509IssuserSerial>.
    • 8: Incluya un elemento X509SubjectName con el DN del sujeto del certificado. El elemento es <ds:X509SubjectName>.
    • 16: Incluir un elemento X509Certificate con todo el certificado. El elemento es <ds:X509Certificate>.

Utilice las funciones XML_ENCRYPT () y XML_DECRYPT () en expresiones

La función de cifrado XML utiliza pares de certificados SSL para proporcionar certificados X.509 (con claves públicas RSA) para el cifrado de claves y claves privadas RSA para el descifrado de claves. Por lo tanto, antes de utilizar la función XML_ENCRYPT () en una expresión, debe crear un par de claves de certificado SSL. El siguiente comando crea un par de claves de certificado SSL, my-certkey, con el certificado X.509, my-cert.pem y el archivo de clave privada, my-key.pem.

add ssl certKey my-certkey -cert my-cert.pem -key my-key.pem -passcrypt kxPeMRYnitY=

Los siguientes comandos de CLI crean acciones y directivas de reescritura para cifrar y descifrar contenido XML.

add rewrite action my-xml-encrypt-action replace "HTTP.RES.BODY(10000).XPATH_WITH_MARKUP(xp%/%)" "HTTP.RES.BODY(10000).XPATH_WITH_MARKUP(xp%/%).XML_ENCRYPT("my-certkey", AES256, 31)" -bypassSafetyCheck YES

add rewrite action my-xml-decrypt-action replace "HTTP.REQ.BODY(10000).XPATH_WITH_MARKUP(xp%//xenc:EncryptedData%)" "HTTP.REQ.BODY(10000).XPATH_WITH_MARKUP(xp%//xenc:EncryptedData%).XML_DECRYPT("my-certkey")" -bypassSafetyCheck YES

add rewrite policy my-xml-encrypt-policy "HTTP.REQ.URL.CONTAINS("xml-encrypt")" my-xml-encrypt-action

add rewrite policy my-xml-decrypt-policy "HTTP.REQ.BODY(10000).XPATH(xp%boolean(//xenc:EncryptedData)%)" my-xml-decrypt-action

bind rewrite global my-xml-encrypt-policy 30

bind rewrite global my-xml-decrypt-policy 30

En el ejemplo anterior, la acción de reescritura my-xml-encrypt-action cifra todo el documento XML (XPATH_WITH_MARKUP (xp%/%)) en la solicitud mediante el método de cifrado masivo AES-256 y la clave pública RSA de my-certkey para cifrar la clave de cifrado masivo. La acción reemplaza el documento con un elemento <xenc:EncryptedData> que contiene los datos cifrados y una clave cifrada. Los indicadores representados por 31 incluyen todos los elementos <ds:KeyInfo> opcionales.

La acción my-xml-decrypt-action descifra el primer elemento <xenc:EncryptedData> de la respuesta (XPATH_WITH_MARKUP (XP%//XENC:encryptedData%)). Esto requiere la adición previa del espacio de nombres XML xenc mediante el uso del siguiente comando CLI:

add ns xmlnamespace xenc http://www.w3.org/2001/04/xmlenc#

La acción my-xml-decrypt-action utiliza la clave privada RSA en my-certkey para descifrar la clave cifrada y, a continuación, utiliza el método de cifrado masivo especificado en el elemento para descifrar el contenido cifrado. Finalmente, la acción reemplaza el elemento de datos cifrados con el contenido descifrado.

La directiva de reescritura my-xml-encrypt-policy aplica my-xml-encrypt-action a las solicitudes de direcciones URL que contengan xml-encrypt. La acción cifra toda la respuesta de un servicio configurado en el dispositivo Citrix ADC.

La directiva de reescritura my-xml-decrypt-policy aplica my-xml-decrypt-action a las solicitudes que contienen un elemento <xenc:EncryptedData> ((XPATH (XP%//XENC:EncryptedData%) devuelve una cadena no vacía). La acción descifra los datos cifrados en las solicitudes enlazadas para un servicio configurado en el dispositivo Citrix ADC.

Cifrar y descifrar cargas XML