将 PEM 证书解析为 JSON

2023-12-29

我有 PEM 证书并且正在使用openssl查看其内容。是否可以将输出解析为 JSON 格式?也许有一个 Java 库或 Bash 脚本可以做到这一点?

命令:$ openssl x509 -in sample.cer -noout -text

output:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            af:69:46:11:10:bd:82:88
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, ST=Texas, L=Plano, O=2xoffice, OU=Architecture, CN=Joshua Davies/[email protected] /cdn-cgi/l/email-protection
        Validity
            Not Before: May 21 21:49:10 2014 GMT
            Not After : Jun 20 21:49:10 2014 GMT
        Subject: C=US, ST=Texas, L=Plano, O=2xoffice, OU=Architecture, CN=Joshua Davies/[email protected] /cdn-cgi/l/email-protection
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (512 bit)
                Modulus (512 bit):
                    00:b7:38:0d:e0:ab:37:18:a7:26:95:9d:9e:6f:a2:
                    69:b1:b9:ee:b3:7f:29:04:fb:f0:94:b3:d0:d5:55:
                    c0:d8:6b:14:7f:94:13:3c:d9:a2:61:bf:ba:3f:0a:
                    44:37:dc:18:b5:23:c7:ee:96:2d:7c:d8:92:04:48:
                    74:f8:c6:46:a5
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                1A:A5:C9:C8:36:EA:7D:FA:B4:DF:A4:9C:11:F9:C1:BE:78:C4:42:DD
            X509v3 Authority Key Identifier: 
                keyid:1A:A5:C9:C8:36:EA:7D:FA:B4:DF:A4:9C:11:F9:C1:BE:78:C4:42:DD
                DirName:/C=US/ST=Texas/L=Plano/O=2xoffice/OU=Architecture/CN=Joshua Davies/[email protected] /cdn-cgi/l/email-protection
                serial:AF:69:46:11:10:BD:82:88

            X509v3 Basic Constraints: 
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
        56:32:44:76:86:8c:08:92:74:71:0e:ac:a6:7d:ba:1d:7c:d3:
        b6:74:ef:27:7a:5e:53:21:fc:8e:eb:26:58:e0:6e:4f:5c:01:
        f1:40:ca:0a:e9:d2:0e:00:60:ae:1f:f6:a5:a4:4c:47:fb:e0:
        68:7f:25:63:ab:60:38:0f:74:94

我能够构建一个Python脚本来完成你正在寻找的事情。该脚本采用一个参数,<PEM FILE>并返回包含此证书内容的 JSON 对象。

$ ./pem2json.py <PEM FILE>

NOTE:该脚本可以选择采用第二个参数,-d如果您想查看更多转换,它将打印出调试信息。

Example

您可以从此网站下载示例 TLS 证书 -用于测试和验证的 X509 证书示例 http://fm4dd.com/openssl/certexamples.htm。具体来说,我将使用这个 PEM 文件:

  • 2048 RSA 证书 http://fm4dd.com/openssl/source/PEM/certs/2048b-rsa-example-cert.pemPEM 格式 1050 字节

下载后,我将其作为参数传递给 Python 脚本:

$ ./pem2json.py 2048b-dsa-example-cert.pem
{"notBefore": "Aug 22 07:27:22 2012 GMT", "serialNumber": "0E02", "notAfter": "Aug 21 07:27:22 2017 GMT", "version": 1, "subject": [[["countryName", "JP"]], [["stateOrProvinceName", "Tokyo"]], [["organizationName", "Frank4DD"]], [["commonName", "www.example.com"]]], "issuer": [[["countryName", "JP"]], [["stateOrProvinceName", "Tokyo"]], [["localityName", "Chuo-ku"]], [["organizationName", "Frank4DD"]], [["organizationalUnitName", "WebCert Support"]], [["commonName", "Frank4DD Web CA"]], [["emailAddress", "[email protected] /cdn-cgi/l/email-protection"]]]}

Code

$ cat pem2json.py
#!/usr/bin/python

import json
import os
import ssl
import sys
from collections import OrderedDict
from pprint import pprint as pp

