Citrix ADC

加密和解密 XML 有效负载

您可以使用高级策略表达式中的 XML_ENCRYPT () 和 XML_DECRICPT () 函数分别加密和解密 XML 数据。这些函数符合在 http://www.w3.org/TR/2001/PR-xmldsig-core-20010820/ 中定义的 W3C XML 加密标准。XML_ENCRYPT () 和 XML_DECRICPT () 支持 XML 加密规范的一个子集。在子集中,数据加密使用批量加密方法(RC4、DES3、AES128、AES192 或 AES256),并且使用 RSA 公钥加密批量密钥。

注意: 如果要对有效负载中的文本进行加密和解密,则必须使用加密和解密函数。有关这些函数的更多信息,请参阅 加密和解密文本

XML_CONTACT () 和 XML_DECLUT () 函数不依赖于文本的加密/解密命令使用的加密/解密服务。密码方法被明确指定为 XML_ENCRYPT () 函数的参数。 XML_DECRYPT() 函数从 <xenc:EncryptedData> 元素中获取有关指定密码方法的信息。以下是 XML 加密和解密函数的概要:

  • XML_ENCRYPT(<certKeyName>, <method> [, <flags>])**. Returns an <xenc:EncryptedData> 元素,其中包含加密的输入文本和加密密钥,加密密钥本身使用 RSA 进行加密。
  • XML_DECRYPT(<certKeyName>)。返回来自输入 <xenc:EncryptedData> 元素的解密文本,其中包括密码方法和 RSA 加密的密钥。

注意: <xenc:EncryptedData> 元素在 W3C XML 加密规范中定义。

以下是参数的说明:

  • 证书密钥名称: 为 XML_ENCRYPT () 选择一个带有 RSA 公钥的 X.509 证书或用于 XML_DECRYPT () 的 RSA 私钥的证书。证书密钥必须是先前由 add ssl certKey 命令创建的。

  • 方法: 指定用于加密 XML 数据的密码方法。可能的值:RC4、DES3、AES128、AES192、AES256。

  • flags: 一个位掩码,用于指定要包含在由生成的 <xenc:EncryptedData> 元素中的以下可选关键信息 (<ds:KeyInfo>) XML_ENCRYPT()

    • 1 -在 CertKeyName 中包含一个 KeyName 元素。元素是 <ds:KeyName>
    • 2 -使用证书中的 RSA 公钥包含 KeyValue 元素。元素是 <ds:KeyValue>
    • 4 -包括带有证书序列号和颁发者 DN 的 X509issuerSerial 元素。元素是 <ds:X509IssuserSerial>
    • 8 -在证书主题 DN 中包含一个 X509SubjectName 元素。元素是 <ds:X509SubjectName>
    • 16 -在整个证书中包含 X509 证书元素。元素是 <ds:X509Certificate>

在表达式中使用 XML_ENCRYPT () 和 XML_DECRICPT () 函数

XML 加密功能使用 SSL 证书密钥对为密钥加密提供 X.509 证书(带有 RSA 公钥)和用于密钥解密的 RSA 私钥。因此,在表达式中使用 XML_ENCRYPT () 函数之前,必须创建 SSL 证书密钥对。以下命令使用 X.509 证书、my-cert.pem 和私钥文件 my-key.pem 创建 SSL 证书密钥对 my-certkey。

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

以下 CLI 命令创建用于加密和解密 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-->

在上面的示例中,重写操作 my-xmll-crypt-action 通过使用 AES-256 批量加密方法和 my-certkey 中的 RSA 公钥加密批量加密密钥,对请求中的整个 XML 文档(XPATH_WITH_MARKUP (xp%/%))进行加密。该操作将使用包含加密数据和加密密钥的 <xenc:EncryptedData> 元素替换文档。31 表示的标志包括所有可选 <ds:KeyInfo> 元素。

操作 my-xml-解密操作解密响应中的第一个 <xenc:EncryptedData> 元素 (XPATH_WITH_MARKUP(xp%//xenc:EncryptedData%))。这要求事先使用以下 CLI 命令添加 xenc XML 命名空间:

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

my-xml-decrypt-action 操作使用 my-certkey 中的 RSA 私钥解密加密的密钥,然后使用元素中指定的批量加密方法解密加密的内容。最后,该操作将用解密的内容替换加密的数据元素。

重写策略 my-xml 加密策略将 my-xml 加密操作应用于对包含 xml-encrypt 的 URL 的请求。该操作会加密来自 Citrix ADC 设备上配置的服务的整个响应。

重写策略 my-xml-解密策略将 my-xml-解密操作应用于包含 <xenc:EncryptedData> 元素的请求(XPATH (xp%//xenc:cryptedDATA%) 返回非空字符串)。操作解密为 Citrix ADC 设备上配置的服务绑定的请求中的加密数据。

加密和解密 XML 有效负载