openssl -- 从 PEM 文件中提取通用名称

Mas*_*ind 1 ssl https openssl pem

我有一个 X509 PEM 文件,其内容如下

-----BEGIN CERTIFICATE-----
MIIDaaaaaaa==
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

获取它的通用名称(CN,理解为可以使用它的url)。如红色方块所示,现代浏览器可以从 PEM 文件中读取 CN。但是,我没有从 的输出中找到这样的内容openssl x509 --help

在此输入图像描述

And*_*nle 6

OpenSSL 的命令行工具不提供从证书的主题专有名称中仅提取公用名称的方法。

您必须以某种方式自己解析文本。

根据OpenSSL'xx509手册页,您可以使用-subject来获取主题的可分辨名称:

选项

输入、输出和通用选项

...

-主题

输出主题名称。

...

但您只需要该 DN 中的通用名称。还有

-nameopt 选项

确定主题或发行者名称如何显示的选项。选项参数可以是单个选项,也可以是用逗号分隔的多个选项。或者,-nameopt可以多次使用开关来设置多个选项。有关详细信息,请参阅“名称选项”部分。

从该NAME OPTIONS部分有

多行

多行格式。它相当于esc_ctrl、esc_msb、sep_multiline、space_eq、lname 和align。

将主题 DN 组件拆分为多行使得自动解析变得微不足道。

使用

openssl x509 -in filnname.pem -noout -subject -nameopt multiline
Run Code Online (Sandbox Code Playgroud)

会产生类似的输出

subject=
    commonName          = CommonName
     .
     .
     .
    organizationName    = OrgName
    countryName         = Country
Run Code Online (Sandbox Code Playgroud)

如果您在 Linux 上运行,则可以处理该文本输出:

openssl x509 -in file.pem -noout -subject -nameopt multiline |\
    grep commonName | awk '{ print $3 }'
Run Code Online (Sandbox Code Playgroud)

如果您需要处理通用名称中的空格:

openssl x509 -in file.pem -noout -subject -nameopt multiline |\
    grep commonName | awk '{ $1=$2=""; print $3 }'
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会将公用名称中多个空格的每个实例替换为单个空格。通常,证书通用名称中不会出现空格,但也有可能出现空格。

而“CN,理解为可以使用的url”是不正确的。主题通用名可以是 URL,但 CN 在验证网站时的使用已被弃用 20 多年

尽管使用通用名称是现有做法,但它已被弃用,并且鼓励证书颁发机构使用 dNSName 代替。

使用主题替代名称

如前所述,如果所呈现的标识符包括 DNS-ID、SRV-ID、URI-ID 或客户端支持的任何特定于应用程序的标识符类型,则客户端不得寻求 CN-ID 参考标识符的匹配。

Chrome 和 Firefox 等浏览器在进行证书验证时一直忽略主题通用名称大约五年了。