HTTPS Node.jsサーバーで自己署名証明書を使用するにはどうすればよいですか?

私は、すべてのリクエストがHTTPSであることを必要とするAPIのラッパーを書き始めました。開発中やテスト中に実際のAPIにリクエストをする代わりに、ローカルで自分のサーバーを動かしてレスポンスをモックしたいと思います。

HTTPS サーバーを作成し、リクエストを送信するために必要な証明書をどのように生成すればよいか、混乱しています。

私のサーバーはこのような感じです。

var options = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
};

https.createServer(options, function(req, res) {
  res.writeHead(200);
  res.end('OK\n');
}).listen(8000);

でpemファイルを生成しました。

openssl genrsa 1024 > key.pem
openssl req -x509 -new -key key.pem > cert.pem

そして、リクエストは次のようなものです。

var options = {
  host: 'localhost',
  port: 8000,
  path: '/api/v1/test'
};

https.request(options, function(res) {
  res.pipe(process.stdout);
}).end();

この設定では、Error:DEPTH_ZERO_SELF_SIGNED_CERT が表示されるので、リクエストに ca オプションを追加する必要があるようです。

そこで質問なのですが、以下のようにどのように生成すればよいのでしょうか?

  1. サーバー key?
  2. サーバー cert?
  3. リクエストの ca は?

OpenSLの自己署名証明書の生成についていくつか読みましたが、どのキーと証明書を私のノードのコードのどこで使用するか、理解することができないようです。

**更新情報

APIは、デフォルトの代わりに使用するCA証明書を提供します。以下のコードはその証明書を使用して動作し、これは私がローカルで再現したいものです。

var ca = fs.readFileSync('./certificate.pem');

var options = {
  host: 'example.com',
  path: '/api/v1/test',
  ca: ca
};
options.agent = new https.Agent(options);

https.request(options, function(res) {
  res.pipe(process.stdout);
}).end();

リクエストのオプションにこれを追加してみてください。

var options = {
  host: 'localhost',
  port: 8000,
  path: '/api/v1/test',
  // These next three lines
  rejectUnauthorized: false,
  requestCert: true,
  agent: false
};
解説 (0)

鍵の生成は問題ないようですね。署名されていないリクエストを拒否していないので、caは必要ないはずです。

readFileSyncメソッドの最後に.toString()を追加し、ファイルオブジェクトではなく、実際に文字列を渡すようにします。

解説 (3)

を加えてみてください。

  agent: false,
  rejectUnauthorized: false
解説 (1)