TLS (SSL)#

安定性: 2 - Stable

ソースコード: lib/tls.js

node:tls モジュールは、OpenSSL 上に構築された Transport Layer Security (TLS) および Secure Socket Layer (SSL) プロトコルの実装を提供します。このモジュールは次のようにアクセスできます。

import tls from 'node:tls';const tls = require('node:tls');

暗号化サポートが利用できないかどうかの判断#

Node.js は node:crypto モジュールのサポートを含めずにビルドされる可能性があります。そのような場合、tls から import しようとするか、require('node:tls') を呼び出すと、エラーがスローされます。

CommonJSを使用している場合、スローされたエラーはtry/catchを使ってキャッチできます。

let tls;
try {
  tls = require('node:tls');
} catch (err) {
  console.error('tls support is disabled!');
} 

レキシカルなESMのimportキーワードを使用する場合、モジュールをロードしようとするに(例えば、プリロードモジュールを使用して)process.on('uncaughtException')のハンドラーが登録されている場合にのみエラーをキャッチできます。

ESMを使用している場合、暗号化サポートが有効になっていないNode.jsのビルドでコードが実行される可能性があるなら、レキシカルなimportキーワードの代わりにimport()関数の使用を検討してください。

let tls;
try {
  tls = await import('node:tls');
} catch (err) {
  console.error('tls support is disabled!');
} 

TLS/SSL の概念#

TLS/SSL は、公開鍵基盤 (PKI) に依存してクライアントとサーバー間の安全な通信を可能にするプロトコルのセットです。ほとんどの一般的なケースでは、各サーバーは秘密鍵を持つ必要があります。

秘密鍵は複数の方法で生成できます。以下の例は、OpenSSL コマンドラインインターフェースを使用して 2048 ビットの RSA 秘密鍵を生成する方法を示しています。

openssl genrsa -out ryans-key.pem 2048 

TLS/SSL では、すべてのサーバー (および一部のクライアント) は証明書を持つ必要があります。証明書は秘密鍵に対応する公開鍵であり、認証局 (Certificate Authority) または秘密鍵の所有者によってデジタル署名されています (このような証明書は「自己署名証明書」と呼ばれます)。証明書を取得するための最初のステップは、証明書署名要求 (CSR) ファイルを作成することです。

OpenSSL コマンドラインインターフェースを使用して、秘密鍵の CSR を生成できます。

openssl req -new -sha256 -key ryans-key.pem -out ryans-csr.pem 

CSR ファイルが生成されると、それを認証局に送って署名してもらうか、自己署名証明書を生成するために使用することができます。

OpenSSL コマンドラインインターフェースを使用して自己署名証明書を作成する例を以下に示します。

openssl x509 -req -in ryans-csr.pem -signkey ryans-key.pem -out ryans-cert.pem 

証明書が生成されると、それを使用して .pfx または .p12 ファイルを生成できます。

openssl pkcs12 -export -in ryans-cert.pem -inkey ryans-key.pem \
      -certfile ca-cert.pem -out ryans.pfx 

ここで、

  • in: 署名された証明書です。
  • inkey: 関連付けられた秘密鍵です。
  • certfile: すべての認証局 (CA) 証明書を1つのファイルに連結したものです。例: cat ca1-cert.pem ca2-cert.pem > ca-cert.pem

前方秘匿性 (Perfect Forward Secrecy)#

前方秘匿性または完全前方秘匿性という用語は、鍵合意 (つまり鍵交換) メソッドの機能を説明します。つまり、サーバーとクライアントの鍵は、現在の通信セッションに特化して使用される新しい一時的な鍵をネゴシエートするために使用されます。実際には、これは、たとえサーバーの秘密鍵が漏洩したとしても、攻撃者がセッション用に特別に生成された鍵ペアを入手しない限り、通信は盗聴者によって復号化できないことを意味します。

完全前方秘匿性は、すべての TLS/SSL ハンドシェイクで鍵合意のための鍵ペアをランダムに生成することによって達成されます (すべてのセッションで同じ鍵を使用するのとは対照的です)。この手法を実装するメソッドは「エフェメラル (ephemeral)」と呼ばれます。

現在、完全前方秘匿性を実現するために一般的に使用される2つの方法があります (従来の略語に「E」が追加されていることに注意してください)。

  • ECDHE: 楕円曲線ディフィー・ヘルマン鍵合意プロトコルのエフェメラル版。
  • DHE: ディフィー・ヘルマン鍵合意プロトコルのエフェメラル版。

ECDHE を使用した完全前方秘匿性はデフォルトで有効になっています。TLS サーバーを作成する際に ecdhCurve オプションを使用して、サポートされる ECDH 曲線のリストをカスタマイズできます。詳細は tls.createServer() を参照してください。

DHE はデフォルトで無効になっていますが、dhparam オプションを 'auto' に設定することで ECDHE と共に有効にできます。カスタム DHE パラメータもサポートされていますが、自動的に選択される、よく知られたパラメータを優先することが推奨されます。

完全前方秘匿性は TLSv1.2 まではオプションでした。TLSv1.3 以降では、(PSK のみの接続を除き) 常に (EC)DHE が使用されます。

ALPN と SNI#

ALPN (Application-Layer Protocol Negotiation Extension) と SNI (Server Name Indication) は TLS ハンドシェイク拡張です。

  • ALPN: 1つの TLS サーバーで複数のプロトコル (HTTP, HTTP/2) を使用できるようにします。
  • SNI: 1つの TLS サーバーで異なる証明書を持つ複数のホスト名を使用できるようにします。

事前共有鍵 (Pre-shared keys)#

TLS-PSK サポートは、通常の証明書ベースの認証の代替として利用できます。これは、証明書の代わりに事前共有鍵を使用して TLS 接続を認証し、相互認証を提供します。TLS-PSK と公開鍵基盤は相互に排他的ではありません。クライアントとサーバーは両方に対応でき、通常の暗号ネゴシエーションステップ中にどちらかを選択できます。

TLS-PSK は、接続するすべてのマシンと安全に鍵を共有する手段が存在する場合にのみ良い選択肢であり、したがって、ほとんどの TLS 用途で公開鍵基盤 (PKI) を置き換えるものではありません。OpenSSL の TLS-PSK 実装は、近年多くのセキュリティ上の欠陥が見つかっています。これは主に、少数のアプリケーションでしか使用されていないためです。PSK 暗号に切り替える前に、すべての代替ソリューションを検討してください。PSK を生成する際には、RFC 4086 で議論されているように、十分なエントロピーを使用することが非常に重要です。パスワードやその他の低エントロピーのソースから共有秘密を導出することは安全ではありません。

PSK 暗号はデフォルトで無効になっているため、TLS-PSK を使用するには ciphers オプションで暗号スイートを明示的に指定する必要があります。利用可能な暗号のリストは openssl ciphers -v 'PSK' で取得できます。すべての TLS 1.3 暗号は PSK に適格であり、openssl ciphers -v -s -tls1_3 -psk で取得できます。クライアント接続では、証明書がない場合にデフォルトの checkServerIdentity が失敗するため、カスタムの checkServerIdentity を渡す必要があります。

RFC 4279 によると、最大128バイトの長さの PSK アイデンティティと最大64バイトの長さの PSK がサポートされなければなりません。OpenSSL 1.1.0 の時点では、最大アイデンティティサイズは128バイト、最大 PSK 長は256バイトです。

現在の実装は、基盤となる OpenSSL API の制限により、非同期 PSK コールバックをサポートしていません。

TLS-PSK を使用するには、クライアントとサーバーは pskCallback オプションを指定する必要があります。これは、使用する PSK (選択された暗号のダイジェストと互換性がある必要があります) を返す関数です。

これは最初にクライアントで呼び出されます。

  • hint <string> クライアントがネゴシエーション中にどのアイデンティティを使用するかを決定するのを助けるためにサーバーから送信されるオプションのメッセージ。TLS 1.3 が使用される場合は常に null です。
  • 戻り値: { psk: <Buffer|TypedArray|DataView>, identity: <string> } の形式の <Object>、または null

次にサーバーで呼び出されます。

  • socket <tls.TLSSocket> サーバーソケットインスタンス。this と同等です。
  • identity <string> クライアントから送信されたアイデンティティパラメータ。
  • 戻り値: <Buffer> | <TypedArray> | <DataView> PSK (または null)。

null の戻り値は、ネゴシエーションプロセスを停止し、unknown_psk_identity アラートメッセージを相手側に送信します。サーバーが PSK アイデンティティが不明であったという事実を隠したい場合、コールバックは psk として何らかのランダムなデータを提供し、ネゴシエーションが終了する前に接続が decrypt_error で失敗するようにしなければなりません。

クライアント主導の再ネゴシエーション攻撃の緩和#

TLS プロトコルは、クライアントが TLS セッションの特定の側面を再ネゴシエーションすることを許可しています。残念ながら、セッションの再ネゴシエーションはサーバー側のリソースを不釣り合いに多く必要とするため、サービス拒否 (denial-of-service) 攻撃の潜在的なベクトルとなります。

リスクを軽減するため、再ネゴシエーションは10分間に3回に制限されています。このしきい値を超えると、tls.TLSSocket インスタンスで 'error' イベントが発行されます。この制限は設定可能です。

  • tls.CLIENT_RENEG_LIMIT <number> 再ネゴシエーション要求の回数を指定します。デフォルト: 3
  • tls.CLIENT_RENEG_WINDOW <number> 再ネゴシエーションの時間枠を秒単位で指定します。デフォルト: 600 (10分)。

デフォルトの再ネゴシエーション制限は、その影響とリスクを完全に理解せずに変更すべきではありません。

TLSv1.3 は再ネゴシエーションをサポートしていません。

セッション再開#

TLS セッションの確立は比較的に時間がかかることがあります。このプロセスは、セッション状態を保存し、後で再利用することで高速化できます。これを行うためのいくつかのメカニズムがあり、ここでは古いものから新しいもの (そして推奨されるもの) の順に説明します。

セッション識別子#

サーバーは新しい接続のために一意のIDを生成し、それをクライアントに送信します。クライアントとサーバーはセッション状態を保存します。再接続する際、クライアントは保存したセッション状態のIDを送信し、サーバーもそのIDのセッション状態を持っていれば、それを使用することに同意できます。そうでなければ、サーバーは新しいセッションを作成します。詳細については、RFC 2246 の23ページと30ページを参照してください。

セッション識別子を使用した再開は、HTTPS リクエストを行う際にほとんどのウェブブラウザでサポートされています。

Node.js の場合、クライアントはセッションデータを取得するために 'session' イベントを待ち、そのデータを後続の tls.connect()session オプションに提供してセッションを再利用します。サーバーは、セッションIDをルックアップキーとして使用してセッションを再利用するために、'newSession' および 'resumeSession' イベントのハンドラを実装してセッションデータを保存および復元する必要があります。ロードバランサやクラスターワーカー間でセッションを再利用するには、サーバーはセッションハンドラで共有セッションキャッシュ (Redisなど) を使用する必要があります。

