Encryption 在HA代理中使用aes_gcm_dec解密HTTP头

Encryption 在HA代理中使用aes_gcm_dec解密HTTP头,encryption,haproxy,Encryption,Haproxy,我正在尝试使用HA代理转换器,但至少可以说文档很少,而且我在社区中找不到任何使用它的示例 我有一个客户端正在HTTP头中发送AES GCM 128加密消息,如下所示: curl -H "X-Routing-Key: e4+DM/EkJQl4jAAOxNtDZb4dd5Q=" localhost:8000 print("X-Routing-Key: %s" % (base64.b64encode(b"".join([aesCipher.nonce, authTag, ciphertext])))

我正在尝试使用HA代理转换器,但至少可以说文档很少,而且我在社区中找不到任何使用它的示例

我有一个客户端正在HTTP头中发送AES GCM 128加密消息,如下所示:

curl -H "X-Routing-Key: e4+DM/EkJQl4jAAOxNtDZb4dd5Q=" localhost:8000
print("X-Routing-Key: %s" % (base64.b64encode(b"".join([aesCipher.nonce, authTag, ciphertext]))).decode('utf-8'))
我正在使用HA代理对该头进行解密,并将其以解密的形式转发到后端服务器。这是我的前端配置:

http-request set-header X-Routing-Key %[req.hdr(X-Routing-Key),b64dec,aes_gcm_dec(128,4+6ONmgZoNex0arqdTr7bA==,Zm9vb2Zvb29mb29wZm9vbw==,4QMQhILaVLC9oxyB8hGoZA==)]
aead标签目前在服务器上是硬编码的,这是基于我为生成加密的秘密而编写的。在将来,它可能会被客户机传递——与nonce相同。另外,请注意aes_gcm_dec转换器之前的
b64dec
转换器。我不确定是否需要它。我尝试了两种方法,但在当前设置中都不起作用


当我尝试这样做时,HA代理默默地失败了。标头到达后端时被设置为空字符串。即使调试冗长,HA代理也不会记录任何内容,但显然有些地方出了问题。有人知道我做错了什么吗?

我在HAProxy社区Slack chat上提供了这个答案,但如果有人在谷歌上发现了这个问题,你可以在HAProxy中做如下操作

http-request set-var(txn.enc) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(32)
http-request set-var(txn.nonce) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(0,16),base64
http-request set-var(txn.aead_tag) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(16,16),base64
http-request set-header X-Routing-Key %[var(txn.enc),aes_gcm_dec(128,txn.nonce,5AbcQVztUg4LYr406puUkw==,txn.aead_tag)]
确保AES输出包含加密文本、nonce和aead标记。在引用的Python中,它类似于:

curl -H "X-Routing-Key: e4+DM/EkJQl4jAAOxNtDZb4dd5Q=" localhost:8000
print("X-Routing-Key: %s" % (base64.b64encode(b"".join([aesCipher.nonce, authTag, ciphertext]))).decode('utf-8'))

我已经在HAProxy社区Slack聊天中提供了这个答案,但是如果有人在Google上找到这个答案,你可以在HAProxy中做如下操作

http-request set-var(txn.enc) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(32)
http-request set-var(txn.nonce) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(0,16),base64
http-request set-var(txn.aead_tag) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(16,16),base64
http-request set-header X-Routing-Key %[var(txn.enc),aes_gcm_dec(128,txn.nonce,5AbcQVztUg4LYr406puUkw==,txn.aead_tag)]
确保AES输出包含加密文本、nonce和aead标记。在引用的Python中,它类似于:

curl -H "X-Routing-Key: e4+DM/EkJQl4jAAOxNtDZb4dd5Q=" localhost:8000
print("X-Routing-Key: %s" % (base64.b64encode(b"".join([aesCipher.nonce, authTag, ciphertext]))).decode('utf-8'))

您是否尝试过不使用
b64dec
,因为它将在函数中完成。您还可以使用
http request capture req.hdr(X-Routing-Key)
捕获前后的值。您是否尝试不使用
b64dec
,因为它将在函数中完成。您还可以使用
http request capture req.hdr(X-Routing-Key)
捕获前后的值,这非常有效。然而,正如未来读者所看到的:它只适用于HA代理版本2.1.5及更高版本。我不确定早期版本中的潜在问题是什么,导致它无法正确解密消息并以静默方式失败。这是非常有效的。然而,正如未来读者所看到的:它只适用于HA代理版本2.1.5及更高版本。我不确定早期版本中的潜在问题是什么,导致它无法正确解密消息并以静默方式失败。