使用Node.js从SSL证书中读取到期日期和公用名

时间:2013-01-30 08:49:02

标签: node.js ssl ssl-certificate

在支持https的Node.js中,我将证书作为.pem文件。

现在我想从该文件中读取一些数据,以获取有关证书的信息,例如证书的到期日期和公用名。

正如我所看到的,既没有Node自己的tls module,也没有ursa这样的模块支持这个。

当然我可以将openssl称为子进程并解析其输出流(我认为这个任务应该可以使用OpenSSL),但我更喜欢不依赖于外部程序可用性的解决方案在路上。

我怎么能这样做?

更新:同时,我找到pem module,其readCertificateInfo成功提供了通用名称,即使使用Node.js 0.8.18(这与其相反)声明0.7+不受支持的文档。不幸的是,它没有返回到期日期。

更新2:在内部,pem只使用子进程调用openssl命令。当然我可以自己做,因此我可以直接从openssl检索所需的信息。无论如何,如果有人有更好的想法(在这种情况下意味着纯JavaScript / Node.js解决方案),我会很高兴: - )

2 个答案:

答案 0 :(得分:4)

同时我找到答案:PEM格式基本上是使用Base64加密的ASN.1。

因此,您需要首先进行Base64解码,然后将结果解析为ASN.1。结果是证书的数据结构,其中包含适当的值。

就是这样: - )!

答案 1 :(得分:3)

如果您从tls.connect之类的地方获取证书,则可以致电getPeerCertificate(),然后您将获得一个看起来像这样的结构(连接到github.com):

{ subject: 
   { C: 'US',
     ST: 'California',
     L: 'San Francisco',
     O: 'GitHub, Inc.',
     CN: '*.github.com' },
  issuer: 
   { C: 'US',
     O: 'DigiCert Inc',
     OU: 'www.digicert.com',
     CN: 'DigiCert High Assurance CA-3' },
  subjectaltname: 'DNS:*.github.com, DNS:github.com',
  modulus: 'EF45CDFAEC13EF3E0CD38685530109CA9A3A4E5AF980CBC1BD51509C9944A8CDEB61EA951D4F3053C69FD6D355EDD13A3A43E96DD437C98813DA458E5C99F0811D7A0736EAB1DF0E3C600590A212DB3566D6E077A8A37951A653104F37BC46E38EDC101393990D6AB3101D8714DD78607B547B34A9F2E9E33B5F51B56AA76220BF9DE12A757D9424524A8DCD2D9B5C962FD8DFE8FD38BD80AC116061E7B3B7BF81AE8321C9EB7488F27D116603425FA755F4EC00ABF123BB5AABFBCA7C13AB288C0EC122F99424CA06A4D2A846D6D44618E5CF21B6B9D6D9518639506604A906600F1D6FA8A09B82AF7143645577A656B16D35EC7CAF48AD012E762D16E6D7C1',
  exponent: '10001',
  valid_from: 'Apr 30 00:00:00 2012 GMT',
  valid_to: 'Jul  9 12:00:00 2014 GMT',
  fingerprint: 'B1:4B:A1:6F:5C:EE:28:DA:C4:86:CD:D9:F2:80:8F:2E:A7:4A:51:F4',
  ext_key_usage: [ '1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2' ] }

我还没有找到解析任意本地证书的好方法,抱歉。