セッションチケット#

サーバーはセッション状態全体を暗号化し、「チケット」としてクライアントに送信します。再接続する際、その状態は初期接続時にサーバーに送信されます。このメカニズムは、サーバー側のセッションキャッシュの必要性を回避します。サーバーが何らかの理由でチケットを使用しない場合 (復号化の失敗、古すぎるなど)、新しいセッションを作成し、新しいチケットを送信します。詳細については RFC 5077 を参照してください。

セッションチケットを使用した再開は、HTTPS リクエストを行う際に多くのウェブブラウザで一般的にサポートされるようになってきています。

Node.js の場合、クライアントはセッション識別子による再開と同じ API をセッションチケットによる再開にも使用します。デバッグのために、tls.TLSSocket.getTLSTicket() が値を返す場合、セッションデータにはチケットが含まれており、それ以外の場合はクライアント側のセッション状態が含まれています。

TLSv1.3 では、サーバーから複数のチケットが送信される可能性があり、その結果複数の 'session' イベントが発生することに注意してください。詳細については 'session' を参照してください。

単一プロセスのサーバーは、セッションチケットを使用するために特別な実装は必要ありません。サーバーの再起動やロードバランサ間でセッションチケットを使用するには、すべてのサーバーが同じチケットキーを持つ必要があります。内部的には3つの16バイトのキーがありますが、tls API は便宜上、それらを単一の48バイトのバッファとして公開しています。

1つのサーバーインスタンスで server.getTicketKeys() を呼び出してチケットキーを取得し、それを配布することも可能ですが、48バイトの安全なランダムデータを安全に生成し、それを tls.createServer()ticketKeys オプションで設定する方が合理的です。キーは定期的に再生成されるべきであり、サーバーのキーは server.setTicketKeys() でリセットできます。

セッションチケットキーは暗号化キーであり、安全に保管されなければなりません。TLS 1.2 以前では、それらが漏洩した場合、それらで暗号化されたチケットを使用したすべてのセッションが復号化される可能性があります。それらはディスクに保存すべきではなく、定期的に再生成されるべきです。

クライアントがチケットのサポートを広告する場合、サーバーはチケットを送信します。サーバーは secureOptionsrequire('node:constants').SSL_OP_NO_TICKET を指定することでチケットを無効にできます。

セッション識別子とセッションチケットの両方がタイムアウトし、サーバーは新しいセッションを作成します。タイムアウトは tls.createServer()sessionTimeout オプションで設定できます。

すべてのメカニズムにおいて、再開が失敗すると、サーバーは新しいセッションを作成します。セッションの再開に失敗しても TLS/HTTPS 接続の失敗にはならないため、不必要に TLS パフォーマンスが低下していることに気づきにくいことがあります。OpenSSL CLI を使用して、サーバーがセッションを再開していることを確認できます。openssl s_client-reconnect オプションを使用します。例:

openssl s_client -connect localhost:443 -reconnect 

デバッグ出力を読み通してください。最初の接続は「New」と表示されるはずです。例:

New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256 

後続の接続は「Reused」と表示されるはずです。例:

Reused, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256 

デフォルトの TLS 暗号スイートの変更#

Node.js は、有効および無効な TLS 暗号のデフォルトスイートでビルドされています。このデフォルトの暗号リストは、Node.js のビルド時に設定でき、ディストリビューションが独自のデフォルトリストを提供できるようにします。

デフォルトの暗号スイートを表示するには、次のコマンドを使用できます。

node -p crypto.constants.defaultCoreCipherList | tr ':' '\n'
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
DHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
DHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES256-SHA384
ECDHE-RSA-AES256-SHA256
DHE-RSA-AES256-SHA256
HIGH
!aNULL
!eNULL
!EXPORT
!DES
!RC4
!MD5
!PSK
!SRP
!CAMELLIA 

このデフォルトは、--tls-cipher-list コマンドラインスイッチ (直接、または NODE_OPTIONS 環境変数を介して) を使用して完全に置き換えることができます。たとえば、以下は ECDHE-RSA-AES128-GCM-SHA256:!RC4 をデフォルトの TLS 暗号スイートにします。

node --tls-cipher-list='ECDHE-RSA-AES128-GCM-SHA256:!RC4' server.js

export NODE_OPTIONS=--tls-cipher-list='ECDHE-RSA-AES128-GCM-SHA256:!RC4'
node server.js 

確認するには、次のコマンドを使用して設定された暗号リストを表示します。defaultCoreCipherListdefaultCipherList の違いに注意してください。

node --tls-cipher-list='ECDHE-RSA-AES128-GCM-SHA256:!RC4' -p crypto.constants.defaultCipherList | tr ':' '\n'
ECDHE-RSA-AES128-GCM-SHA256
!RC4 

つまり、defaultCoreCipherList リストはコンパイル時に設定され、defaultCipherList は実行時に設定されます。

実行時からデフォルトの暗号スイートを変更するには、tls.DEFAULT_CIPHERS 変数を変更します。これはソケットをリッスンする前に行う必要があり、既に開かれているソケットには影響しません。例:

// Remove Obsolete CBC Ciphers and RSA Key Exchange based Ciphers as they don't provide Forward Secrecy
tls.DEFAULT_CIPHERS +=
  ':!ECDHE-RSA-AES128-SHA:!ECDHE-RSA-AES128-SHA256:!ECDHE-RSA-AES256-SHA:!ECDHE-RSA-AES256-SHA384' +
  ':!ECDHE-ECDSA-AES128-SHA:!ECDHE-ECDSA-AES128-SHA256:!ECDHE-ECDSA-AES256-SHA:!ECDHE-ECDSA-AES256-SHA384' +
  ':!kRSA'; 

デフォルトは、tls.createSecureContext()ciphers オプションを使用してクライアントまたはサーバーごとに置き換えることもできます。これは tls.createServer()tls.connect()、および新しい tls.TLSSocket の作成時にも利用できます。

暗号リストには、'TLS_' で始まる TLSv1.3 暗号スイート名と、TLSv1.2 以下の暗号スイートの仕様が混在している場合があります。TLSv1.2 暗号は従来の仕様形式をサポートしています。詳細は OpenSSL の 暗号リスト形式のドキュメントを参照してください。しかし、これらの仕様は TLSv1.3 暗号には適用されません。TLSv1.3 スイートは、暗号リストに完全な名前を含めることによってのみ有効にできます。たとえば、従来の TLSv1.2 の 'EECDH''!EECDH' 仕様を使用して有効または無効にすることはできません。

TLSv1.3 と TLSv1.2 の暗号スイートの相対的な順序に関わらず、TLSv1.3 プロトコルは TLSv1.2 よりも大幅に安全であり、ハンドシェイクがサポートされていることを示し、かつ TLSv1.3 暗号スイートが有効になっている場合は、常に TLSv1.2 よりも優先して選択されます。

Node.js に含まれるデフォルトの暗号スイートは、現在のセキュリティのベストプラクティスとリスク軽減を反映するように慎重に選択されています。デフォルトの暗号スイートを変更すると、アプリケーションのセキュリティに重大な影響を与える可能性があります。--tls-cipher-list スイッチと ciphers オプションは、絶対に必要な場合にのみ使用してください。

デフォルトの暗号スイートは、Chrome の「モダン暗号化」設定のために GCM 暗号を優先し、また完全前方秘匿性のために ECDHE および DHE 暗号を優先しつつ、ある程度の後方互換性を提供します。

安全でなく非推奨の RC4 や DES ベースの暗号 (Internet Explorer 6 など) に依存する古いクライアントは、デフォルト設定ではハンドシェイクプロセスを完了できません。これらのクライアントをサポートする必要がある場合は、TLS 推奨事項が互換性のある暗号スイートを提供するかもしれません。形式の詳細については、OpenSSL の 暗号リスト形式のドキュメントを参照してください。

TLSv1.3 暗号スイートは5つしかありません。

  • 'TLS_AES_256_GCM_SHA384'
  • 'TLS_CHACHA20_POLY1305_SHA256'
  • 'TLS_AES_128_GCM_SHA256'
  • 'TLS_AES_128_CCM_SHA256'
  • 'TLS_AES_128_CCM_8_SHA256'

最初の3つはデフォルトで有効になっています。2つの CCM ベースのスイートは、制約のあるシステムでよりパフォーマンスが高い可能性があるため TLSv1.3 でサポートされていますが、セキュリティが劣るためデフォルトでは有効になっていません。

OpenSSL セキュリティレベル#

OpenSSL ライブラリは、暗号化操作の最低限許容されるセキュリティレベルを制御するためにセキュリティレベルを強制します。OpenSSL のセキュリティレベルは0から5の範囲で、各レベルはより厳格なセキュリティ要件を課します。デフォルトのセキュリティレベルは2で、これはほとんどの現代のアプリケーションに適しています。しかし、TLSv1 のような一部のレガシー機能やプロトコルは、正しく機能するために低いセキュリティレベル (SECLEVEL=0) を必要とします。詳細については、OpenSSL のセキュリティレベルに関するドキュメントを参照してください。

セキュリティレベルの設定#

Node.js アプリケーションでセキュリティレベルを調整するには、暗号文字列内に @SECLEVEL=X を含めることができます。ここで X は目的のセキュリティレベルです。たとえば、デフォルトの OpenSSL 暗号リストを使用しながらセキュリティレベルを0に設定するには、次のようにします。

import { createServer, connect } from 'node:tls';
const port = 443;

createServer({ ciphers: 'DEFAULT@SECLEVEL=0', minVersion: 'TLSv1' }, function(socket) {
  console.log('Client connected with protocol:', socket.getProtocol());
  socket.end();
  this.close();
})
.listen(port, () => {
  connect(port, { ciphers: 'DEFAULT@SECLEVEL=0', maxVersion: 'TLSv1' });
});const { createServer, connect } = require('node:tls');
const port = 443;

createServer({ ciphers: 'DEFAULT@SECLEVEL=0', minVersion: 'TLSv1' }, function(socket) {
  console.log('Client connected with protocol:', socket.getProtocol());
  socket.end();
  this.close();
})
.listen(port, () => {
  connect(port, { ciphers: 'DEFAULT@SECLEVEL=0', maxVersion: 'TLSv1' });
});

このアプローチはセキュリティレベルを0に設定し、レガシー機能の使用を許可しつつ、デフォルトの OpenSSL 暗号を利用できます。

--tls-cipher-list の使用#

