keystoneclient.common 包¶
子模块¶
keystoneclient.common.cms 模块¶
证书签名函数。
使用 subprocess 模块调用 set_subprocess()。可以使用 Python 的 subprocess 或 eventlet.green.subprocess。
如果未调用 set_subprocess(),则此模块将根据 os 模块是否被 eventlet 补丁来选择 Python 的 subprocess 或 eventlet.green.subprocess。
- class keystoneclient.common.cms.OpensslCmsExitStatus¶
基类:
object- COMMAND_OPTIONS_PARSING_ERROR = 1¶
- CREATE_CMS_READ_MIME_ERROR = 3¶
- INPUT_FILE_READ_ERROR = 2¶
- SUCCESS = 0¶
- keystoneclient.common.cms.cms_hash_token(token_id, mode='md5')¶
哈希 PKI 令牌。
- 返回:对于 asn1 或 pkiz 令牌,返回传入令牌的哈希值
否则,返回传入的值。
- keystoneclient.common.cms.cms_sign_data(data_to_sign, signing_cert_file_name, signing_key_file_name, outform='PEM', message_digest='sha256')¶
使用 OpenSSL 签署文档。
生成 DER 格式的 CMS 文档的 Base64 编码 http://en.wikipedia.org/wiki/Cryptographic_Message_Syntax
- 参数:
data_to_sign – 要签署的数据
signing_cert_file_name – 包含用于签署数据的私钥的公钥的 X509 证书的路径
signing_key_file_name – 用于签署数据的私钥的路径
outform – 签署文档的格式 PKIZ_CMS_FORM 或 PKI_ASN1_FORM
message_digest – 签署或重新签署时使用的摘要算法
- keystoneclient.common.cms.cms_sign_text(data_to_sign, signing_cert_file_name, signing_key_file_name, message_digest='sha256')¶
- keystoneclient.common.cms.cms_sign_token(text, signing_cert_file_name, signing_key_file_name, message_digest='sha256')¶
- keystoneclient.common.cms.cms_to_token(cms_text)¶
将 PEM 格式的 CMS 签名令牌转换为自定义 URL 安全格式。
转换包括将 PEM 格式令牌中的“/”字符替换为“-”字符,并进行其他此类文本替换,以便结果可以通过 HTTP 进行传输。因此,返回值可以用作 HTTP 标头(例如“X-Auth-Token”)的值。
这种临时转换是一个不幸的疏忽,因为返回的值现在不符合 base64 编码的任何标准变体。最好使用 base64url 编码(在 PEM 格式化的文本上,或者也许更好的是,在内部 CMS 签名二进制值上,而无需任何 PEM 格式化)。无论如何,相同的转换将反向完成(用于令牌验证),因此这里没有正确性问题。请注意,令牌的非标准编码将被保留,以免破坏向后兼容性。
代码作者在博客文章 http://adam.younglogic.com/2014/02/compressed-tokens/ 中详细介绍了转换问题。
- keystoneclient.common.cms.cms_verify(formatted, signing_cert_file_name, ca_file_name, inform='PEM')¶
根据 CMS 语法验证内容的签名。
- 引发:
- keystoneclient.common.cms.is_ans1_token(token)¶
已弃用。
此函数自 1.7.0 版本起已弃用,以支持
is_asn1_token(),并且可能在 2.0.0 版本中删除。
- keystoneclient.common.cms.is_asn1_token(token)¶
确定令牌是否基于 PKI。
感谢 ayoung 的整理。
base64 解码的十六进制表示形式的 MII 是 3082
In [3]: binascii.hexlify(base64.b64decode('MII=')) Out[3]: '3082'
参考:http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
pg4: For tags from 0 to 30 the first octet is the identfier pg10: Hex 30 means sequence, followed by the length of that sequence. pg5: Second octet is the length octet first bit indicates short or long form, next 7 bits encode the number of subsequent octets that make up the content length octets as an unsigned binary int 82 = 10000010 (first bit indicates long form) 0000010 = 2 octets of content length so read the next 2 octets to get the length of the content.
在内容长度非常大的情况下,可能需要超过 2 个字节来指定内容长度,因此我们需要检查 MIM、MIQ 等。
In [4]: base64.b64encode(binascii.a2b_hex('3083')) Out[4]: 'MIM=' In [5]: base64.b64encode(binascii.a2b_hex('3084')) Out[5]: 'MIQ=' Checking for MI would become invalid at 16 octets of content length 10010000 = 90 In [6]: base64.b64encode(binascii.a2b_hex('3090')) Out[6]: 'MJA=' Checking for just M is insufficient
但是,我们只会检查 MII:使用 2 个字节的内容的最大长度是 3FFF 或 16383。
在 http 中支持此长度或更大的令牌是不切实际的,因此我们将仅检查 MII 并忽略较大令牌的情况
- keystoneclient.common.cms.is_pkiz(token_text)¶
确定令牌是否为 PKIZ。
检查字符串是否具有指示它是 Crypto Message Syntax、Z 压缩令牌的前缀。
- keystoneclient.common.cms.pkiz_sign(text, signing_cert_file_name, signing_key_file_name, compression_level=6, message_digest='sha256')¶
- keystoneclient.common.cms.pkiz_uncompress(signed_text)¶
- keystoneclient.common.cms.pkiz_verify(signed_text, signing_cert_file_name, ca_file_name)¶
- keystoneclient.common.cms.set_subprocess(_subprocess=None)¶
设置要使用的 subprocess 模块。
如果使用 eventlet,则 subprocess 可以是 eventlet.green.subprocess,否则可以是 Python 的 subprocess。
- keystoneclient.common.cms.token_to_cms(signed_text)¶
将自定义格式的令牌转换为 PEM 格式的令牌。
有关自定义格式的详细信息,请参阅 cms_to_token() 文档。
- keystoneclient.common.cms.verify_token(token, signing_cert_file_name, ca_file_name)¶