示例 10:基于策略的 RSA 加密

RSA 算法使用 PKEY_CANET_PEM () 函数对 HTTP 预定义和用户定义的标头或正文内容进行加密。该函数仅接受 RSA 公钥(非私钥),并且加密数据的长度不能超过公钥的长度。当加密的数据短于密钥长度时,算法使用 RSA_PKCS1 填充方法。

在示例方案中,该函数可以在重写操作中与 B64ENCODE() 函数一起使用,以便将 HTTP 标头值替换为由 RSA 公钥加密的值。然后,收件人使用 RSA 私钥对正在加密的数据进行解密。

您可以使用重写策略来实现该功能。为此,您必须完成以下任务:

  1. 添加 RSA 公钥作为策略表达式。
  2. 创建重写操作。
  3. 创建重写策略。
  4. 将重写策略绑定为全局。
  5. 验证 RSA 加密

使用 Citrix ADC 命令接口进行基于策略的 RSA 加密

通过使用 Citrix ADC 命令接口,完成以下任务以配置基于策略的 RSA 加密。

使用 Citrix ADC 命令接口将 RSA 公钥作为策略表达式添加

add policy expression pubkey '"-----BEGIN RSA PUBLIC KEY-----MIGJAoGBAKl5vgQEj73Kxp+9yn1v5gPR1pnc4oLM2a0kaWwBOsB6rzCIy6znwnvwCY1xRvQhRlJSAyJbloL7wZFIJ2FOR8Cz+8ZQWXU2syG+udi4EnWqLgFYowF9zK+o79az597eNPAjsHZ/C2oL/+6qY5a/f1z8bQPrHC4GpFfAEJhh/+NnAgMBAAE=-----END RSA PUBLIC KEY-----"'

要使用 Citrix ADC 命令接口添加重写操作以加密 HTTP 标头请求,请执行以下操作

add rewrite action encrypt_act insert_http_header encrypted_data

HTTP.REQ.HEADER("data_to_encrypt").PKEY_ENCRYPT_PEM(pubkey).B64ENCODE

要使用 Citrix ADC 命令接口添加重写策略,请执行以下操作

add rewrite policy encrypt_pol 'HTTP.REQ.HEADER("data_to_encrypt").EXISTS' encrypt_act

使用 Citrix ADC 命令接口将重写策略全局绑定:

bind rewrite global encrypt_pol 10 -type RES_DEFAULT

要使用 Citrix ADC 命令接口验证 RSA 加密,请执行以下操作

>curl -v -H "data_to_encrypt: Now is the time that tries men's souls" http://10.217.24.7/`