デフォルトの TLS 暗号スイートの変更で説明されているように、--tls-cipher-list=DEFAULT@SECLEVEL=X を使用してコマンドラインからセキュリティレベルと暗号を設定することもできます。しかし、暗号を設定するためにコマンドラインオプションを使用することは一般的に推奨されません。このアプローチはより細かい制御を提供し、グローバルにセキュリティレベルをダウングレードするリスクを減らすため、アプリケーションコード内で個々のコンテキストに対して暗号を設定することが望ましいです。

X509 証明書のエラーコード#

複数の関数が、OpenSSL によって報告される証明書エラーにより失敗する可能性があります。そのような場合、関数はコールバックを介して <Error> を提供します。このエラーは code プロパティを持ち、以下のいずれかの値を取ることができます。

  • 'UNABLE_TO_GET_ISSUER_CERT': 発行者証明書を取得できません。
  • 'UNABLE_TO_GET_CRL': 証明書 CRL を取得できません。
  • 'UNABLE_TO_DECRYPT_CERT_SIGNATURE': 証明書の署名を復号できません。
  • 'UNABLE_TO_DECRYPT_CRL_SIGNATURE': CRL の署名を復号できません。
  • 'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY': 発行者の公開鍵をデコードできません。
  • 'CERT_SIGNATURE_FAILURE': 証明書の署名が不正です。
  • 'CRL_SIGNATURE_FAILURE': CRL の署名が不正です。
  • 'CERT_NOT_YET_VALID': 証明書はまだ有効ではありません。
  • 'CERT_HAS_EXPIRED': 証明書の有効期限が切れています。
  • 'CRL_NOT_YET_VALID': CRL はまだ有効ではありません。
  • 'CRL_HAS_EXPIRED': CRL の有効期限が切れています。
  • 'ERROR_IN_CERT_NOT_BEFORE_FIELD': 証明書の notBefore フィールドのフォーマットエラーです。
  • 'ERROR_IN_CERT_NOT_AFTER_FIELD': 証明書の notAfter フィールドのフォーマットエラーです。
  • 'ERROR_IN_CRL_LAST_UPDATE_FIELD': CRL の lastUpdate フィールドのフォーマットエラーです。
  • 'ERROR_IN_CRL_NEXT_UPDATE_FIELD': CRL の nextUpdate フィールドのフォーマットエラーです。
  • 'OUT_OF_MEM': メモリ不足です。
  • 'DEPTH_ZERO_SELF_SIGNED_CERT': 自己署名証明書です。
  • 'SELF_SIGNED_CERT_IN_CHAIN': 証明書チェーン内に自己署名証明書があります。
  • 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY': ローカルの発行者証明書を取得できません。
  • 'UNABLE_TO_VERIFY_LEAF_SIGNATURE': 最初の証明書を検証できません。
  • 'CERT_CHAIN_TOO_LONG': 証明書チェーンが長すぎます。
  • 'CERT_REVOKED': 証明書が失効しています。
  • 'INVALID_CA': 不正な CA 証明書です。
  • 'PATH_LENGTH_EXCEEDED': パス長の制約を超えました。
  • 'INVALID_PURPOSE': サポートされていない証明書の目的です。
  • 'CERT_UNTRUSTED': 信用できない証明書です。
  • 'CERT_REJECTED': 証明書が拒否されました。
  • 'HOSTNAME_MISMATCH': ホスト名が一致しません。

UNABLE_TO_VERIFY_LEAF_SIGNATUREDEPTH_ZERO_SELF_SIGNED_CERT、または UNABLE_TO_GET_ISSUER_CERT のような証明書エラーが発生した場合、Node.js は、ルートCAがローカルにインストールされている場合は --use-system-ca フラグで実行することを試みるように示唆するヒントを追加し、安全でない回避策を防ぎ、開発者を安全な解決策に導きます。

クラス: tls.Server#

TLS または SSL を使用して暗号化された接続を受け入れます。

イベント: 'connection'#

このイベントは、新しい TCP ストリームが確立された後、TLS ハンドシェイクが始まる前に発行されます。socket は通常 net.Socket 型のオブジェクトですが、net.Server'connection' イベントから作成されたソケットとは異なり、イベントを受け取りません。通常、ユーザーはこのイベントにアクセスする必要はありません。

このイベントは、ユーザーが TLS サーバーに接続を注入するために明示的に発行することもできます。その場合、任意の Duplex ストリームを渡すことができます。

イベント: 'keylog'#

  • line <Buffer> NSS SSLKEYLOGFILE 形式の ASCII テキストの行。
  • tlsSocket <tls.TLSSocket> それを生成した tls.TLSSocket インスタンス。

keylog イベントは、このサーバーへの接続によって鍵情報が生成または受信されたとき (通常はハンドシェイクが完了する前ですが、必ずしもそうではありません) に発行されます。この鍵情報はデバッグのために保存でき、キャプチャされた TLS トラフィックを復号化できます。各ソケットに対して複数回発行されることがあります。

典型的な使用例は、受信した行を共通のテキストファイルに追加し、後でソフトウェア (Wireshark など) がトラフィックを復号化するために使用することです。

const logFile = fs.createWriteStream('/tmp/ssl-keys.log', { flags: 'a' });
// ...
server.on('keylog', (line, tlsSocket) => {
  if (tlsSocket.remoteAddress !== '...')
    return; // Only log keys for a particular IP
  logFile.write(line);
}); 

イベント: 'newSession'#

'newSession' イベントは、新しい TLS セッションの作成時に発行されます。これはセッションを外部ストレージに保存するために使用できます。データは 'resumeSession' コールバックに提供されるべきです。

リスナーコールバックは、呼び出されるときに3つの引数を渡されます。

  • sessionId <Buffer> TLS セッション識別子
  • sessionData <Buffer> TLS セッションデータ
  • callback <Function> セキュアな接続を介してデータを送受信するために呼び出されなければならない、引数を取らないコールバック関数。

このイベントをリッスンすることは、イベントリスナーの追加後に確立された接続にのみ効果があります。

イベント: 'OCSPRequest'#

'OCSPRequest' イベントは、クライアントが証明書ステータス要求を送信したときに発行されます。リスナーコールバックは、呼び出されるときに3つの引数を渡されます。

  • certificate <Buffer> サーバー証明書
  • issuer <Buffer> 発行者の証明書
  • callback <Function> OCSP リクエストの結果を提供するために呼び出されなければならないコールバック関数。

サーバーの現在の証明書を解析して OCSP URL と証明書 ID を取得できます。OCSP レスポンスを取得した後、callback(null, resp) が呼び出されます。ここで resp は OCSP レスポンスを含む Buffer インスタンスです。certificateissuer は、プライマリ証明書と発行者証明書の Buffer DER 表現です。これらは OCSP 証明書 ID と OCSP エンドポイント URL を取得するために使用できます。

あるいは、OCSP レスポンスがなかったことを示すために callback(null, null) を呼び出すこともできます。

callback(err) を呼び出すと、socket.destroy(err) が呼び出されます。

OCSP リクエストの典型的な流れは以下の通りです。

  1. クライアントがサーバーに接続し、'OCSPRequest' を送信します (ClientHello のステータス情報拡張経由)。
  2. サーバーはリクエストを受信し、'OCSPRequest' イベントを発行し、リスナーが登録されていればそれを呼び出します。
  3. サーバーは certificate または issuer から OCSP URL を抽出し、CA に OCSP リクエストを実行します。
  4. サーバーは CA から 'OCSPResponse' を受信し、callback 引数経由でクライアントに返送します。
  5. クライアントはレスポンスを検証し、ソケットを破棄するか、ハンドシェイクを実行します。

証明書が自己署名であるか、発行者がルート証明書リストにない場合、issuernull になることがあります。(TLS 接続を確立する際に ca オプションを介して発行者を提供できます。)

このイベントをリッスンすることは、イベントリスナーの追加後に確立された接続にのみ効果があります。

asn1.js のような npm モジュールを使用して証明書を解析できます。

イベント: 'resumeSession'#

'resumeSession' イベントは、クライアントが以前の TLS セッションの再開を要求したときに発行されます。リスナーコールバックは、呼び出されるときに2つの引数を渡されます。

  • sessionId <Buffer> TLS セッション識別子
  • callback <Function> 以前のセッションが回復されたときに呼び出されるコールバック関数: callback([err[, sessionData]])

イベントリスナーは、与えられた sessionId を使用して、'newSession' イベントハンドラによって保存された sessionData を外部ストレージで検索する必要があります。見つかった場合は、callback(null, sessionData) を呼び出してセッションを再開します。見つからなかった場合、セッションは再開できません。ハンドシェイクを続行し、新しいセッションを作成できるように、callback()sessionData なしで呼び出す必要があります。callback(err) を呼び出して、着信接続を終了し、ソケットを破棄することも可能です。

このイベントをリッスンすることは、イベントリスナーの追加後に確立された接続にのみ効果があります。

以下は TLS セッションの再開を示しています。

const tlsSessionStore = {};
server.on('newSession', (id, data, cb) => {
  tlsSessionStore[id.toString('hex')] = data;
  cb();
});
server.on('resumeSession', (id, cb) => {
  cb(null, tlsSessionStore[id.toString('hex')] || null);
}); 

イベント: 'secureConnection'#

'secureConnection' イベントは、新しい接続のハンドシェイクプロセスが正常に完了した後に発行されます。リスナーコールバックは、呼び出されるときに単一の引数を渡されます。

tlsSocket.authorized プロパティは、クライアントがサーバーに提供された認証局のいずれかによって検証されたかどうかを示す boolean です。tlsSocket.authorizedfalse の場合、socket.authorizationError は認証がどのように失敗したかを説明するために設定されます。TLS サーバーの設定によっては、未承認の接続が受け入れられる場合もあります。

tlsSocket.alpnProtocol プロパティは、選択された ALPN プロトコルを含む文字列です。クライアントまたはサーバーが ALPN 拡張を送信しなかったために ALPN が選択されたプロトコルを持たない場合、tlsSocket.alpnProtocolfalse になります。

tlsSocket.servername プロパティは、SNI を介して要求されたサーバー名を含む文字列です。

イベント: 'tlsClientError'#

'tlsClientError' イベントは、セキュアな接続が確立される前にエラーが発生したときに発行されます。リスナーコールバックは、呼び出されるときに2つの引数を渡されます。

  • exception <Error> エラーを説明する Error オブジェクト
  • tlsSocket <tls.TLSSocket> エラーの発生元である tls.TLSSocket インスタンス。

server.addContext(hostname, context)#

server.addContext() メソッドは、クライアントリクエストの SNI 名が指定された hostname (またはワイルドカード) に一致する場合に使用されるセキュアコンテキストを追加します。

一致するコンテキストが複数ある場合、最後に追加されたものが使用されます。

server.address()#

オペレーティングシステムによって報告された、サーバーのバインドされたアドレス、アドレスファミリー名、およびポートを返します。詳細については net.Server.address() を参照してください。

