fibjs での X509 証明書の使用
背景の紹介
x509証明書とは何ですか
x509 証明書は、国際標準に基づく公開キー認証サービス (PKI) システムで最も一般的に使用されるデジタル証明書形式です。これは認証と暗号化に使用でき、インターネット上の SSL/TLS プロトコルやその他の種類のネットワーク アプリケーションで広く使用されています。 x509 証明書は公開キー/秘密キー認証メカニズムを使用し、データ送信の機密性、完全性、および信頼性を保証できます。
x509 証明書はどのようなシナリオで使用されますか?
インターネットでは、x509 証明書で最も一般的に使用されるシナリオは、クライアントとサーバー間で送信されるデータが安全なチャネルを使用して暗号化され、検証されることを保証する、TLS/SSL プロトコルでの証明書認証です。 x509 証明書は、VPN/SSH などの公開キーおよび秘密キーの暗号化に基づくアプリケーション プロトコルでの ID 認証にも使用できます。
fibjs は x509 証明書処理をサポートします
fibjs は x509 証明書の処理をサポートし、証明書の読み取り、作成、署名などの操作を実行するための暗号モジュールに X509Cert や X509Req などのクラスを提供します。これらのクラスを使用して、証明書の有効期間、公開キー、発行者、サブジェクト名などの情報を取得したり、証明書の署名や検証などの操作を実行したりできます。同時に、fibjs は HTTPS 証明書認証と暗号化された接続をサポートする HttpsServer クラスも提供し、fibjs での x509 証明書の使用を容易にします。
X509モジュールの紹介
X509モジュールとは何ですか?
fibjs の暗号モジュールでは、x509 証明書の読み取り、作成、署名などの操作を実行するための X509Cert や X509Req などのクラスが提供されます。 X509 モジュールは、x509 証明書を処理するためのモジュールであり、証明書の解析、作成、検証などの操作を提供します。
X509モジュールの機能
X509 モジュールの機能は x509 証明書を操作することであり、このモジュールを使用して既存の x509 証明書を読み取り、証明書の有効期間、公開鍵、発行者、サブジェクト名などの情報を取得できます。同時に、X509 モジュールは、TLS/SSL プロトコルでの証明書認証などのために、x509 証明書要求と署名証明書を作成することもできます。
X509モジュールAPI
以下は、X509 モジュールのより重要な API のリストです。
- X509Cert: x509 証明書を読み取り、操作するためのクラス。
- X509Req: x509 証明書リクエストの作成に使用されるクラス。
- verify: CA 証明書ペアを介して x509 証明書を検証します。
- SslServer: x509 証明書に基づいた認証サービスを提供するクラス。
- SslSocket: x509 証明書に基づく認証サービスのためのソケットのデータ送受信操作を提供するクラス。
サンプルコード
以下は、x509 証明書を読み取り、x509 証明書リクエストを作成するサンプル コードです。
1
2
3
4
5
6
7
8
9
10
11
12const crypto = require('crypto');
// load the cert
const cert = crypto.loadCert('server.crt');
console.log(cert.subject);
// create x509 certificate request
let pky = crypto.PKey.from(private_pem);
let req = new crypto.X509Req("CN=localhost,O=fibjs", pky);
let derReq = req.der();
let pemReq = req.pem();
console.log(pemReq);
上記のサンプル コードは、X509Cert クラスを通じて既存の x509 証明書を読み取り、証明書のサブジェクト名を出力します。同時に、サンプル コードは、X509Req を通じて x509 証明書リクエストを作成し、リクエスト情報を PEM 形式で出力する方法も示しています。
X509モジュールの使用方法
自己署名証明書を生成する
自己署名証明書を生成するプロセスは比較的簡単で、通常は次の手順を実行する必要があります。
- PKey(秘密鍵)の生成
- X509Req(証明書リクエスト)の生成
- X509Req を使用して X509Cert (正式な証明書) を生成する
- 証明書を保存する
これらの手順を使用すると、テスト環境および開発環境で使用する独自の x509 証明書を生成できます。具体的な実装は次のとおりです。
次のコードを使用して PKey オブジェクトを作成します。このうち、from() メソッドは、PEM 形式の文字列またはバッファを通じて PKey オブジェクトを作成できます。
1
2const crypto = require('crypto');
const pky = crypto.PKey.from(private_pem);
次のコードを使用して、X509Req オブジェクトを作成します。このうち、X509Req の最初のパラメータはサブジェクト識別名 (Subject Name) であり、文字列形式は key1=value1,key2=value2 です。 2 番目のパラメーターは、証明書の署名に使用される、以前に作成された PKey オブジェクトです。例えば:
1let xrq = new crypto.X509Req("CN=localhost,O=fibjs", pky);
次のコードを使用して、X509Cert (公式証明書) を作成します。具体的な操作は、X509Req のsign() メソッドを呼び出すことです。このメソッドは、認証局の名前、署名に使用される PKey オブジェクト、およびその他の関連情報の 3 つのパラメーターを受け入れます。たとえば、次の例では、X509Req オブジェクトは自己署名証明書で署名されており、署名機関はそれ自体であり、証明書の有効期間は 10 年間です。
1
2
3
4
5const opt = {
notBefore: new Date(),
notAfter: new Date(new Date().getTime() + 10 * 365 * 24 * 60 * 60 * 1000)
};
const cert = xrq.sign("CN=localhost,O=fibjs", pky, opt);
次のコードを使用して、PKey と X509Cert をローカル ファイルに保存します。証明書は PEM 形式で保存されるため、 pem() メソッドを使用して証明書オブジェクトを文字列に変換し、ファイルに直接保存できます。
1
2
3
4
5const fs = require('fs');
const ks = pky.pem(); // export pem format data of the private key
const cs = cert.pem(); // export pem format data of the cert
fs.writeFile('mycert.key', ks); // save the key
fs.writeFile('mycert.pem', cs); // save the cert
上記のコードは、秘密キーの生成から自己署名証明書の保存までのプロセス全体を完了します。この証明書を使用して、セキュリティ関連のアプリケーションをテストおよび開発できます。
証明書をロードする
証明書のロードは、x509 証明書を使用する場合の重要な操作です。以下に、証明書ファイルをロードし、公開キーと秘密キーをロードする方法を説明します。
x509 証明書を使用するには、まず証明書ファイルをメモリに読み込んで、x509 証明書オブジェクトに変換する必要があります。証明書ファイルをロードする手順は次のとおりです。
fibjs JavaScript プログラムでは、fs モジュールの関連 API を使用してファイルを読み取ることができます。たとえば、PEM 形式の証明書ファイルを読み取るには、次のコードを使用します。
1
2const fs = require('fs');
const certData = fs.readFile('server.crt');
ファイルを読み取った後、X509Cert オブジェクトを使用して証明書ファイルの内容を x509 証明書に変換する必要があります。
1
2const crypto = require('crypto');
const cert = new crypto.X509Cert(certData);
上記の手順を完了すると、ローカルの x509 証明書ファイルをロードできます。 crypto.loadCert を使用して証明書を直接読み取ることもできます。
1
2const crypto = require('crypto');
const cert = crypto.loadCert('server.crt');
x509 証明書には公開キーと暗号化された署名情報が保存されるため、証明書を使用する場合は、データの暗号化と復号化を容易にするために証明書内の公開キーを解析する必要があります。 PKey クラスは、PEM 形式の公開キー/秘密キー文字列を公開キー/秘密キー オブジェクトに変換できます。次のコードを使用して、PEM 形式の公開キー/秘密キー文字列を読み取り、PKey オブジェクトを作成できます。
1
2const privateKey = fs.readFile('private.pem'); // load the data from file
const pKey = crypto.PKey.from(privateKey); // load from pem format data
または、crypto.loadPKey を使用して直接読み取ります。
1
2const crypto = require('crypto');
const pKey = crypto.loadPKey('private.pem');
上記の手順を完了すると、公開キー/秘密キー ファイルを PKey オブジェクトに変換できます。
証明書を解析する
証明書は SSL/TLS 通信の重要なコンポーネントであり、データ送信の認証と暗号化に使用されます。次に、fibjs で証明書を解析する方法を学びましょう。
暗号モジュールの X509Cert クラスを使用して、DER/PEM 形式の証明書ファイルを読み取ることで証明書オブジェクトを構築し、証明書のサブジェクト名、発行者名、有効期間など、証明書に関する基本情報を取得できます。など。
サンプルコードは次のとおりです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14const crypto = require('crypto');
const cert = crypto.loadCert('path/to/cert.pem');
const subjectName = cert.subject;
const issuerName = cert.issuer;
const validFromDate = cert.notBefore;
const expirationDate = cert.notAfter;
const serialNumber = cert.serial;
console.log(`证书主题名称: ${subjectName}`);
console.log(`证书颁发者名称: ${issuerName}`);
console.log(`证书有效期: ${validFromDate.toLocaleString()} ~ ${expirationDate.toLocaleString()}`);
console.log(`证书序列号: ${serialNumber}`);
証明書を使用する必要がある場合、証明書の正当性を検証する必要がありますが、重要なのは、証明書が信頼できる組織によって発行されたものであることを確認することです。 X509Cert の verify メソッドを使用して、証明書の有効性を確認できます。一般的な検証方法は、証明書チェーンを検証して、証明書が信頼された CA によって発行されたことを確認することです。
サンプルコードは次のとおりです。
1
2
3
4
5
6
7
8
9const caCert = crypto.loadCert('path/to/ca.crt');
const verifyResult = cert.verify(caCert);
if (verifyResult !== 0) {
console.error('证书验证失败', verifyResult);
} else {
console.log('证书验证通过');
}
このサンプル コードでは、まず指定された CA 証明書を読み取り、X509Cert オブジェクトを生成し、証明書オブジェクトの verify メソッドを使用して検証が必要な証明書を検証し、検証結果を取得します。検証結果が 0 かどうかを比較することで、証明書が正当であるかどうかを判断できます。検証結果が 0 でない場合は、検証が失敗したことを意味するため、証明書の使用を停止する必要があります。
証明書を使用する
https サーバーを使用する場合は、使用する証明書がサーバーに追加されていることを確認する必要があります。以下は、暗号化モジュールを介して証明書ファイルと秘密鍵ファイルをロードする簡単な例です。
1
2
3
4
5
6
7
8
9
10const http = require("http");
const crypto = require("crypto");
const cert = crypto.loadCert("server.crt");
const key = crypto.loadPKey("server.key");
const server = new http.HttpsServer(cert, key, 8443, function(req) {
req.response.write(`Hello, fibjs!`);
});
server.start();
上の例では、loadCert 関数とloadPKey 関数を使用してserver.crt ファイルとserver.key ファイルをロードし、次に HttpsServer オブジェクトを使用してサービスを作成し、ロードされた証明書とキー ファイルを使用してサービスを開始しました。
X509モジュールに関する注意事項
証明書のセキュリティ
X509 モジュールは、証明書の作成や処理などの機能を提供しますが、証明書の安全性が保証される必要があるため、次の点に特に注意する必要があります。
- 秘密鍵のセキュリティ。秘密キーは証明書の重要な部分であり、厳密に保護する必要があります。証明書を使用する際は、秘密鍵を可能な限り安全な場所に保管し、アクセス許可を適切に設定する必要があります。
- 証明書の送信は安全です。証明書の交換および使用中は、証明書の盗難や改ざんを防ぐために、安全な送信方法を使用する必要があります。
- 証明書の検証は安全です。証明書の検証は、証明書の有効性とセキュリティを確保するための重要な手順です。偽造された証明書がユーザーに誤解を与えないよう、証明書検証規則に厳密に従って検証を実行する必要があります。
証明書の有効期間
証明書の有効期間とは、証明書の発行日から証明書の有効期限までの期間を指します。証明書の有効期間は、証明書の使用時間を制限します。証明書の有効期限が切れる前は、証明書所有者は証明書を使用できますが、証明書の有効期限が切れると、証明書の有効性が失われます。
したがって、証明書を使用する前に、証明書の有効期間を確認し、期限切れの証明書を使用しないようにする必要があります。同時に、証明書を確実に利用できるように、期限が切れる前にできるだけ早く証明書を更新する必要があります。
証明書の信頼メカニズム
証明書の信頼メカニズムは、証明書がクライアントまたはサーバーによって信頼できるかどうかを決定する重要な要素です。通常、クライアントまたはサーバーは、信頼された機関 (CA) によって署名され認識された証明書のみを信頼します。
証明書を使用する前に、証明書の信頼性の問題を判断する必要があります。証明書が信頼できるかどうかは、証明書の発行局、証明書のサブジェクト識別名などを確認することで判断できます。
証明書更新メカニズム
証明書更新メカニズムは、証明書が有効で安全な状態を維持するために重要な部分です。通常、証明書の更新には主に次の 2 つの側面が含まれます。
- 証明書の有効期限が切れた後の更新。証明書の有効期限が切れたら、証明書を再申請し、対応するルールに従って署名および検証して、証明書の有効性を確認する必要があります。
- 証明書の延長と更新。証明書の使用中に証明書情報を拡張または更新する必要がある場合は、証明書を再申請し、署名および検証することで行うことができます。
要約すると、X509 モジュールは証明書の作成、処理、その他の機能を提供し、証明書のセキュリティ、信頼性、有効性を確保するための重要なリンクです。証明書の使用および管理のプロセスでは、証明書の有効性とセキュリティを確保するために、対応するルールと要件に従う必要があります。