community.crypto.x509_certificate_info 模块 – 提供 OpenSSL X.509 证书的信息

注意

此模块是 community.crypto 集合(版本 2.22.3)的一部分。

如果您正在使用 ansible 包,您可能已经安装了此集合。它不包含在 ansible-core 中。要检查是否已安装,请运行 ansible-galaxy collection list

要安装它,请使用:ansible-galaxy collection install community.crypto。您需要其他要求才能使用此模块,有关详细信息,请参阅 要求

要在 playbook 中使用它,请指定:community.crypto.x509_certificate_info

概要

  • 此模块允许查询 OpenSSL 证书的信息。

  • 它使用 cryptography Python 库与 OpenSSL 交互。

  • 请注意,当直接包含在 Ansible 中直到 2.9 版本时,此模块名为 openssl_certificate_info。当移动到 community.crypto 集合时,它被重命名为 community.crypto.x509_certificate_info。从 Ansible 2.10 开始,它仍然可以使用旧的短名称(或 ansible.builtin.openssl_certificate_info),它会重定向到 community.crypto.x509_certificate_info。当使用 FQCN 或使用 collections 关键字时,应使用新名称 community.crypto.x509_certificate_info 以避免出现弃用警告。

要求

执行此模块的主机上需要以下要求。

参数

参数

注释

content

字符串

在 community.crypto 1.0.0 中添加

PEM 格式的 X.509 证书的内容。

必须指定 pathcontent,但不能同时指定两者。

name_encoding

字符串

如何在返回值中编码名称(DNS 名称、URI、电子邮件地址)。

ignore 将使用后端返回的编码。

idna 会将域名所有标签转换为 IDNA 编码。将优先选择 IDNA2008,如果 IDNA2008 编码失败,则使用 IDNA2003。

unicode 会将域名所有标签转换为 Unicode。将优先选择 IDNA2008,如果 IDNA2008 解码失败,则使用 IDNA2003。

请注意idnaunicode 需要安装 idna Python 库

选项

  • "ignore" ← (默认)

  • "idna"

  • "unicode"

path

path

从中加载证书文件的远程绝对路径。

必须指定 pathcontent,但不能同时指定两者。

支持 PEM 和 DER 格式。

select_crypto_backend

字符串

确定要使用的加密后端。

默认选择是 auto,如果可用,它会尝试使用 cryptography

如果设置为 cryptography,将尝试使用 cryptography 库。

选项

  • "auto" ← (默认)

  • "cryptography"

valid_at

字典

一个字典,其中名称映射到时间规范。此处指定的每个时间都将检查证书在该时间点是否有效。有关结果的信息,请参阅 valid_at 返回值。

时间可以指定为相对时间或绝对时间戳。

时间将始终被解释为 UTC。

有效格式为 [+-]timespec | ASN.1 TIME,其中 timespec 可以是整数 + [w | d | h | m | s](例如 +32w1d2h),以及 ASN.1 TIME(换句话说,模式 YYYYMMDDHHMMSSZ)。请注意,所有时间戳都将被视为 UTC。

属性

属性

支持

描述

check_mode

支持:完全

此操作不修改状态。

可以在 check_mode 中运行,并返回更改状态预测,而无需修改目标。

diff_mode

支持: 不适用

此操作不修改状态。

在差异模式下,将返回已更改(或在 check_mode 中可能需要更改)的详细信息。

注意事项

注意

  • 所有时间戳值均以 ASN.1 TIME 格式提供,换句话说,遵循 YYYYMMDDHHMMSSZ 模式。它们全部为 UTC 时间。

另请参阅

另请参阅

community.crypto.x509_certificate

生成和/或检查 OpenSSL 证书。

community.crypto.x509_certificate_pipe

生成和/或检查 OpenSSL 证书。

community.crypto.x509_certificate_info 过滤器插件

此模块的过滤器变体。

community.crypto.to_serial 过滤器插件

将整数转换为以冒号分隔的十六进制数字列表。

示例

- name: Generate a Self Signed OpenSSL certificate
  community.crypto.x509_certificate:
    path: /etc/ssl/crt/ansible.com.crt
    privatekey_path: /etc/ssl/private/ansible.com.pem
    csr_path: /etc/ssl/csr/ansible.com.csr
    provider: selfsigned


# Get information on the certificate

- name: Get information on generated certificate
  community.crypto.x509_certificate_info:
    path: /etc/ssl/crt/ansible.com.crt
  register: result

- name: Dump information
  ansible.builtin.debug:
    var: result


