我有一个 X509 PEM 文件,其内容如下
-----BEGIN CERTIFICATE-----
MIIDaaaaaaa==
-----END CERTIFICATE-----
获取它的通用名称(CN,理解为可以使用它的url)。 如红色方块所示,现代浏览器可以从 PEM 文件中读取 CN。 但是,我没有从
openssl x509 --help
的输出中找到这样的内容。
OpenSSL 的命令行工具不提供从证书的主题专有名称中仅提取公用名称的方法。
你必须自己以某种方式解析文本。
根据 OpenSSL'x
x509
手册页,您可以使用 -subject
来获取主题的可分辨名称:
选项
输入、输出和通用选项
...
-主题
输出主题名称。
...
但您只需要该 DN 的通用名称。还有
-nameopt 选项
决定主题或发行人名称的选项 显示。选项参数可以是单个选项或多个选项 选项以逗号分隔。或者,
开关可以是 多次使用来设置多个选项。查看名称选项 部分了解更多信息。-nameopt
从名称选项部分有
多行
多行格式。它相当于 esc_ctrl、esc_msb、sep_multiline、space_eq、lname 和align。
将主题 DN 组件拆分为多行,使得自动解析变得微不足道。
使用
openssl x509 -in filnname.pem -noout -subject -nameopt multiline
将产生类似
的输出subject=
commonName = CommonName
.
.
.
organizationName = OrgName
countryName = Country
如果您在 Linux 上运行,则可以处理该文本输出:
openssl x509 -in file.pem -noout -subject -nameopt multiline |\
grep commonName | awk '{ print $3 }'
如果需要处理通用名称中的空格:
openssl x509 -in file.pem -noout -subject -nameopt multiline |\
grep commonName | awk '{ $1=$2=""; print $3 }'
不幸的是,这会将通用名称中多个空格的每个实例替换为单个空格。通常,证书通用名称中不会出现空格,但也有可能出现空格。
而“CN,理解为可以使用的url”是不正确的。主题通用名称可以是 URL,但 CN 在验证网站时的使用已被弃用 20 多年:
虽然 使用通用名称是现有做法,已被弃用并且 鼓励证书颁发机构改用 dNSName。
如上所述,客户端不得寻求参考标识符的匹配 CN-ID(如果提供的标识符包括 DNS-ID、SRV-ID) URI-ID,或任何由应用程序支持的特定于应用程序的标识符类型 客户。
Chrome 和 Firefox 等浏览器在进行证书验证时一直忽略主题通用名称大约五年了。
我发现某些证书的值由 openssl 显示在与 commonName 相同的行上,并用 + 分隔。
我认为这取决于主题通用名称的形成方式——似乎可以使 CN 值成为多个子值的序列。
一个例子是 emailAddress,即使使用
-nameopt multiline,它也可以显示为
commonName=Joe Bloggs + [email protected]
。
为了解决这个问题,我的替代方法是使用
openssl asn1parse
代替:
openssl asn1parse -in '/pathto/thecert.crt' |\
awk -v FS=':' -v OFS='' '
BEGIN {e=0}
e==2 {$1="";$2="";$3="";print;exit}
/:commonName$/ {e++}
'