6

https 対応の Node.js では、証明書を.pemファイルとして持っています。

ここで、そのファイルからデータを読み取って、有効期限や共通名などの証明書に関する情報を取得したいと考えています。

Node独自のtlsモジュールもursaなどのモジュールもこれをサポートしていないのを見たことがあります。

もちろんopenssl、子プロセスとして呼び出してその出力ストリームを解析することもできますが (このタスクは OpenSSL を使用して実行できるはずです)、パス内の外部プログラムの可用性に依存しないソリューションを好みます。

どうすればこれを行うことができますか?

更新:一方、pem モジュールreadCertificateInfoが見つかりました。Node.js 0.8.18 を使用しても、共通名が正常に提供されます (これは、0.7 以降がサポートされていないと述べているドキュメントとは異なります) 。残念ながら、有効期限は返されません。

更新 2:openssl内部的には、pemは子プロセスを使用してコマンドを呼び出すだけです。もちろん、これは自分でできるので、必要な情報をopenssl直接取得できます。とにかく、誰かがより良いアイデアを持っていれば (この場合は、純粋な JavaScript / Node.js ソリューションを意味します)、私はそれについて喜んでいます:-)

4

2 に答える 2

4

その間、私は答えを見つけました: PEM フォーマットは基本的に Base64 暗号化を使用する ASN.1 です。

したがって、まず Base64 でデコードしてから、結果を ASN.1 として解析する必要があります。その結果、適切な値を含む証明書のデータ構造が得られます。

それでおしまい :-)!

于 2013-01-31T23:08:42.283 に答える
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' ] }

申し訳ありませんが、任意のローカル証明書を解析する適切な方法が見つかりませんでした。

于 2013-01-31T23:21:43.557 に答える