如何使用Python确定客户端证书类型?

问题描述

我有一个HTTP触发的Python Azure函数。承载此功能的App Service设置为Require客户端证书,并且仅使用HTTPS。

Azure通过X-ARR-ClientCert标头自动将客户端的证书从每个HTTP请求传递到功能代码

如何使用Python确定传入证书的类型(.der,.crt,.pem,.cer)?

示例:

  • 使用Postman进行测试时,我通过Settings/Certificates
  • 上传了.crt格式的证书
  • 邮递员将此文件编码为.der(二进制)文件,并将其传递给Function端点
  • Azure(负载均衡器?)接收到请求,并通过X-ARR-ClientCert标头将证书转发到我的Python函数代码
    • Azure不会更改其原始形式的证书(?)
    • 如果客户使用的是Python而不是Postman来生成请求,并且他们通过网络发送了一个.pem文件(而不是.der文件),则该函数将收到一个.pem文件

如何确定证书文件的类型,以便可以以编程方式解析文件中的属性IssuerCommon Namenot_valid_before/after等)?

strong>

解决方法

恐怕您无法使用python自动确定证书,但是您可以手动执行并直接查看编码的证书。

首先,以txt格式打开证书文件,如果有----BEGIN CERTIFICATE----之类的起始行,则为PEM格式,否则为{{1 }}格式。

然后,这里是一些common OpenSSL certificate manipulations

查看PEM编码的证书 使用带有证书扩展名的命令,用证书名称替换cert.xxx

DER

如果收到以下错误,则表示您正在尝试查看DER编码的证书,并且需要使用“查看下面的DER编码的证书”中的命令

无法加载证书 12626:错误:0906D06C:PEM例程:PEM_read_bio:无起始行:pem_lib.c:647:期望中:受信任的证书 查看DER编码的证书

openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.cer -text -noout
openssl x509 -in cert.crt -text -noout