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)

模块内容