* About to connect() to 10.217.24.7 port 80 (#0)

*  Trying 10.217.24.7...

*  connected

*  Connected to 10.217.24.7 (10.217.24.7) port 80 (#0)

> GET / HTTP/1.1
> User-Agent: curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3
> Host: 10.217.24.7
> Accept: \*/\*
> data_to_encrypt: Now is the time that tries men's souls
>
< HTTP/1.1 200 OK
< Date: Mon, 09 Oct 2017 05:22:37 GMT
< Server: Apache/2.2.24 (FreeBSD) mod_ssl/2.2.24 OpenSSL/0.9.8y DAV/2
< Last-Modified: Thu, 20 Feb 2014 20:29:06 GMT
< ETag: "6bd9f2-2c-4f2dc5b570880"
< Accept-Ranges: bytes
< Content-Length: 44
< Content-Type: text/html
< encrypted_data: UliegKBJqZd7JdaC49XMLEK1+eQN2rEfevypW91gKvBVlaKM9N9/C2BKuztS99SE0xQaisidzN5IgeIcpQMn+CiKYVlLzPG1RuhGaqHYzIt6C8A842da7xE4OlV5SHwScqkqZ5aVrXc3EwtUksna7jOLr40aLeXnnB/DB11pUAE=
<
* Connection #0 to host 10.217.24.7 left intact
<html><body><h1>It works!</h1></body></html>* Closing connection #0

使用要加密的相同数据执行此 curl 命令后续表明每次执行的加密数据是不同的。这是因为填充在要加密的数据开头插入随机字节,导致加密的数据每次都不同。

>curl -v -H "data_to_encrypt: Now is the time that tries men's souls" http://10.217.24.7/`

< encrypted_data: DaOjtl1Pl4DlQKf58MMeL4cFwFvZwhjMqv5aUYM5Iyzk4UpwIYhpRvgTNu2lXEVc1H0tcR1EGC/ViQncLc4EbTurCWLbzjce3+fknnMmzF0lRT6ZZXWbMvsNFOxDA1SnuAgwxWXy/ooe9Wy6SYsL2oi1sr5wTG+RihDd9zP+P14=

>curl -v -H "data_to_encrypt: Now is the time that tries men's souls" http://10.217.24.7/

. . .

< encrypted_data: eej6YbGP68yHn48qFUvi+fkG+OiO8j3yYLScrRBU+TPQ8WeDVaWnDNAVLvL0ZYHHAU1W2YDRYb+8cdKHLpW36QbI6Q5FfBuWKZSI2hSyUvypTpCoAYcHXFv0ns+tRtg0EPNNj+lyGjKQWtFi6K8IXXISoDy42FblKIlaA7gEriY=

使用 GUI 进行基于策略的 RSA 加密

GUI 使您能够完成以下任务:

要使用 GUI 将 RSA 公钥添加为策略表达式,请执行以下操作

  1. 登录 Citrix ADC 设备,然后导航到配置 > AppExpert > 高级表达式
  2. 在详细信息窗格中,单击添加将 RSA 公钥定义为高级策略表达式。
  3. 在“创建表达式”页面中,设置以下参数:
    1. 表达式名称。高级表达式的名称。
    2. 表达式。使用表达式编辑器将 RSA 公钥定义为高级表达式。
    3. 评论。表达式的简要描述。
  4. 单击创建

要使用 GUI 添加重写操作以加密 HTTP 标头请求

  1. 登录 Citrix ADC 设备并导航到配置 > AppExpert > 重写 > 操作
  2. 在详细信息窗格中,单击添加以添加重写操作。
  3. 在“创建重写操作”屏幕中,设置以下参数:
    1. Name(名称)。重写操作的名称。
    2. 类型。选择操作类型作为 INSERT_HTTP_HEADER。
    3. 使用操作类型插入标头。输入需要重写的 HTTP 标头的名称。
    4. 表达式。与操作关联的高级策略表达式的名称。
    5. 评论。重写操作的简要描述。
  4. 单击创建

要使用 GUI 添加重写高级策略,请执行以下操作

  1. 登录 Citrix ADC 设备并导航到配置 > AppExpert > 重写 > 策略
  2. 在“重写策略”页面中,单击“添加”以添加重写策略。
  3. 在“创建重写策略”页面中,设置以下参数:
    1. Name(名称)。重写策略的名称。
    2. 操作。如果请求或响应与此重写策略匹配,则要执行的重写操作的名称。
    3. 记录操作。请求与此策略匹配时要使用的消息日志操作的名称。
    4. 未定义的结果操作。如果策略评估结果未定义,则应采取的操作。
    5. 表达式。触发操作的高级策略表达式的名称。
    6. 评论。重写操作的简要描述。
  4. 单击创建

使用 GUI 绑定全局重写策略

  1. 登录 Citrix ADC 设备并导航到配置 > AppExpert > 重写 > 策略
  2. 在“重写策略”屏幕中,选择要绑定的重写策略,然后单击“策略管理器”。
  3. 在“重写策略管理器”页面的“绑定点”部分中,设置以下参数:
    1. 绑定点。选择绑定点作为默认全局。
    2. 协议。选择协议类型作为 HTTP。
    3. 连接类型。选择连接类型作为请求。
    4. 单击继续查看策略绑定部分。
    5. 策略绑定部分,选择重写策略并设置绑定参数。
  4. 单击 Bind(绑定)。