server.close([callback])#

  • callback <Function> サーバーインスタンスの 'close' イベントをリッスンするために登録されるリスナーコールバック。
  • 戻り値: <tls.Server>

server.close() メソッドは、サーバーが新しい接続を受け入れるのを停止します。

この関数は非同期で動作します。サーバーに開いている接続がなくなると 'close' イベントが発行されます。

server.getTicketKeys()#

  • 戻り値: <Buffer> セッションチケットキーを含む48バイトのバッファ。

セッションチケットキーを返します。

詳細については セッション再開 を参照してください。

server.listen()#

サーバーが暗号化された接続をリッスンするのを開始します。このメソッドは net.Serverserver.listen() と同じです。

server.setSecureContext(options)#

server.setSecureContext() メソッドは、既存のサーバーのセキュアコンテキストを置き換えます。サーバーへの既存の接続は中断されません。

server.setTicketKeys(keys)#

セッションチケットキーを設定します。

チケットキーの変更は、将来のサーバー接続にのみ有効です。既存または現在保留中のサーバー接続は、以前のキーを使用します。

詳細については セッション再開 を参照してください。

クラス: tls.TLSSocket#

書き込まれたデータの透過的な暗号化と、必要なすべての TLS ネゴシエーションを実行します。

tls.TLSSocket のインスタンスは、duplex Stream インターフェースを実装します。

TLS 接続メタデータを返すメソッド (例: tls.TLSSocket.getPeerCertificate()) は、接続が開いている間のみデータを返します。

new tls.TLSSocket(socket[, options])#

  • socket <net.Socket> | <stream.Duplex> サーバー側では、任意の Duplex ストリーム。クライアント側では、net.Socket の任意のインスタンス (クライアント側での汎用 Duplex ストリームサポートのためには、tls.connect() を使用する必要があります)。
  • options <Object>
    • enableTrace: tls.createServer() を参照してください。
    • isServer: SSL/TLS プロトコルは非対称であり、TLSSocket はサーバーとして振る舞うかクライアントとして振る舞うかを知る必要があります。true の場合、TLS ソケットはサーバーとしてインスタンス化されます。デフォルト: false
    • server <net.Server> net.Server インスタンス。
    • requestCert: 証明書を要求してリモートピアを認証するかどうか。クライアントは常にサーバー証明書を要求します。サーバー (isServer が true) は requestCert を true に設定してクライアント証明書を要求できます。
    • rejectUnauthorized: tls.createServer() を参照してください。
    • ALPNProtocols: tls.createServer() を参照してください。
    • SNICallback: tls.createServer() を参照してください。
    • session <Buffer> TLS セッションを含む Buffer インスタンス。
    • requestOCSP <boolean> true の場合、OCSP ステータス要求拡張がクライアントハローに追加され、セキュアな通信を確立する前にソケットで 'OCSPResponse' イベントが発行されることを指定します。
    • secureContext: tls.createSecureContext() で作成された TLS コンテキストオブジェクト。secureContext が提供されない場合、options オブジェクト全体を tls.createSecureContext() に渡すことで作成されます。
    • ...: secureContext オプションがない場合に使用される tls.createSecureContext() オプション。それ以外の場合は無視されます。

既存の TCP ソケットから新しい tls.TLSSocket オブジェクトを構築します。

イベント: 'keylog'#

  • line <Buffer> NSS SSLKEYLOGFILE 形式の ASCII テキストの行。

keylog イベントは、ソケットによって鍵情報が生成または受信されたときに tls.TLSSocket で発行されます。この鍵情報はデバッグのために保存でき、キャプチャされた TLS トラフィックを復号化できます。ハンドシェイクが完了する前後に複数回発行されることがあります。

典型的な使用例は、受信した行を共通のテキストファイルに追加し、後でソフトウェア (Wireshark など) がトラフィックを復号化するために使用することです。

const logFile = fs.createWriteStream('/tmp/ssl-keys.log', { flags: 'a' });
// ...
tlsSocket.on('keylog', (line) => logFile.write(line)); 

イベント: 'OCSPResponse'#

'OCSPResponse' イベントは、tls.TLSSocket の作成時に requestOCSP オプションが設定され、OCSP レスポンスが受信された場合に発行されます。リスナーコールバックは、呼び出されるときに単一の引数を渡されます。

  • response <Buffer> サーバーの OCSP レスポンス

通常、response はサーバーの CA からのデジタル署名されたオブジェクトで、サーバーの証明書失効ステータスに関する情報を含んでいます。

イベント: 'secureConnect'#

'secureConnect' イベントは、新しい接続のハンドシェイクプロセスが正常に完了した後に発行されます。リスナーコールバックは、サーバーの証明書が承認されたかどうかに関わらず呼び出されます。サーバー証明書が指定された CA のいずれかによって署名されているかどうかを判断するために tlsSocket.authorized プロパティを確認するのはクライアントの責任です。tlsSocket.authorized === false の場合、エラーは tlsSocket.authorizationError プロパティを調べることで見つけることができます。ALPN が使用された場合、tlsSocket.alpnProtocol プロパティをチェックしてネゴシエートされたプロトコルを判断できます。

'secureConnect' イベントは、new tls.TLSSocket() コンストラクタを使用して <tls.TLSSocket> が作成された場合には発行されません。

イベント: 'session'#

'session' イベントは、新しいセッションまたは TLS チケットが利用可能になったときにクライアントの tls.TLSSocket で発行されます。これは、ネゴシエートされた TLS プロトコルのバージョンに応じて、ハンドシェイクが完了する前である場合とそうでない場合があります。このイベントはサーバーでは発行されず、接続が再開された場合など、新しいセッションが作成されなかった場合にも発行されません。一部の TLS プロトコルバージョンでは、イベントが複数回発行されることがあり、その場合、すべてのセッションを再開に使用できます。

クライアントでは、sessiontls.connect()session オプションに提供して接続を再開できます。

詳細については セッション再開 を参照してください。

TLSv1.2 以前では、ハンドシェイクが完了すると tls.TLSSocket.getSession() を呼び出すことができます。TLSv1.3 では、プロトコルによってチケットベースの再開のみが許可され、複数のチケットが送信され、チケットはハンドシェイクが完了するまで送信されません。したがって、再開可能なセッションを取得するには 'session' イベントを待つ必要があります。アプリケーションは、すべての TLS バージョンで動作することを保証するために、getSession() の代わりに 'session' イベントを使用する必要があります。1つのセッションのみを取得または使用することを期待するアプリケーションは、このイベントを一度だけリッスンする必要があります。

tlsSocket.once('session', (session) => {
  // The session can be used immediately or later.
  tls.connect({
    session: session,
    // Other connect options...
  });
}); 

tlsSocket.address()#

オペレーティングシステムによって報告された、基盤となるソケットのバインドされた address、アドレス family 名、および port を返します: { port: 12346, family: 'IPv4', address: '127.0.0.1' }

tlsSocket.authorizationError#

ピアの証明書が検証されなかった理由を返します。このプロパティは tlsSocket.authorized === false の場合にのみ設定されます。

tlsSocket.authorized#

このプロパティは、ピア証明書が tls.TLSSocket インスタンスの作成時に指定された CA のいずれかによって署名されている場合は true、そうでない場合は false です。

tlsSocket.disableRenegotiation()#

この TLSSocket インスタンスの TLS 再ネゴシエーションを無効にします。一度呼び出されると、再ネゴシエーションの試みは TLSSocket'error' イベントをトリガーします。

tlsSocket.enableTrace()#

有効にすると、TLS パケットのトレース情報が stderr に書き込まれます。これは TLS 接続の問題をデバッグするために使用できます。

出力の形式は openssl s_client -trace または openssl s_server -trace の出力と同じです。これは OpenSSL の SSL_trace() 関数によって生成されますが、形式は文書化されておらず、予告なく変更される可能性があり、信頼すべきではありません。

tlsSocket.encrypted#

常に true を返します。これは TLS ソケットを通常の net.Socket インスタンスと区別するために使用できます。

tlsSocket.exportKeyingMaterial(length, label[, context])#

  • length <number> 鍵情報から取得するバイト数

  • label <string> アプリケーション固有のラベル。通常は IANA Exporter Label Registry の値になります。

  • context <Buffer> オプションでコンテキストを提供します。

  • 戻り値: <Buffer> 要求された鍵情報のバイト

鍵情報は、IEEE 802.1X の仕様など、ネットワークプロトコルにおけるさまざまな種類の攻撃を防ぐための検証に使用されます。

const keyingMaterial = tlsSocket.exportKeyingMaterial(
  128,
  'client finished');

/*
 Example return value of keyingMaterial:
 <Buffer 76 26 af 99 c5 56 8e 42 09 91 ef 9f 93 cb ad 6c 7b 65 f8 53 f1 d8 d9
    12 5a 33 b8 b5 25 df 7b 37 9f e0 e2 4f b8 67 83 a3 2f cd 5d 41 42 4c 91
    74 ef 2c ... 78 more bytes>
*/ 

詳細については、OpenSSL の SSL_export_keying_material ドキュメントを参照してください。

tlsSocket.getCertificate()#

ローカル証明書を表すオブジェクトを返します。返されるオブジェクトには、証明書のフィールドに対応するいくつかのプロパティがあります。

証明書の構造の例については、tls.TLSSocket.getPeerCertificate() を参照してください。

ローカル証明書がない場合は、空のオブジェクトが返されます。ソケットが破棄されている場合は、null が返されます。

tlsSocket.getCipher()#

  • 戻り値: <Object>
    • name <string> 暗号スイートの OpenSSL 名。
    • standardName <string> 暗号スイートの IETF 名。
    • version <string> この暗号スイートでサポートされる最小の TLS プロトコルバージョン。実際にネゴシエートされたプロトコルについては、tls.TLSSocket.getProtocol() を参照してください。

ネゴシエートされた暗号スイートに関する情報を含むオブジェクトを返します。

たとえば、AES256-SHA 暗号を使用する TLSv1.2 プロトコル:

{
    "name": "AES256-SHA",
    "standardName": "TLS_RSA_WITH_AES_256_CBC_SHA",
    "version": "SSLv3"
} 

詳細については SSL_CIPHER_get_name を参照してください。

tlsSocket.getEphemeralKeyInfo()#

クライアント接続における 完全前方秘匿性でのエフェメラル鍵交換のパラメータの種類、名前、サイズを表すオブジェクトを返します。鍵交換がエフェメラルでない場合は空のオブジェクトを返します。これはクライアントソケットでのみサポートされているため、サーバーソケットで呼び出された場合は null が返されます。サポートされている種類は 'DH''ECDH' です。name プロパティは、種類が 'ECDH' の場合にのみ利用可能です。

例: { type: 'ECDH', name: 'prime256v1', size: 256 }