# Check whether the certificate is valid or not valid at certain times, fail
# if this is not the case. The first task (x509_certificate_info) collects
# the information, and the second task (assert) validates the result and
# makes the playbook fail in case something is not as expected.

- name: Test whether that certificate is valid tomorrow and/or in three weeks
  community.crypto.x509_certificate_info:
    path: /etc/ssl/crt/ansible.com.crt
    valid_at:
      point_1: "+1d"
      point_2: "+3w"
  register: result

- name: Validate that certificate is valid tomorrow, but not in three weeks
  ansible.builtin.assert:
    that:
      - result.valid_at.point_1      # valid in one day
      - not result.valid_at.point_2  # not valid in three weeks

返回值

通用返回值在此处记录 这里,以下是此模块独有的字段

描述

authority_cert_issuer

列表 / 元素=字符串

证书的授权证书颁发者,作为通用名称列表。

如果不存在 AuthorityKeyIdentifier 扩展,则为 none

有关如何处理 IDN,请参阅 name_encoding

返回:成功

示例:["DNS:www.ansible.com", "IP:1.2.3.4"]

authority_cert_serial_number

整数

证书的授权证书序列号。

如果不存在 AuthorityKeyIdentifier 扩展,则为 none

此返回值是一个整数。如果需要以冒号分隔的十六进制字符串形式(例如 11:22:33)表示序列号,则需要使用 community.crypto.to_serial 将其转换为该形式。

返回:成功

示例:12345

authority_key_identifier

字符串

证书的授权密钥标识符。

标识符以十六进制形式返回,使用 : 分隔字节。

如果不存在 AuthorityKeyIdentifier 扩展,则为 none

返回:成功

示例:"00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33"

basic_constraints

列表 / 元素=字符串

basic_constraints 扩展中的条目,如果不存在扩展,则为 none

返回:成功

示例:["CA:TRUE", "pathlen:1"]

basic_constraints_critical

布尔值

basic_constraints 扩展是否为关键。

返回:成功

expired

布尔值

证书是否已过期(换句话说,notAfter 是否已过时)。

返回:成功

extended_key_usage

列表 / 元素=字符串

extended_key_usage 扩展中的条目,如果不存在扩展,则为 none

返回:成功

示例:["生物信息", "DVCS", "时间戳"]

extended_key_usage_critical

布尔值

extended_key_usage 扩展是否为关键。

返回:成功

extensions_by_oid

字典

返回每个扩展 OID 的字典。

返回:成功

示例:{"1.3.6.1.5.5.7.1.24": {"critical": false, "value": "MAMCAQU="}}

critical

布尔值

扩展是否为关键。

返回:成功

value

字符串

扩展的 Base64 编码值(采用 DER 格式)。

请注意,根据所使用的 cryptography 版本,无法提取扩展的 ASN.1 内容,而只能提供扩展的重新编码内容,如果 cryptography 解析了该内容。这通常应产生完全相同的值,除非原始扩展值格式错误。

返回:成功

示例:"MAMCAQU="

fingerprints

字典

在 community.crypto 1.2.0 中添加

整个证书 DER 编码形式的指纹。

对于每个可用的哈希算法,都会计算指纹。

返回:成功

示例:"{'sha256': 'd4:b3:aa:6d:c8:04:ce:4e:ba:f6:29:4d:92:a3:94:b0:c2:ff:bd:bf:33:63:11:43:34:0f:51:b0:95:09:2f:63', 'sha512': 'f7:07:4a:f0:b0:f0:e6:8b:95:5f:f9:e6:61:0a:32:68:f1...'"

issuer

字典

证书的颁发者。

请注意,对于重复的值,仅返回最后一个值。

返回:成功

示例:{"commonName": "ca.example.com", "organizationName": "Ansible"}

issuer_ordered

列表 / 元素=列表

证书的颁发者,作为有序的元组列表。

返回:成功

示例:[["organizationName", "Ansible"], [{"commonName": "ca.example.com"}]]

issuer_uri

字符串

在 community.crypto 2.9.0 中添加

颁发者 URI(如果包含在证书中)。如果未包含颁发者 URI,则为 none

返回:成功

key_usage

字符串

key_usage 扩展中的条目,如果不存在扩展,则为 none

返回:成功

示例:"['密钥协议', '数据加密']"

key_usage_critical

布尔值

key_usage 扩展是否为关键。

返回:成功

not_after

字符串

以 ASN.1 TIME 格式表示的 notAfter 日期。

返回:成功

示例:"20190413202428Z"

not_before

字符串

