文章目录
apisix-hmac-auth插件进行接口签名身份验证
HMAC 是一种基于哈希函数的消息认证码,常用于验证消息的完整性和真实性。它需要一个密钥(secret key)和一个哈希算法(如 SHA-256)来生成签名。
- 请求签名:客户端对请求内容生成 HMAC 签名,服务端验证签名是否匹配。
- 防篡改:确保请求在传输过程中未被修改。
- 身份验证:验证请求是否来自合法的客户端。
apisix-HMAC
插件
官网:https://apisix.apache.org/zh/docs/apisix/plugins/hmac-auth/
hmac-auth
插件支持 HMAC(基于哈希的消息认证码)身份验证,作为一种确保请求完整性的机制,防止它们在传输过程中被修改。要使用该插件,您需要在 Consumers 上配置 HMAC 密钥,并在 Routes 或 Services 上启用该插件。
启用后,插件会验证请求的 Authorization
标头中的 HMAC 签名,并检查传入请求是否来自可信来源。具体来说,当 APISIX 收到 HMAC 签名的请求时,会从 Authorization
标头中提取密钥 ID。然后,APISIX 会检索相应的消费者配置,包括密钥。如果密钥 ID 有效且存在,APISIX 会使用请求的 Date
标头和密钥生成 HMAC 签名。如果生成的签名与 Authorization
标头中提供的签名匹配,则请求经过身份验证并转发到上游服务。
APISIX HMAC认证的工作原理
- 消费者配置:
- 每个消费者都有一个唯一的
access_key
和secret_key
- 消费者配置中还可以指定算法、签名头等
- 每个消费者都有一个唯一的
- 请求流程:
- 客户端使用
secret_key
计算签名 - 客户端在请求中包含
access_key
和签名 - APISIX根据
access_key
查找对应的消费者 - APISIX使用消费者的
secret_key
验证签名
- 客户端使用
常用配置项
官方文档:https://apisix.apache.org/zh/docs/apisix/plugins/hmac-auth/#
常用配置项:
“hide_credentials”: true
向上游隐藏授权信息# 传递给上游的Authorization
标头包含签名和所有其他详细信息。这可能会带来安全风险。clock_skew
客户端请求的时间戳与 APISIX 服务器当前时间之间允许的最大时间差(以秒为单位)。这有助于解决客户端和服务器之间的时间同步差异,并防止重放攻击。时间戳将根据 Date 头中的时间(必须为 GMT 格式)进行计算。signed_headers
客户端请求的 HMAC 签名中应包含的 HMAC 签名头列表validate_request_body
如果为 true,则验证请求正文的完整性,以确保在传输过程中没有被篡改。具体来说,插件会创建一个 SHA-256 的 base64 编码 digest,并将其与Digest
头进行比较。如果Digest
头丢失或 digest 不匹配,验证将失败.
请求体(request body)会参与 HMAC 签名的计算。如果请求体被篡改,签名验证会失败。
适用场景:需要确保请求体完整性的高安全性接口(如支付、敏感数据提交)。@request-target
的含义
在 APISIX 的 hmac-auth
插件中,@request-target
是一个特殊的占位符,用于表示 HTTP 请求的 目标部分(即请求方法和路径)。它是 HMAC 签名计算中的一个关键字段,用于确保请求的完整性和防篡改。
在 hmac-auth
插件的 signed_headers
配置中,可以指定 @request-target
参与签名计算。例如:
"plugins": {
"hmac-auth": {
"signed_headers": ["@request-target", "date", "content-type"]