def main():
    debug = False
    if len(sys.argv) == 3:
      if sys.argv[2] == "-d":
        debug = True

    if debug:
      print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
      print("cli arg1: {:s}\n".format(sys.argv[1]))

    cert_file_name = os.path.join(os.path.dirname(__file__), sys.argv[1])
    try:
        ordered_dict = OrderedDict()
        ordered_dict = ssl._ssl._test_decode_cert(cert_file_name)
        if debug: pp(ordered_dict)

    except Exception as e:
        print("Error decoding certificate: {:s}\n".format(e))

    print(json.dumps(ordered_dict))

if __name__ == "__main__":
    main()

调试输出

$ ./pem2json.py 2048b-dsa-example-cert.pem -d
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2

cli arg1: 2048b-dsa-example-cert.pem

{'issuer': ((('countryName', u'JP'),),
            (('stateOrProvinceName', u'Tokyo'),),
            (('localityName', u'Chuo-ku'),),
            (('organizationName', u'Frank4DD'),),
            (('organizationalUnitName', u'WebCert Support'),),
            (('commonName', u'Frank4DD Web CA'),),
            (('emailAddress', u'[email protected] /cdn-cgi/l/email-protection'),)),
 'notAfter': 'Aug 21 07:27:22 2017 GMT',
 'notBefore': u'Aug 22 07:27:22 2012 GMT',
 'serialNumber': u'0E02',
 'subject': ((('countryName', u'JP'),),
             (('stateOrProvinceName', u'Tokyo'),),
             (('organizationName', u'Frank4DD'),),
             (('commonName', u'www.example.com'),)),
 'version': 1L}
{"notBefore": "Aug 22 07:27:22 2012 GMT", "serialNumber": "0E02", "notAfter": "Aug 21 07:27:22 2017 GMT", "version": 1, "subject": [[["countryName", "JP"]], [["stateOrProvinceName", "Tokyo"]], [["organizationName", "Frank4DD"]], [["commonName", "www.example.com"]]], "issuer": [[["countryName", "JP"]], [["stateOrProvinceName", "Tokyo"]], [["localityName", "Chuo-ku"]], [["organizationName", "Frank4DD"]], [["organizationalUnitName", "WebCert Support"]], [["commonName", "Frank4DD Web CA"]], [["emailAddress", "[email protected] /cdn-cgi/l/email-protection"]]]}

参考

  • 将 openssl 命令的输出转换为 JSON https://stackoverflow.com/questions/43506011/convert-the-output-of-openssl-command-to-json/43506654
  • Python 中的有序字典 https://www.geeksforgeeks.org/ordereddict-in-python/
  • 18.2. json — JSON 编码器和解码器 https://docs.python.org/2/library/json.html
  • PyFormat - 使用 % 和 .format() 非常有用! https://pyformat.info/
  • 解析命令行参数的最佳方法是什么? https://stackoverflow.com/questions/20063/whats-the-best-way-to-parse-command-line-arguments
  • 如何使用 python 解码 SSL 证书? https://stackoverflow.com/questions/16899247/how-can-i-decode-a-ssl-certificate-using-python
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 PEM 证书解析为 JSON 的相关文章