tlsSocket.getFinished()#

  • 戻り値: <Buffer> | <undefined> SSL/TLS ハンドシェイクの一部としてソケットに送信された最新の Finished メッセージ、またはまだ Finished メッセージが送信されていない場合は undefined

Finished メッセージは、完全なハンドシェイクのメッセージダイジェスト (TLS 1.0 では合計192ビット、SSL 3.0 ではそれ以上) であるため、SSL/TLS が提供する認証が望ましくない場合や不十分な場合に、外部の認証手順に使用できます。

OpenSSL の SSL_get_finished ルーチンに対応し、RFC 5929tls-unique チャネルバインディングを実装するために使用できます。

tlsSocket.getPeerCertificate([detailed])#

  • detailed <boolean> true の場合は完全な証明書チェーンを含み、それ以外の場合はピアの証明書のみを含みます。
  • 戻り値: <Object> 証明書オブジェクト。

ピアの証明書を表すオブジェクトを返します。ピアが証明書を提供しない場合は、空のオブジェクトが返されます。ソケットが破棄されている場合は、null が返されます。

完全な証明書チェーンが要求された場合、各証明書にはその発行者の証明書を表すオブジェクトを含む issuerCertificate プロパティが含まれます。

証明書オブジェクト#

証明書オブジェクトには、証明書のフィールドに対応するプロパティがあります。

  • ca <boolean> 認証局 (CA) の場合は true、それ以外は false
  • raw <Buffer> DER エンコードされた X.509 証明書データ。
  • subject <Object> 国 (C)、都道府県 (ST)、市区町村 (L)、組織 (O)、組織単位 (OU)、およびコモンネーム (CN) で記述される証明書のサブジェクト。コモンネームは通常、TLS 証明書では DNS 名です。例: {C: 'UK', ST: 'BC', L: 'Metro', O: 'Node Fans', OU: 'Docs', CN: 'example.com'}
  • issuer <Object> subject と同じ用語で記述される証明書の発行者。
  • valid_from <string> 証明書が有効になる日時。
  • valid_to <string> 証明書が有効でなくなる日時。
  • serialNumber <string> 証明書のシリアル番号 (16進数文字列)。例: 'B9B0D332A1AA5635'
  • fingerprint <string> DER エンコードされた証明書の SHA-1 ダイジェスト。: で区切られた16進数文字列として返されます。例: '2A:7A:C2:DD:...'
  • fingerprint256 <string> DER エンコードされた証明書の SHA-256 ダイジェスト。: で区切られた16進数文字列として返されます。例: '2A:7A:C2:DD:...'
  • fingerprint512 <string> DER エンコードされた証明書の SHA-512 ダイジェスト。: で区切られた16進数文字列として返されます。例: '2A:7A:C2:DD:...'
  • ext_key_usage <Array> (オプション) 拡張キー用途、OID のセット。
  • subjectaltname <string> (オプション) サブジェクトの連結された名前を含む文字列。subject 名の代替。
  • infoAccess <Array> (オプション) AuthorityInfoAccess を記述する配列。OCSP で使用されます。
  • issuerCertificate <Object> (オプション) 発行者証明書オブジェクト。自己署名証明書の場合、これは循環参照になることがあります。

証明書には、キーの種類に応じて公開鍵に関する情報が含まれている場合があります。

RSA 鍵の場合、以下のプロパティが定義されることがあります。

  • bits <number> RSA ビットサイズ。例: 1024
  • exponent <string> RSA 指数 (16進数表記の文字列)。例: '0x010001'
  • modulus <string> RSA モジュラス (16進数文字列)。例: 'B56CE45CB7...'
  • pubkey <Buffer> 公開鍵。

EC 鍵の場合、以下のプロパティが定義されることがあります。

  • pubkey <Buffer> 公開鍵。
  • bits <number> ビット単位のキーサイズ。例: 256
  • asn1Curve <string> (オプション) 楕円曲線の OID の ASN.1 名。よく知られた曲線は OID で識別されます。珍しいことですが、曲線がその数学的特性によって識別され、OID を持たない場合もあります。例: 'prime256v1'
  • nistCurve <string> (オプション) 楕円曲線の NIST 名 (もしあれば。すべてのよく知られた曲線が NIST によって名前を割り当てられているわけではありません)。例: 'P-256'

証明書の例

{ subject:
   { OU: [ 'Domain Control Validated', 'PositiveSSL Wildcard' ],
     CN: '*.nodejs.org' },
  issuer:
   { C: 'GB',
     ST: 'Greater Manchester',
     L: 'Salford',
     O: 'COMODO CA Limited',
     CN: 'COMODO RSA Domain Validation Secure Server CA' },
  subjectaltname: 'DNS:*.nodejs.org, DNS:nodejs.org',
  infoAccess:
   { 'CA Issuers - URI':
      [ 'http://crt.comodoca.com/COMODORSADomainValidationSecureServerCA.crt' ],
     'OCSP - URI': [ 'http://ocsp.comodoca.com' ] },
  modulus: 'B56CE45CB740B09A13F64AC543B712FF9EE8E4C284B542A1708A27E82A8D151CA178153E12E6DDA15BF70FFD96CB8A88618641BDFCCA03527E665B70D779C8A349A6F88FD4EF6557180BD4C98192872BCFE3AF56E863C09DDD8BC1EC58DF9D94F914F0369102B2870BECFA1348A0838C9C49BD1C20124B442477572347047506B1FCD658A80D0C44BCC16BC5C5496CFE6E4A8428EF654CD3D8972BF6E5BFAD59C93006830B5EB1056BBB38B53D1464FA6E02BFDF2FF66CD949486F0775EC43034EC2602AEFBF1703AD221DAA2A88353C3B6A688EFE8387811F645CEED7B3FE46E1F8B9F59FAD028F349B9BC14211D5830994D055EEA3D547911E07A0ADDEB8A82B9188E58720D95CD478EEC9AF1F17BE8141BE80906F1A339445A7EB5B285F68039B0F294598A7D1C0005FC22B5271B0752F58CCDEF8C8FD856FB7AE21C80B8A2CE983AE94046E53EDE4CB89F42502D31B5360771C01C80155918637490550E3F555E2EE75CC8C636DDE3633CFEDD62E91BF0F7688273694EEEBA20C2FC9F14A2A435517BC1D7373922463409AB603295CEB0BB53787A334C9CA3CA8B30005C5A62FC0715083462E00719A8FA3ED0A9828C3871360A73F8B04A4FC1E71302844E9BB9940B77E745C9D91F226D71AFCAD4B113AAF68D92B24DDB4A2136B55A1CD1ADF39605B63CB639038ED0F4C987689866743A68769CC55847E4A06D6E2E3F1',
  exponent: '0x10001',
  pubkey: <Buffer ... >,
  valid_from: 'Aug 14 00:00:00 2017 GMT',
  valid_to: 'Nov 20 23:59:59 2019 GMT',
  fingerprint: '01:02:59:D9:C3:D2:0D:08:F7:82:4E:44:A4:B4:53:C5:E2:3A:87:4D',
  fingerprint256: '69:AE:1A:6A:D4:3D:C6:C1:1B:EA:C6:23:DE:BA:2A:14:62:62:93:5C:7A:EA:06:41:9B:0B:BC:87:CE:48:4E:02',
  fingerprint512: '19:2B:3E:C3:B3:5B:32:E8:AE:BB:78:97:27:E4:BA:6C:39:C9:92:79:4F:31:46:39:E2:70:E5:5F:89:42:17:C9:E8:64:CA:FF:BB:72:56:73:6E:28:8A:92:7E:A3:2A:15:8B:C2:E0:45:CA:C3:BC:EA:40:52:EC:CA:A2:68:CB:32',
  ext_key_usage: [ '1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2' ],
  serialNumber: '66593D57F20CBC573E433381B5FEC280',
  raw: <Buffer ... > } 

tlsSocket.getPeerFinished()#

  • 戻り値: <Buffer> | <undefined> SSL/TLS ハンドシェイクの一部としてソケットから期待される、または実際に受信された最新の Finished メッセージ、またはまだ Finished メッセージがない場合は undefined

Finished メッセージは、完全なハンドシェイクのメッセージダイジェスト (TLS 1.0 では合計192ビット、SSL 3.0 ではそれ以上) であるため、SSL/TLS が提供する認証が望ましくない場合や不十分な場合に、外部の認証手順に使用できます。

OpenSSL の SSL_get_peer_finished ルーチンに対応し、RFC 5929tls-unique チャネルバインディングを実装するために使用できます。

tlsSocket.getPeerX509Certificate()#

ピア証明書を <X509Certificate> オブジェクトとして返します。

ピア証明書がない場合、またはソケットが破棄されている場合は、undefined が返されます。

tlsSocket.getProtocol()#

現在の接続でネゴシエートされた SSL/TLS プロトコルバージョンを含む文字列を返します。ハンドシェイクプロセスを完了していない接続済みソケットの場合は、値 'unknown' が返されます。サーバーソケットまたは切断されたクライアントソケットの場合は、値 null が返されます。

プロトコルバージョンは次のとおりです。

  • 'SSLv3'
  • 'TLSv1'
  • 'TLSv1.1'
  • 'TLSv1.2'
  • 'TLSv1.3'

詳細については、OpenSSL の SSL_get_version ドキュメントを参照してください。

tlsSocket.getSession()#

TLS セッションデータを返します。セッションがネゴシエートされなかった場合は undefined を返します。クライアントでは、このデータを tls.connect()session オプションに提供して接続を再開できます。サーバーでは、デバッグに役立つことがあります。

詳細については セッション再開 を参照してください。

注意: getSession() は TLSv1.2 以前でのみ機能します。TLSv1.3 の場合、アプリケーションは 'session' イベントを使用する必要があります (これは TLSv1.2 以前でも機能します)。

tlsSocket.getSharedSigalgs()#

  • 戻り値: <Array> サーバーとクライアント間で共有される署名アルゴリズムのリスト (優先度の高い順)。

詳細については SSL_get_shared_sigalgs を参照してください。

tlsSocket.getTLSTicket()#

クライアントの場合、利用可能であれば TLS セッションチケットを返します。利用できない場合は undefined を返します。サーバーの場合、常に undefined を返します。

デバッグに役立つことがあります。

詳細については セッション再開 を参照してください。

tlsSocket.getX509Certificate()#

ローカル証明書を <X509Certificate> オブジェクトとして返します。

ローカル証明書がない場合、またはソケットが破棄されている場合は、undefined が返されます。

tlsSocket.isSessionReused()#

  • 戻り値: <boolean> セッションが再利用された場合は true、そうでない場合は false

詳細については セッション再開 を参照してください。

tlsSocket.localAddress#

ローカル IP アドレスの文字列表現を返します。

tlsSocket.localPort#

ローカルポートの数値表現を返します。

