使用Node.js从SSL证书读取过期date和公共名称

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

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

正如我所看到的Node既不是自己的tls模块,也不是像ursa这样的模块。

当然,我可能会将openssl作为一个subprocess调用并parsing它的输出stream(我认为这个任务应该可以使用OpenSSL来实现),但是我更喜欢一个解决scheme,而不依赖path中外部程序的可用性。

我怎么能这样做?

更新:同时,我find了pem模块 ,它的readCertificateInfo提供了通用名称,即使使用了Node.js 0.8.18(这与它的文档说谁支持0.7+是相反的)。 不幸的是,它不会返回到期date。

更新2:在内部,pem只是使用subprocess调用openssl命令。 当然,我可以自己做,因此我可以直接从openssl获取所需的信息。 无论如何,如果有人有一个更好的主意(在这种情况下,这意味着一个纯粹的JavaScript / Node.js解决scheme),我会很高兴:-)

同时我find了答案:PEM格式基本上是使用Base64encryption的ASN.1。

因此,您需要先Base64解码,然后parsing结果为ASN.1。 结果是具有适当值的证书的数据结构。

而已 :-)!

如果你从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' ] } 

我还没有find一个体面的方式parsing任意本地证书,但是,对不起。