随机推荐

  • 当我使用 Validator.TryValidateObject 时验证不起作用

    DataAnnotations 不适用于好友类 以下代码始终验证 true 为什么 var isValid Validator TryValidateObject new Customer Context results true 这是好友
  • 添加自定义 DLL 搜索路径@应用程序启动

    我正在绞尽脑汁试图想出一个优雅的解决方案来解决 DLL 加载问题 我有一个应用程序静态链接到加载 DLL 的其他 lib 文件 我没有直接加载 DLL 我希望在可执行文件所在的文件夹之外的另一个文件夹中拥有一些 DLL 例如 working
  • RabbitMQ:快速生产者和慢速消费者

    我有一个应用程序 它使用 RabbitMQ 作为消息队列在两个组件 发送者和接收者 之间发送 接收消息 发送者以非常快的方式发送消息 接收方收到消息后会做一些非常耗时的工作 主要是数据量非常大的数据库写入 由于接收方需要很长时间才能完成任务
  • 方法 JPQL 的查询验证失败

    我正在实现一个查询 该查询返回自定义对象中的输出 通过我的实现 我收到一个错误 方法公共抽象java util List org degs repository ConsolidateresponseRepository transacti
  • 可与类型索引中的和和积合并

    Haskell 中是否有类似于以下类型类的内容 class Mergeable f Type gt Type gt Type where merge f a b gt f c d gt f a c Either b d 特别是 想象有一个S
  • 在使用 VBA 填充列表的 Excel 中输入下拉列表时自动完成

    我正在使用下面的代码将数据从另一张表插入到下拉列表中 当用户从另一个下拉列表中选择某个选项时 即可实现这一点 lstRow Sheets Data Sheet Range D Rows Count End xlUp Row Sheets D
  • 如何使用 grep 查找单词列表

    我有一个文件 A 其中有 100 个单词 并用换行符分隔 我想搜索文件 B 以查看文件 A 中的任何单词是否出现在其中 我尝试了以下方法 但对我不起作用 grep F A B 您需要使用该选项 f grep f A B 选项 F进行固定字符
  • Protractor - 当 DOM 元素更改时,页面对象不会更新

    我正在测试使用 angular js 构建的 SPA 并使用页面对象模式来编写我的测试 在应用程序中 我们有许多将要更新的列表 例如 有一个附件列表 当添加 删除附件时 该列表将会更新 要添加附件 我们有一个模式窗口 当我们上传文件并单击
  • Python/Matplotlib - 调整绘图边缘与 x 轴之间的间距

    如何调整 x 轴和绘图窗口边缘之间的间距 我的 x 轴标签是垂直方向的 它们超出了 Matplotlib 绘制的窗口的边缘 这是一些示例代码 import matplotlib pyplot as plt x 1 2 3 4 5 y 1 2
  • GStreamer 插件搜索路径?

    我可以以某种方式告诉 GStreamer 在指定目录中查找插件吗 Use the GST PLUGIN PATH环境变量指向您想要的目录 或者以编程方式调用 GstRegistry registry registry gst registr
  • Oracle 使用代理模式创建数据库链接

    所以我想在 oracle 中创建一个数据库链接 我的用户名是 jefferson 我想通过 opms 连接 所以我被告知这样做 create database link tmpp connect to jefferson opms iden
  • 使用 PHP 在菜单项上设置活动类

    我有一个简单的菜单 ul li 元素和一个class active 来标记当前页面 一个变量被传递 get 通过 url 选择特定页面 pg PAGE 我对 php 相当陌生 仍在学习中 这工作得很好 但我觉得应该有一个更简单 更短的方法
  • 在 Javascript 中反转数字而不使其成为字符串[重复]

    这个问题在这里已经有答案了 谁能告诉我我的代码哪里出错了 我正在尝试反转数字而不将其更改为字符串 我一直在搜索谷歌并浏览了之前提出的有关该主题的问题 从我可以看到我的代码反映了其他答案 我只能找到不使用 to string 方法的 Java
  • Android中如何声明全局变量?

    我正在创建一个需要登录的应用程序 我创建了主要活动和登录活动 在主要活动中onCreate方法我添加了以下条件 public void onCreate Bundle savedInstanceState super onCreate sa
  • 使用反射获取属性的字符串名称

    有大量的反射示例可以让您获得 一个类中的所有属性 单个属性 前提是您知道字符串名称 有没有一种方法 使用反射 TypeDescriptor 或其他方式 在运行时获取类中属性的字符串名称 前提是我拥有 的只是类和属性的实例 我有一个类的实例
  • 如何将数据推送到 iPhone 应用程序?

    我是 iPhone 应用程序开发新手 我无法弄清楚如何将数据推送到应用程序 具体来说 我试图找到一种方法将新数据 用户帖子 从服务器推送到应用程序 而无需用户刷新 下拉刷新 有可能吗 有一个接近的解决方案 使用Apple推送通知服务 它允许
  • 连接字符串无法按预期工作[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我知道这是一个常见问题 但在寻找参考
  • aws_iam_policy 和 aws_iam_role_policy 之间的区别

    我有一个aws iam role我想添加一个策略 通常 我会创建一个策略aws iam role并将其附加到角色上aws iam role policy attachment 但是 我看过一些使用的文档aws iam role policy
  • 如何从另一个分支获取更改

    我目前正在研究featurex分支 我们的主分支被命名为our team 自从我开始工作以来featurex 对分支进行了更多更改our team 我在本地完成此操作是为了获取所有最新更改our team git checkout our
  • 将 PEM 证书解析为 JSON

    我有 PEM 证书并且正在使用openssl查看其内容 是否可以将输出解析为 JSON 格式 也许有一个 Java 库或 Bash 脚本可以做到这一点 命令 openssl x509 in sample cer noout text out