tlsSocket.remoteAddress#

リモート IP アドレスの文字列表現を返します。例: '74.125.127.100' または '2001:4860:a005::68'

tlsSocket.remoteFamily#

リモート IP ファミリーの文字列表現を返します。'IPv4' または 'IPv6'

tlsSocket.remotePort#

リモートポートの数値表現を返します。例: 443

tlsSocket.renegotiate(options, callback)#

  • options <Object>

    • rejectUnauthorized <boolean> false でない場合、サーバー証明書は提供されたCAのリストに対して検証されます。検証が失敗した場合、'error' イベントが発生します。err.code にはOpenSSLのエラーコードが含まれます。デフォルト: true
    • requestCert
  • callback <Function> renegotiate()true を返した場合、コールバックは一度だけ 'secure' イベントにアタッチされます。renegotiate()false を返した場合、tlsSocket が破棄されていない限り、callback は次のティックでエラーとともに呼び出されます。tlsSocket が破棄されている場合、callback はまったく呼び出されません。

  • 戻り値: <boolean> 再ネゴシエーションが開始された場合は true、それ以外の場合は false

tlsSocket.renegotiate() メソッドは、TLS再ネゴシエーションプロセスを開始します。完了すると、callback 関数には、(リクエストが失敗した場合の) Error または null のいずれかの単一の引数が渡されます。

このメソッドは、セキュアな接続が確立された後にピアの証明書を要求するために使用できます。

サーバーとして実行している場合、ソケットは handshakeTimeout のタイムアウト後にエラーで破棄されます。

TLSv1.3の場合、プロトコルでサポートされていないため、再ネゴシエーションは開始できません。

tlsSocket.setKeyCert(context)#

tlsSocket.setKeyCert() メソッドは、ソケットに使用する秘密鍵と証明書を設定します。これは主に、TLSサーバーの ALPNCallback からサーバー証明書を選択したい場合に便利です。

tlsSocket.setMaxSendFragment(size)#

  • size <number> 最大TLSフラグメントサイズ。最大値は 16384 です。デフォルト: 16384
  • 戻り値: <boolean>

tlsSocket.setMaxSendFragment() メソッドは、最大TLSフラグメントサイズを設定します。制限の設定に成功した場合は true を、それ以外の場合は false を返します。

フラグメントサイズが小さいと、クライアント側のバッファリングの遅延が減少します。大きいフラグメントは、フラグメント全体が受信され、その整合性が検証されるまでTLS層によってバッファリングされます。大きなフラグメントは複数のラウンドトリップにまたがる可能性があり、パケット損失や再順序付けのために処理が遅延することがあります。しかし、小さいフラグメントは余分なTLSフレーミングバイトとCPUオーバーヘッドを追加し、サーバー全体のスループットを低下させる可能性があります。

tls.checkServerIdentity(hostname, cert)#

証明書 certhostname に対して発行されたものであることを検証します。

失敗した場合、reasonhostcert を設定した <Error> オブジェクトを返します。成功した場合は <undefined> を返します。

この関数は tls.connect() に渡すことができる checkServerIdentity オプションと組み合わせて使用されることを意図しており、証明書オブジェクトに対して動作します。その他の目的には、代わりに x509.checkHost() の使用を検討してください。

この関数は、tls.connect() に渡される options.checkServerIdentity オプションとして代替関数を提供することで上書きできます。上書きする関数はもちろん tls.checkServerIdentity() を呼び出して、追加の検証でチェックを補強することができます。

この関数は、証明書が信頼されたCAによって発行されている(options.ca)など、他のすべてのチェックに合格した場合にのみ呼び出されます。

以前のバージョンのNode.jsでは、一致するuniformResourceIdentifierサブジェクト代替名が存在する場合、指定されたhostnameの証明書を誤って受け入れていました(CVE-2021-44531を参照)。uniformResourceIdentifierサブジェクト代替名を受け入れたいアプリケーションは、望ましい動作を実装するカスタムoptions.checkServerIdentity関数を使用できます。

tls.connect(options[, callback])#

  • options <Object>
    • enableTrace: tls.createServer() を参照してください。
    • host <string> クライアントが接続すべきホスト。デフォルト: 'localhost'
    • port <number> クライアントが接続すべきポート。
    • path <string> 指定されたパスへのUnixソケット接続を作成します。このオプションが指定された場合、hostport は無視されます。
    • socket <stream.Duplex> 新しいソケットを作成する代わりに、与えられたソケット上でセキュアな接続を確立します。通常、これは net.Socket のインスタンスですが、任意の Duplex ストリームが許可されます。このオプションが指定された場合、証明書の検証を除き、pathhostport は無視されます。通常、ソケットは tls.connect() に渡される時点ですでに接続されていますが、後で接続することも可能です。socket の接続/切断/破棄はユーザーの責任です。tls.connect() を呼び出しても net.connect() は呼び出されません。
    • allowHalfOpen <boolean> false に設定されている場合、読み取り側が終了するとソケットは書き込み側を自動的に終了します。socket オプションが設定されている場合、このオプションは効果がありません。net.SocketallowHalfOpen オプションの詳細を参照してください。デフォルト: false
    • rejectUnauthorized <boolean> false でない場合、サーバー証明書は提供されたCAのリストに対して検証されます。検証が失敗した場合、'error' イベントが発生します。err.code にはOpenSSLのエラーコードが含まれます。デフォルト: true
    • pskCallback <Function> TLS-PSKネゴシエーションについては、事前共有鍵を参照してください。
    • ALPNProtocols <string[]> | <Buffer[]> | <TypedArray[]> | <DataView[]> | <Buffer> | <TypedArray> | <DataView> サポートされているALPNプロトコルを含む文字列、BufferTypedArray、または DataView の配列、あるいは単一の BufferTypedArray、または DataViewBuffer[len][name][len][name]... の形式であるべきです(例:'\x08http/1.1\x08http/1.0')。ここで len バイトは次のプロトコル名の長さです。配列を渡す方が通常ははるかに簡単です(例:['http/1.1', 'http/1.0'])。リストの前のプロトコルは後のものよりも優先度が高くなります。
    • servername <string> SNI (Server Name Indication) TLS拡張機能のためのサーバー名。接続先のホストの名前であり、ホスト名でなければならず、IPアドレスであってはなりません。マルチホームサーバーがクライアントに提示する正しい証明書を選択するために使用できます。tls.createServer()SNICallback オプションを参照してください。
    • checkServerIdentity(servername, cert) <Function> サーバーのホスト名(または明示的に設定された場合は提供された servername)を証明書に対してチェックする際に、(組み込みの tls.checkServerIdentity() 関数の代わりに)使用されるコールバック関数。検証が失敗した場合、これは <Error> を返すべきです。servernamecert が検証された場合、メソッドは undefined を返すべきです。
    • session <Buffer> TLSセッションを含む Buffer インスタンス。
    • minDHSize <number> TLS接続を受け入れるためのDHパラメータの最小サイズ(ビット単位)。サーバーが minDHSize より小さいサイズのDHパラメータを提供した場合、TLS接続は破棄され、エラーがスローされます。デフォルト: 1024
    • highWaterMark <number> 読み取り可能ストリームの highWaterMark パラメータと一致します。デフォルト: 16 * 1024
    • secureContext: tls.createSecureContext() で作成された TLS コンテキストオブジェクト。secureContext が提供されない場合、options オブジェクト全体を tls.createSecureContext() に渡すことで作成されます。
    • onread <Object> socket オプションがない場合、受信データは単一の buffer に保存され、ソケットにデータが到着したときに提供された callback に渡されます。それ以外の場合、オプションは無視されます。net.Socketonread オプションの詳細を参照してください。
    • ...: tls.createSecureContext() のオプション。secureContext オプションがない場合に使用され、それ以外の場合は無視されます。
    • ...: まだリストされていない socket.connect() の任意のオプション。
  • callback <Function>
  • 戻り値: <tls.TLSSocket>

callback 関数が指定された場合、'secureConnect' イベントのリスナーとして追加されます。

tls.connect()tls.TLSSocket オブジェクトを返します。

https APIとは異なり、tls.connect() はデフォルトでSNI (Server Name Indication) 拡張を有効にしません。これにより、一部のサーバーが不正な証明書を返したり、接続を完全に拒否したりする可能性があります。SNIを有効にするには、host に加えて servername オプションを設定してください。

以下は、tls.createServer() のエコーサーバーの例のためのクライアントを示しています。

// Assumes an echo server that is listening on port 8000.
import { connect } from 'node:tls';
import { readFileSync } from 'node:fs';
import { stdin } from 'node:process';

const options = {
  // Necessary only if the server requires client certificate authentication.
  key: readFileSync('client-key.pem'),
  cert: readFileSync('client-cert.pem'),

  // Necessary only if the server uses a self-signed certificate.
  ca: [ readFileSync('server-cert.pem') ],

  // Necessary only if the server's cert isn't for "localhost".
  checkServerIdentity: () => { return null; },
};

