質問: あるhttpsのapiに対してリクエストを送っています。(言語はnodeでrequestモジュールを使っています) その接続先のサーバーの運営元から「SSLサーバ証明書を更新したため、ルート証明書を追加してください」と依頼が来ました。 ここで2点の疑問が生まれました。 1)そもそも、現在ルート証明書を追加するという作業を行なっていない。なのに今現在リクエストは正常に行えています。なぜでしょうか? node.jsにはデフォルトで組み込まれているcaのリストがあるのでそれが使われている?? 2)requestモジュールでcaを指定するにはどう書けばいいでしょうか? requestモジュールのreadmeに以下のようにすれば証明書を指定できそうな感じで書いていますが、複数の証明書(現在稼働中の証明書と近々稼働する証明書)を指定するにはどうすればいいでしょうか? ``` request.get({ url: 'https://api.some-server.com/', agentOptions: { ca: fs.readFileSync('ca.cert.pem') } }); ``` 上記2点いずれかでもいいのでご教示ください。 よろしくお願いいたします。
回答: 「SSLサーバ証明書を更新したため、ルート証明書を追加してください」という依頼がきたということですが、ルート証明書を追加する必要があるというのは、いわゆる「オレオレ証明書」ということになります。通常の運営者であればセキュリティ的に問題があって手間もかかる「オレオレ証明書」を使うことはないと思います。もう一度依頼内容を確認して、それでも「ルート証明書を追加する必要がある」となっているのであれば運営者に問い合わせをした方がいいと思います。もし偽メールだったら何が入っているかわからないし。 1)node.jsでは、質問にあるように、組み込まれているcaのリストが使われていると思われます。信頼される認証局のルート証明書(組み込まれているcaのリスト)を元にして信頼性をチェックするのが`HTTPS`の基本なので間違いないです。 2)一番簡単なのは、環境変数`NODE_EXTRA_CA_CERTS`にルート証明書のPATHを設定する方法だと思います。(参考: 英語版質問 How to add custom certificate authority (CA) to nodejs ) ``` export NODE_EXTRA_CA_CERTS=file ``` また、requestモジュールの方で、caを指定する場合に、複数を指定する方法があればいいのですが、もしなかったとしも、現在のrequestモジュールのエラー処理のところにcaを指定したものを書けばいいのではないかと思います。