从 pem 格式的证书解析 DN(正确顺序)

Parsing a DN from certificate in pem format (correct order)

我看过一些与从 PEM 格式的证书解析 DN 相关的帖子。我正在编写一个 UNIX 脚本,它将读取给定路径中的 pem 文件,并以正确的顺序吐出它们相应的可分辨名称 (DN)。创建了一个简单的脚本,但在脚本中解析 pem 文件的命令是..

openssl x509 -in <file name.pem> -noout -subject

我的困惑是当我 运行 上面的命令时,它以 /C=US/ST=... 开头的顺序吐出 DN,但我知道证书 DN以“CN=”开头,这与命令吐出的内容完全相反。我很难相信 运行 的哪个命令会给我确切的命令,因为我使用该命令对用户进行身份验证,如果我输入错误的命令,请求将不会被授权,这会破坏目的。

DN 的组成部分的顺序是约定俗成的。
二进制 DER 编码中的物理顺序是 OpenSSL 在这里向您展示的顺序。
大多数工具使用并在 RFC 2253 中规范化的逻辑标准就是您所期望的。

这种“/C=US/ST=...”格式是旧的 OpenSSL 格式,现已过时。如果这是您使用 OpenSSL 默认获得的版本,那么您使用的是一个非常旧的版本,可能应该用更新的版本替换它。

为了控制 OpenSSL 如何显示主题,您需要使用 -nameopt 选项。您可以设置的值为:
-nameopt rfc2253 : 你想要的顺序,名称将是 "CN=xxx,OU=xxx,ST=xxx,C=FR" (no space, reverse订单)。
-nameopt oneline : 名称将是“C = FR, ST = xxx , OU = xxx , CN = xxx”。
-nameopt compat :名称将是“/C=US/ST=xxx/OU=xxx/CN=xxx”(没有 space ).

还有一件事,如果您比较 DN 的字符串来验证客户端,获得合理可靠结果的唯一方法是在最初和验证时使用完全相同的工具生成它。一旦 DN 包含不太常见的元素,当不使用相同的版本和相同的版本时,工具之间的变化太多,无法获得相同的 DN 字符串表示形式。