ssl get_ca_certificates和get_certificate的区别

3phpmpom  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(97)

我正在使用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不返回证书,这意味着什么?证书颁发者给我发错了?

yv5phkfx

yv5phkfx1#

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 certificateTrust chain root certificate)可能存在,也可能不存在,因此调用

pfx.get_ca_certificates()

将为None
如果不是无,那么你可能想把它们都附加到你自己的证书链/文件中。

相关问题