get_ca_certificates 和 get_certificate 之间的区别

问题描述 投票:0回答:1

我正在使用 python 加载 pfx 证书。

pfx = crypto.load_pkcs12(pfx, self.nfe_a1_password)
cert = pfx.get_certificate()
end = datetime.strptime(cert.get_notAfter(), '%Y%m%d%H%M%SZ')
subj = cert.get_subject()

http://www.pyopenssl.org/en/stable/api/crypto.html#OpenSSL.crypto.PKCS12.get_ca_certificates

我得到了一个有趣的证书,方法 get_certificate() 返回 None,如果我调用 get_ca_certificate 它会返回证书。

如果pfx不返回证书是什么意思?证书颁发者给我发错了?

python ssl pyopenssl
1个回答
0
投票

6年前的问题但是... 通常 pkcs#12 证书分为两部分:

  • 私钥,只有服务器/发行者知道,不会与第三方共享
  • 公钥,共享给客户

公钥由根CA(认证机构)签名,也可以是自签名。如果根本没有签名,则客户端可能无法连接到服务器(错误:浏览器或代码上下文中的证书不受信任)。关于您的问题,公共证书可能是一个包含所有中间 CA 的证书链。目的是让客户端跟踪服务器证书并返回根 CA 公钥。

公共(PEM 格式)证书是所有公钥和所有中间 CA 的串联,如下所示:

# Public key of the SSL certificate (the server certificate)
-----BEGIN CERTIFICATE-----
ggEPADCCAQoCggEBAMGPTyynn77hqcYnjWsMwOZDzdhVFY93s2OJntMbuKTHn39B

...

lffygD5IymCSuuDim4qB/9bh7oi37heJ4ObpBIzroPUOthbG4gv/5blW3Dc=

-----END CERTIFICATE-----

# Trust chain intermediate certificate
-----BEGIN CERTIFICATE-----

SHh/VzZpGhkdWtHUfcKc1H/hgBKueuqI6lfYygoKOhJJomIZeg0k9zfrtHOSewUj

...

K1pp74P1S8SqtCr4fKGxhZSM9AyHDPSsQPhZSZg=

-----END CERTIFICATE-----

# Trust chain root certificate
-----BEGIN CERTIFICATE-----

MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
...

HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==

-----END CERTIFICATE-----

因此,如果没有中间 CA,最后两个证书(

Trust chain intermediate certificate
Trust chain root certificate
)可能存在也可能不存在,因此调用

pfx.get_ca_certificates()

将是

None

如果不是 None 那么您可能希望将它们全部附加到您自己的证书链/文件中。

© www.soinside.com 2019 - 2024. All rights reserved.