我正在尝试使用 HA 代理aes_gcm_dec转换器,但至少可以说文档很少,而且我在社区中找不到任何使用它的示例。
我有一个客户端在 HTTP 标头中发送 AES GCM 128 加密消息,如下所示:
curl -H "X-Routing-Key: e4+DM/EkJQl4jAAOxNtDZb4dd5Q=" localhost:8000
我正在使用 HA 代理解密该标头,并以解密形式将其转发到后端服务器。这是我的前端配置:
http-request set-header X-Routing-Key %[req.hdr(X-Routing-Key),b64dec,aes_gcm_dec(128,4+6ONmgZoNex0arqdTr7bA==,Zm9vb2Zvb29mb29wZm9vbw==,4QMQhILaVLC9oxyB8hGoZA==)]
aead标签目前在服务器上进行了硬编码,基于我为生成加密密钥编写的简单python脚本。将来它可能会被客户端传递 - 与随机数相同。另外,请注意aes_gcm_dec转换器之前的b64dec
转换器。我不确定是否需要它。我已经尝试了两种方式,但在当前设置中都不起作用。
当我尝试执行此操作时,HA 代理静默失败。标头在到达后端时设置为空字符串。即使调试冗长,HA 代理也不会记录任何内容,但显然有问题。有谁知道我在这里做错了什么?
我已经在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 输出包含加密文本、随机数和 aead 标记。在引用的 Python 中,它将是这样的:
print("X-Routing-Key: %s" % (base64.b64encode(b"".join([aesCipher.nonce, authTag, ciphertext]))).decode('utf-8'))