Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Node.js从SSL证书读取过期日期和通用名称_Node.js_Ssl_Ssl Certificate - Fatal编程技术网

使用Node.js从SSL证书读取过期日期和通用名称

使用Node.js从SSL证书读取过期日期和通用名称,node.js,ssl,ssl-certificate,Node.js,Ssl,Ssl Certificate,在启用https的Node.js中,我将证书作为.pem文件 现在,我想从该文件中读取一些数据,以获得有关证书的信息,例如证书的过期日期和通用名称 正如我所看到的,无论是节点本身还是类似的模块都不支持这一点 当然,我可能会调用openssl作为子进程并解析其输出流(我认为使用openssl应该可以完成此任务),但我更喜欢不依赖路径中外部程序可用性的解决方案 我怎么能这样做 更新:与此同时,我发现了,它的readCertificateInfo成功地提供了公共名称,甚至使用了Node.js 0.8.

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

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

正如我所看到的,无论是节点本身还是类似的模块都不支持这一点

当然,我可能会调用
openssl
作为子进程并解析其输出流(我认为使用openssl应该可以完成此任务),但我更喜欢不依赖路径中外部程序可用性的解决方案

我怎么能这样做

更新:与此同时,我发现了,它的
readCertificateInfo
成功地提供了公共名称,甚至使用了Node.js 0.8.18(这与它的文档声明不支持0.7+相反)。不幸的是,它没有返回过期日期


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

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

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


就这样:-)

如果您是从类似于
tls.connect
的地方获取证书,您可以调用
getPeerCertificate()
,然后返回一个如下结构(连接到github.com):


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

基本正确,但我需要在实际连接之外使用它:-(知道有一个JS模块可以这样做吗?我所看到的一切都取决于是否安装了OpenSSL。@Golo Roden:只是一个旁注:base64是一种编码(它可以将字节表示为文本),而不是加密(base64不提供任何保密信息)。
{ 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' ] }