const socket = connect(8000, options, () => {
  console.log('client connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  stdin.pipe(socket);
  stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
  console.log(data);
});
socket.on('end', () => {
  console.log('server ends connection');
});// Assumes an echo server that is listening on port 8000.
const { connect } = require('node:tls');
const { readFileSync } = require('node:fs');

const options = {
  // Necessary only if the server requires client certificate authentication.
  key: readFileSync('client-key.pem'),
  cert: readFileSync('client-cert.pem'),

  // Necessary only if the server uses a self-signed certificate.
  ca: [ readFileSync('server-cert.pem') ],

  // Necessary only if the server's cert isn't for "localhost".
  checkServerIdentity: () => { return null; },
};

const socket = connect(8000, options, () => {
  console.log('client connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  process.stdin.pipe(socket);
  process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
  console.log(data);
});
socket.on('end', () => {
  console.log('server ends connection');
});

この例の証明書と鍵を生成するには、以下を実行します。

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout client-key.pem -out client-cert.pem 

次に、この例の server-cert.pem 証明書を生成するには、次を実行します。

openssl pkcs12 -certpbe AES-256-CBC -export -out server-cert.pem \
  -inkey client-key.pem -in client-cert.pem 

tls.connect(path[, options][, callback])#

path がオプションではなく引数として提供できる点を除き、tls.connect() と同じです。

pathオプションが指定された場合、path引数よりも優先されます。

tls.connect(port[, host][, options][, callback])#

porthost がオプションではなく引数として提供できる点を除き、tls.connect() と同じです。

portまたはhostオプションが指定された場合、いかなるportまたはhost引数よりも優先されます。

tls.createSecureContext([options])#

  • options <Object>
    • allowPartialTrustChain <boolean> 信頼されたCA証明書リスト内の中間(自己署名でない)証明書を信頼されたものとして扱います。
    • ca <string> | <string[]> | <Buffer> | <Buffer[]> オプションで信頼されたCA証明書を上書きします。指定しない場合、デフォルトで信頼されるCA証明書は、default タイプを使用して tls.getCACertificates() によって返されるものと同じです。指定した場合、デフォルトリストは ca オプションの証明書によって完全に置き換えられます(連結されるのではなく)。デフォルトを完全に上書きするのではなく、追加の証明書を追加したい場合は、ユーザーが手動で連結する必要があります。値は文字列または Buffer、あるいは文字列および/または BufferArray にすることができます。どの文字列または Buffer も、複数のPEM形式のCAを連結して含めることができます。接続が認証されるためには、ピアの証明書がサーバーによって信頼されたCAに連鎖可能でなければなりません。よく知られたCAに連鎖可能でない証明書を使用する場合、証明書のCAは信頼されたものとして明示的に指定する必要があります。さもないと接続は認証に失敗します。ピアがデフォルトCAのいずれにも一致しないか連鎖しない証明書を使用する場合、ca オプションを使用して、ピアの証明書が一致または連鎖できるCA証明書を提供します。自己署名証明書の場合、証明書自体がそのCAであり、提供されなければなりません。PEMエンコードされた証明書の場合、サポートされるタイプは "TRUSTED CERTIFICATE", "X509 CERTIFICATE", "CERTIFICATE" です。
    • cert <string> | <string[]> | <Buffer> | <Buffer[]> PEM形式の証明書チェーン。秘密鍵ごとに1つの証明書チェーンを提供する必要があります。各証明書チェーンは、提供された秘密鍵 key のPEM形式の証明書、それに続くPEM形式の中間証明書(もしあれば)で構成され、ルートCAは含みません(ルートCAはピアに事前に知られている必要があります、ca を参照)。複数の証明書チェーンを提供する場合、それらは key 内の秘密鍵と同じ順序である必要はありません。中間証明書が提供されない場合、ピアは証明書を検証できず、ハンドシェイクは失敗します。
    • sigalgs <string> サポートされる署名アルゴリズムのコロン区切りリスト。リストにはダイジェストアルゴリズム(SHA256MD5など)、公開鍵アルゴリズム(RSA-PSSECDSAなど)、両方の組み合わせ(例: 'RSA+SHA384')、またはTLS v1.3のスキーム名(例: rsa_pss_pss_sha512)を含めることができます。詳細については、OpenSSLのmanページを参照してください。
    • ciphers <string> デフォルトを置き換える暗号スイート仕様。詳細については、デフォルトTLS暗号スイートの変更を参照してください。許可される暗号はtls.getCiphers()を介して取得できます。暗号名はOpenSSLが受け入れるために大文字でなければなりません。
    • clientCertEngine <string> クライアント証明書を提供できるOpenSSLエンジンの名前。非推奨。
    • crl <string> | <string[]> | <Buffer> | <Buffer[]> PEM形式のCRL(証明書失効リスト)。
    • dhparam <string> | <Buffer> 'auto' またはカスタムのDiffie-Hellmanパラメータ。非ECDHEの前方秘匿性に必要です。省略または無効な場合、パラメータは黙って破棄され、DHE暗号は利用できなくなります。ECDHEベースの前方秘匿性は引き続き利用可能です。
    • ecdhCurve <string> ECDH鍵合意に使用する名前付き曲線またはコロン区切りの曲線NIDまたは名前のリストを記述する文字列(例:P-521:P-384:P-256)。曲線を自動的に選択するには auto に設定します。利用可能な曲線名のリストを取得するにはcrypto.getCurves()を使用してください。最近のリリースでは、openssl ecparam -list_curvesも各利用可能な楕円曲線の名前と説明を表示します。デフォルト: tls.DEFAULT_ECDH_CURVE
    • honorCipherOrder <boolean> クライアントの代わりにサーバーの暗号スイートの優先順位を使用しようとします。true の場合、secureOptionsSSL_OP_CIPHER_SERVER_PREFERENCE が設定されます。詳細については OpenSSLオプション を参照してください。
    • key <string> | <string[]> | <Buffer> | <Buffer[]> | <Object[]> PEM形式の秘密鍵。PEMでは秘密鍵を暗号化するオプションが許可されています。暗号化された鍵は options.passphrase で復号化されます。異なるアルゴリズムを使用する複数の鍵は、暗号化されていない鍵の文字列またはバッファの配列として、あるいは {pem: <string|buffer>[, passphrase: <string>]} の形式のオブジェクトの配列として提供できます。オブジェクト形式は配列内でのみ使用できます。object.passphrase はオプションです。暗号化された鍵は、提供されていれば object.passphrase で、そうでなければ options.passphrase で復号化されます。
    • privateKeyEngine <string> 秘密鍵を取得するためのOpenSSLエンジンの名前。privateKeyIdentifier と一緒に使用する必要があります。非推奨。
    • privateKeyIdentifier <string> OpenSSLエンジンによって管理される秘密鍵の識別子。privateKeyEngine と一緒に使用する必要があります。key とは一緒に設定すべきではありません。なぜなら、両方のオプションは異なる方法で秘密鍵を定義するためです。非推奨。
    • maxVersion <string> オプションで、許可する最大のTLSバージョンを設定します。'TLSv1.3''TLSv1.2''TLSv1.1'、または'TLSv1'のいずれか。secureProtocol オプションと同時に指定することはできません。どちらか一方を使用してください。デフォルト: tls.DEFAULT_MAX_VERSION
    • minVersion <string> オプションで、許可する最小のTLSバージョンを設定します。'TLSv1.3''TLSv1.2''TLSv1.1'、または'TLSv1'のいずれか。secureProtocol オプションと同時に指定することはできません。どちらか一方を使用してください。TLSv1.2未満に設定することは避けるべきですが、相互運用性のために必要になる場合があります。TLSv1.2より前のバージョンでは、OpenSSLセキュリティレベルをダウングレードする必要がある場合があります。デフォルト: tls.DEFAULT_MIN_VERSION
    • passphrase <string> 単一の秘密鍵および/またはPFXに使用される共有パスフレーズ。
    • pfx <string> | <string[]> | <Buffer> | <Buffer[]> | <Object[]> PFXまたはPKCS12でエンコードされた秘密鍵と証明書チェーン。pfxkeycertを個別に提供する代わりの方法です。PFXは通常暗号化されており、その場合はpassphraseが復号化に使用されます。複数のPFXは、暗号化されていないPFXバッファの配列として、または{buf: <string|buffer>[, passphrase: <string>]}の形式のオブジェクトの配列として提供できます。オブジェクト形式は配列内でのみ使用できます。object.passphraseはオプションです。暗号化されたPFXは、提供されていればobject.passphraseで、そうでなければoptions.passphraseで復号化されます。
    • secureOptions <number> オプションでOpenSSLプロトコルの動作に影響を与えますが、通常は必要ありません。これは慎重に使用すべきです!値は OpenSSLオプション からの SSL_OP_* オプションの数値ビットマスクです。
    • secureProtocol <string> 使用するTLSプロトコルバージョンを選択するためのレガシーなメカニズムです。最小バージョンと最大バージョンの独立した制御をサポートせず、プロトコルをTLSv1.3に制限することもサポートしていません。代わりにminVersionmaxVersionを使用してください。可能な値はSSL_METHODSとしてリストされており、関数名を文字列として使用します。例えば、TLSバージョン1.1を強制するには'TLSv1_1_method'を、TLSv1.3までの任意のTLSプロトコルバージョンを許可するには'TLS_method'を使用します。1.2未満のTLSバージョンを使用することは推奨されませんが、相互運用性のために必要になる場合があります。デフォルト: なし、minVersionを参照してください。
    • sessionIdContext <string> サーバーがセッション状態がアプリケーション間で共有されないことを保証するために使用する不透明な識別子。クライアントでは使用されません。
    • ticketKeys <Buffer> 48バイトの暗号学的に強力な擬似乱数データ。セッション再開で詳細を参照してください。
    • sessionTimeout <number> サーバーによって作成されたTLSセッションが再開できなくなるまでの秒数。セッション再開で詳細を参照してください。デフォルト: 300

tls.createServer()honorCipherOrder オプションのデフォルト値を true に設定しますが、セキュアコンテキストを作成する他のAPIは設定しません。

tls.createServer()process.argv から生成された128ビットに切り詰められたSHA1ハッシュ値を sessionIdContext オプションのデフォルト値として使用しますが、セキュアコンテキストを作成する他のAPIにはデフォルト値がありません。

tls.createSecureContext() メソッドは SecureContext オブジェクトを作成します。これは server.addContext() のような複数の tls APIへの引数として使用できますが、公開メソッドはありません。tls.Server コンストラクタと tls.createServer() メソッドは secureContext オプションをサポートしていません。

証明書を使用する暗号には鍵が必須です。それを提供するために key または pfx のいずれかを使用できます。

ca オプションが与えられない場合、Node.js はデフォルトで Mozilla の公的に信頼されているCAリスト を使用します。

新しい dhparam: 'auto' オプションを優先するため、カスタムDHEパラメータは推奨されません。'auto'に設定すると、十分な強度の既知のDHEパラメータが自動的に選択されます。それ以外で、必要であれば、openssl dhparam を使用してカスタムパラメータを作成できます。キーの長さは1024ビット以上でなければならず、そうでなければエラーがスローされます。1024ビットは許容されますが、より強力なセキュリティのためには2048ビット以上を使用してください。

tls.createServer([options][, secureConnectionListener])#

  • options <Object>
    • ALPNProtocols <string[]> | <Buffer[]> | <TypedArray[]> | <DataView[]> | <Buffer> | <TypedArray> | <DataView> サポートされているALPNプロトコルを含む文字列、BufferTypedArray、または DataView の配列、あるいは単一の BufferTypedArray、または DataViewBuffer[len][name][len][name]... の形式であるべきです(例:0x05hello0x05world)。ここで最初のバイトは次のプロトコル名の長さです。配列を渡す方が通常ははるかに簡単です(例:['hello', 'world'])。(プロトコルはその優先度順に並べるべきです。)
    • ALPNCallback <Function> 設定されている場合、クライアントがALPN拡張を使用して接続を開いたときに呼び出されます。コールバックには1つの引数が渡されます。それはSNI拡張からのサーバー名(もしあれば)とALPNプロトコル名文字列の配列をそれぞれ含むservernameprotocolsフィールドを持つオブジェクトです。コールバックはprotocolsにリストされている文字列のいずれかを返す必要があり、それが選択されたALPNプロトコルとしてクライアントに返されます。または、致命的なアラートで接続を拒否するためにundefinedを返します。クライアントのALPNプロトコルのいずれとも一致しない文字列が返された場合、エラーがスローされます。このオプションはALPNProtocolsオプションと併用できず、両方のオプションを設定するとエラーがスローされます。
    • clientCertEngine <string> クライアント証明書を提供できるOpenSSLエンジンの名前。非推奨。
    • enableTrace <boolean> trueの場合、新しい接続でtls.TLSSocket.enableTrace()が呼び出されます。トレースはセキュアな接続が確立された後に有効にできますが、セキュアな接続のセットアップをトレースするにはこのオプションを使用する必要があります。デフォルト: false
    • handshakeTimeout <number> SSL/TLSハンドシェイクが指定されたミリ秒数で終了しない場合、接続を中止します。ハンドシェイクがタイムアウトするたびに、tls.Serverオブジェクトで'tlsClientError'が発行されます。デフォルト: 120000(120秒)。
    • rejectUnauthorized <boolean> falseでない場合、サーバーは提供されたCAのリストで承認されていない接続を拒否します。このオプションはrequestCerttrueの場合にのみ効果があります。デフォルト: true
    • requestCert <boolean> trueの場合、サーバーは接続するクライアントに証明書を要求し、その証明書を検証しようとします。デフォルト: false
    • sessionTimeout <number> サーバーによって作成されたTLSセッションが再開できなくなるまでの秒数。セッション再開で詳細を参照してください。デフォルト: 300
    • SNICallback(servername, callback) <Function> クライアントがSNI TLS拡張をサポートしている場合に呼び出される関数。呼び出される際には2つの引数が渡されます:servernamecallbackcallback はエラーファーストのコールバックで、2つのオプション引数 errorctx を取ります。ctx は、提供された場合、SecureContext インスタンスです。tls.createSecureContext() を使用して適切な SecureContext を取得できます。callback が falsy な ctx 引数で呼び出された場合、サーバーのデフォルトのセキュアコンテキストが使用されます。SNICallback が提供されなかった場合、高レベルAPIを使用したデフォルトのコールバックが使用されます(下記参照)。
    • ticketKeys <Buffer> 48バイトの暗号学的に強力な擬似乱数データ。セッション再開で詳細を参照してください。
    • pskCallback <Function> TLS-PSKネゴシエーションについては、事前共有鍵を参照してください。
    • pskIdentityHint <string> TLS-PSKネゴシエーション中にIDを選択するのを助けるためにクライアントに送信するオプションのヒント。TLS 1.3では無視されます。pskIdentityHintの設定に失敗すると、'tlsClientError''ERR_TLS_PSK_SET_IDENTITY_HINT_FAILED'コードで発行されます。
    • ...: tls.createSecureContext() の任意のオプションを提供できます。サーバーの場合、IDオプション(pfx, key/cert, または pskCallback)が通常必要です。
    • ...: net.createServer() の任意のオプションを提供できます。
  • secureConnectionListener <Function>
  • 戻り値: <tls.Server>

新しいtls.Serverを作成します。secureConnectionListener が提供された場合、自動的に'secureConnection'イベントのリスナーとして設定されます。

ticketKeys オプションは、node:cluster モジュールのワーカー間で自動的に共有されます。

以下は簡単なエコーサーバーの例です。

import { createServer } from 'node:tls';
import { readFileSync } from 'node:fs';

const options = {
  key: readFileSync('server-key.pem'),
  cert: readFileSync('server-cert.pem'),

  // This is necessary only if using client certificate authentication.
  requestCert: true,

  // This is necessary only if the client uses a self-signed certificate.
  ca: [ readFileSync('client-cert.pem') ],
};

const server = createServer(options, (socket) => {
  console.log('server connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  socket.write('welcome!\n');
  socket.setEncoding('utf8');
  socket.pipe(socket);
});
server.listen(8000, () => {
  console.log('server bound');
});const { createServer } = require('node:tls');
const { readFileSync } = require('node:fs');

const options = {
  key: readFileSync('server-key.pem'),
  cert: readFileSync('server-cert.pem'),

  // This is necessary only if using client certificate authentication.
  requestCert: true,

  // This is necessary only if the client uses a self-signed certificate.
  ca: [ readFileSync('client-cert.pem') ],
};

const server = createServer(options, (socket) => {
  console.log('server connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  socket.write('welcome!\n');
  socket.setEncoding('utf8');
  socket.pipe(socket);
});
server.listen(8000, () => {
  console.log('server bound');
});

この例の証明書と鍵を生成するには、以下を実行します。

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout server-key.pem -out server-cert.pem 

次に、この例の client-cert.pem 証明書を生成するには、次を実行します。

openssl pkcs12 -certpbe AES-256-CBC -export -out client-cert.pem \
  -inkey server-key.pem -in server-cert.pem 

サーバーは、tls.connect() のクライアント例を使用して接続することでテストできます。

tls.setDefaultCACertificates(certs)#

Node.jsのTLSクライアントが使用するデフォルトのCA証明書を設定します。提供された証明書が正常に解析された場合、それらはtls.getCACertificates()によって返されるデフォルトのCA証明書リストとなり、独自のCA証明書を指定しない後続のTLS接続で使用されます。証明書はデフォルトとして設定される前に重複が排除されます。

この関数は現在のNode.jsスレッドにのみ影響します。HTTPSエージェントによってキャッシュされた以前のセッションはこの変更の影響を受けないため、このメソッドは不要なキャッシュ可能なTLS接続が行われる前に呼び出す必要があります。

システムのCA証明書をデフォルトとして使用するには

const tls = require('node:tls');
tls.setDefaultCACertificates(tls.getCACertificates('system'));import tls from 'node:tls';
tls.setDefaultCACertificates(tls.getCACertificates('system'));

この関数はデフォルトのCA証明書リストを完全に置き換えます。既存のデフォルトに追加の証明書を追加するには、現在の証明書を取得してそれらを追加します。

const tls = require('node:tls');
const currentCerts = tls.getCACertificates('default');
const additionalCerts = ['-----BEGIN CERTIFICATE-----\n...'];
tls.setDefaultCACertificates([...currentCerts, ...additionalCerts]);import tls from 'node:tls';
const currentCerts = tls.getCACertificates('default');
const additionalCerts = ['-----BEGIN CERTIFICATE-----\n...'];
tls.setDefaultCACertificates([...currentCerts, ...additionalCerts]);

tls.getCACertificates([type])#

  • type <string> | <undefined> 返されるCA証明書のタイプ。有効な値は "default", "system", "bundled", "extra" です。デフォルト: "default"
  • 戻り値: <string[]> PEMエンコードされた証明書の配列。同じ証明書が複数のソースに繰り返し保存されている場合、配列には重複が含まれる可能性があります。

type に応じて、さまざまなソースからのCA証明書を含む配列を返します。

  • "default": Node.jsのTLSクライアントがデフォルトで使用するCA証明書を返します。
    • --use-bundled-ca が有効な場合(デフォルト)、または --use-openssl-ca が有効でない場合、これにはバンドルされたMozilla CAストアからのCA証明書が含まれます。
    • --use-system-ca が有効な場合、これにはシステムの信頼できるストアからの証明書も含まれます。
    • NODE_EXTRA_CA_CERTS が使用されている場合、これには指定されたファイルからロードされた証明書も含まれます。
  • "system": --use-system-ca によって設定されたルールに従って、システムの信頼できるストアからロードされたCA証明書を返します。これは --use-system-ca が有効でない場合にシステムから証明書を取得するために使用できます。
  • "bundled": バンドルされたMozilla CAストアからのCA証明書を返します。これは tls.rootCertificates と同じになります。
  • "extra": NODE_EXTRA_CA_CERTS からロードされたCA証明書を返します。NODE_EXTRA_CA_CERTS が設定されていない場合は空の配列です。

tls.getCiphers()#

サポートされているTLS暗号の名前を持つ配列を返します。名前は歴史的な理由から小文字ですが、tls.createSecureContext()ciphers オプションで使用するためには大文字にする必要があります。

サポートされているすべての暗号がデフォルトで有効になっているわけではありません。デフォルトTLS暗号スイートの変更を参照してください。

'tls_' で始まる暗号名はTLSv1.3用で、その他はすべてTLSv1.2以下用です。

console.log(tls.getCiphers()); // ['aes128-gcm-sha256', 'aes128-sha', ...] 

tls.rootCertificates#

現在のNode.jsバージョンによって提供される、バンドルされたMozilla CAストアからのルート証明書(PEM形式)を表す不変の文字列配列。

Node.jsによって提供されるバンドルされたCAストアは、リリース時に固定されたMozilla CAストアのスナップショットです。これはすべてのサポートされているプラットフォームで同一です。

現在のNode.jsインスタンスが使用する実際のCA証明書を取得するには(システムのストアからロードされた証明書(--use-system-caが使用されている場合)やNODE_EXTRA_CA_CERTSで示されたファイルからロードされた証明書を含む場合があります)、tls.getCACertificates()を使用してください。

tls.DEFAULT_ECDH_CURVE#

tlsサーバーでECDH鍵合意に使用するデフォルトの曲線名。デフォルト値は 'auto' です。詳細については tls.createSecureContext() を参照してください。

tls.DEFAULT_MAX_VERSION#

  • タイプ: <string> tls.createSecureContext()maxVersion オプションのデフォルト値。サポートされているTLSプロトコルバージョンのいずれか、'TLSv1.3''TLSv1.2''TLSv1.1'、または 'TLSv1' を割り当てることができます。デフォルト: 'TLSv1.3'、CLIオプションで変更されていない限り。--tls-max-v1.2 を使用するとデフォルトは 'TLSv1.2' に設定されます。--tls-max-v1.3 を使用するとデフォルトは 'TLSv1.3' に設定されます。複数のオプションが提供された場合、最も高い最大値が使用されます。

tls.DEFAULT_MIN_VERSION#

  • タイプ: <string> tls.createSecureContext()minVersion オプションのデフォルト値。サポートされているTLSプロトコルバージョンのいずれか、'TLSv1.3''TLSv1.2''TLSv1.1'、または 'TLSv1' を割り当てることができます。TLSv1.2より前のバージョンでは、OpenSSLセキュリティレベルをダウングレードする必要がある場合があります。デフォルト: 'TLSv1.2'、CLIオプションで変更されていない限り。--tls-min-v1.0 を使用するとデフォルトは 'TLSv1' に設定されます。--tls-min-v1.1 を使用するとデフォルトは 'TLSv1.1' に設定されます。--tls-min-v1.3 を使用するとデフォルトは 'TLSv1.3' に設定されます。複数のオプションが提供された場合、最も低い最小値が使用されます。

tls.DEFAULT_CIPHERS#

  • タイプ: <string> tls.createSecureContext()ciphers オプションのデフォルト値。サポートされているOpenSSL暗号のいずれかを割り当てることができます。デフォルトは crypto.constants.defaultCoreCipherList の内容ですが、--tls-default-ciphers を使用してCLIオプションで変更されていない限りです。