跳转到主要内容

IETF HTTP消息签名草稿标准的实现

项目描述

http-message-signatures 是Python中IETF RFC 9421 HTTP消息签名 草稿标准的实现。

安装

pip3 install http-message-signatures

摘要

from http_message_signatures import HTTPMessageSigner, HTTPMessageVerifier, HTTPSignatureKeyResolver, algorithms
import requests, base64, hashlib, http_sfv

class MyHTTPSignatureKeyResolver(HTTPSignatureKeyResolver):
    keys = {"my-key": b"top-secret-key"}

    def resolve_public_key(self, key_id: str):
        return self.keys[key_id]

    def resolve_private_key(self, key_id: str):
        return self.keys[key_id]

request = requests.Request('POST', 'https://example.com/foo?param=Value&Pet=dog', json={"hello": "world"})
request = request.prepare()
request.headers["Content-Digest"] = str(http_sfv.Dictionary({"sha-256": hashlib.sha256(request.body).digest()}))

signer = HTTPMessageSigner(signature_algorithm=algorithms.HMAC_SHA256, key_resolver=MyHTTPSignatureKeyResolver())
signer.sign(request, key_id="my-key", covered_component_ids=("@method", "@authority", "@target-uri", "content-digest"))

verifier = HTTPMessageVerifier(signature_algorithm=algorithms.HMAC_SHA256, key_resolver=MyHTTPSignatureKeyResolver())
verifier.verify(request)

请注意,验证正文内容摘要不在本包功能范围内,因此仍由调用者负责。 requests-http-signature 库基于此包提供请求正文的集成签名和验证。

给定一个 HTTP 请求可能包含多个签名,verify() 方法返回一个 VerifyResult 列表。然而,当前实现仅支持一个签名,因此返回的列表当前仅包含一个元素。如果在请求中找到更多签名,则抛出 InvalidSignature

此外,如果发生错误(无法加载 PEM 密钥、签名输入中指定了不支持的算法、签名与摘要不匹配等),verify() 方法会抛出 HTTPMessageSignaturesException 或从这个类派生的异常。

作者

  • Andrey Kislyuk

许可证

根据Apache License, Version 2.0 许可证条款。

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面