以 ASN.1 TIME 格式表示的 notBefore 日期。

返回:成功

示例:"20190331202428Z"

ocsp_must_staple

布尔值

如果存在 OCSP Must Staple 扩展,则为 true,否则为 none

返回:成功

ocsp_must_staple_critical

布尔值

ocsp_must_staple 扩展是否为关键。

返回:成功

ocsp_uri

字符串

OCSP 响应程序 URI(如果包含在证书中)。如果未包含 OCSP 响应程序 URI,则为 none

返回:成功

public_key

字符串

PEM 格式的证书公钥。

返回:成功

示例:"-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A..."

public_key_data

字典

在 community.crypto 1.7.0 中添加

公钥数据。取决于公钥的类型。

返回:成功

curve

字符串

ECC 的曲线名称。

返回:public_key_type=ECC

exponent

整数

RSA 密钥的公共指数。

返回:public_key_type=RSA

exponent_size

整数

私钥的最大位数。这基本上是所用子群的位大小。

返回:public_key_type=ECC

g

整数

DSA 的 g 值。

这是跨越所用素数域乘法群子群的元素。

返回:public_key_type=DSA

modulus

整数

RSA 密钥的模数。

返回:public_key_type=RSA

p

整数

DSA 的 p 值。

这是进行算术运算所依据的素数模数。

返回:public_key_type=DSA

q

整数

DSA 的 q 值。

这是一个能整除 p - 1 的素数,同时也是所用素数域乘法群的子群的阶。

返回:public_key_type=DSA

大小

整数

模数(RSA)或素数(DSA)的位大小。

返回:public_key_type=RSApublic_key_type=DSA

x

整数

椭圆曲线上公共点的 x 坐标。

返回:public_key_type=ECC

y

整数

对于 public_key_type=ECC,这是椭圆曲线上公共点的 y 坐标。

对于 public_key_type=DSA,这是公开已知的群元素,其相对于 g 的离散对数是私钥。

返回:public_key_type=DSApublic_key_type=ECC

public_key_fingerprints

字典

证书公钥的指纹。

对于每个可用的哈希算法,都会计算指纹。

返回:成功

示例:"{'sha256': 'd4:b3:aa:6d:c8:04:ce:4e:ba:f6:29:4d:92:a3:94:b0:c2:ff:bd:bf:33:63:11:43:34:0f:51:b0:95:09:2f:63', 'sha512': 'f7:07:4a:f0:b0:f0:e6:8b:95:5f:f9:e6:61:0a:32:68:f1...'"

public_key_type

字符串

在 community.crypto 1.7.0 中添加

证书的公钥类型。

可以是 RSADSAECCEd25519X25519Ed448X448 之一。

如果无法确定密钥类型,将以 unknown 开头。

返回:成功

示例: "RSA"

serial_number

整数

证书的序列号。

此返回值是一个整数。如果需要以冒号分隔的十六进制字符串形式(例如 11:22:33)表示序列号,则需要使用 community.crypto.to_serial 将其转换为该形式。

返回:成功

示例: 1234

signature_algorithm

字符串

用于签署证书的签名算法。

返回:成功

示例: "sha256WithRSAEncryption"

subject

字典

证书的主题,以字典形式表示。

请注意,对于重复的值,仅返回最后一个值。

返回:成功

示例: {"commonName": "www.example.com", "emailAddress": "[email protected]"}

subject_alt_name

列表 / 元素=字符串

subject_alt_name 扩展中的条目,如果不存在扩展,则为 none

有关如何处理 IDN,请参阅 name_encoding

返回:成功

示例:["DNS:www.ansible.com", "IP:1.2.3.4"]

subject_alt_name_critical

布尔值

subject_alt_name 扩展是否为关键扩展。

返回:成功

subject_key_identifier

字符串

证书的主题密钥标识符。

标识符以十六进制形式返回,使用 : 分隔字节。

如果不存在 SubjectKeyIdentifier 扩展,则为 none

返回:成功

示例:"00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33"

subject_ordered

列表 / 元素=列表

证书的主题,以有序的元组列表形式表示。

返回:成功

示例: [["commonName", "www.example.com"], [{"emailAddress": "[email protected]"}]]

valid_at

字典

对于在 valid_at 选项中提供的每个时间戳,返回一个布尔值,表示证书在该时间点是否有效。

返回:成功

version

整数

证书版本。

返回:成功

示例: 3

作者

  • Felix Fontein (@felixfontein)

  • Yanis Guenane (@Spredzy)

  • Markus Teufelberger (@MarkusTeufelberger)