ADC

Cifrar y descifrar cargas útiles XML

Puede utilizar las funciones XML_ENCRYPT() y XML_DECRYPT() de las expresiones de directiva avanzadas para cifrar y descifrar, respectivamente, datos XML. Estas funciones cumplen con el estándar de cifrado XML del W3C definido en “http://www.w3.org/TR/2001/PR-xmldsig-core-20010820/. “ XML_ENCRYPT() y XML_DECRYPT() admiten un subconjunto de la especificación 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 masivo.

Nota: Si quiere cifrar y descifrar texto en una carga útil, debe utilizar las funciones ENCRYPT y DECRYPT. Para obtener más información sobre 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 cipher se especifica explícitamente como argumento de 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 con RSA.

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

A continuación se presentan las 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 haberse creado previamente mediante un comando add ssl certKey.

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

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

    • 1 : incluye un elemento keyName con certKeyName. El elemento es <ds:KeyName>.
    • 2 - Incluya un elemento keyValue con la clave pública RSA del certificado. El elemento es <ds:KeyValue>.
    • 4 - Incluya 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 nombre distintivo del sujeto del certificado. El elemento es <ds:X509SubjectName>.
    • 16 - Incluye un elemento X509Certificate con el certificado completo. El elemento es <ds:X509Certificate>.

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

La función de cifrado XML utiliza pares de claves de certificado 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 directivas y acciones 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)"

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")"

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
<!--NeedCopy-->

En el ejemplo anterior, la acción de reescritura my-xml-encrypt-action cifra todo el documento XML (XPATH_WITH_MARKUP (xp%/%)) de 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 sustituye el documento por un elemento <xenc:EncryptedData> que contiene los datos cifrados y una clave cifrada. Las banderas representadas 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 de xenc mediante el uso del siguiente comando de CLI:

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

La acción my-xml-decrypt-action utiliza la clave privada RSA de 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. Por último, la acción reemplaza el elemento de datos cifrados por el contenido descifrado.

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

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 de las solicitudes que están vinculadas a un servicio configurado en el dispositivo NetScaler.

Cifrar y descifrar cargas útiles XML