SSL証明書を使用するようにaxiosを設定するにはどうすればいいですか? 質問する

SSL証明書を使用するようにaxiosを設定するにはどうすればいいですか? 質問する

axios を使用して API エンドポイントにリクエストを送信しようとすると、次のエラーが発生します。Error: unable to verify the first certificate

axios が使用する https モジュールは、サーバーで使用される SSL 証明書を検証できないようです。

ブラウザでサーバーにアクセスすると、証明書は有効であり、表示/ダウンロードできます。また、https 経由でブラウザの API にリクエストを送信することもできます。

検証をオフにすることで回避できます。このコードは機能します。

const result = await axios.post(
    `https://${url}/login`,
    body,
    {
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    }
  )

問題は、これによって SSL 証明書が検証されないため、セキュリティホールが生じることです。

証明書を信頼し、正しく検証するように axios を構成するにはどうすればよいでしょうか?

ベストアンサー1

古い質問ですが、ここにたどり着いた人のためにコメントします。専門家ではありません。地元のセキュリティの専門家などに相談してください。

Axios は http(s) クライアントであり、http クライアントは通常 TLS に匿名で参加します。つまり、サーバーは誰が接続しようとしているかを特定せずに接続を受け入れます。これは、サーバーとクライアントの両方がハンドシェイクを完了する前にお互いを検証する相互 TLS とは異なります。

インターネットは恐ろしい場所であり、私たちはクライアントが偽装されたパブリックエンドポイントに接続するのを防ぎたいと考えています。私たちは、クライアントがプライベートデータを送信する前にサーバーを識別できるようにすることでこれを実現しています。

// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httpsAgent = new https.Agent({ rejectUnauthorized: false });

これは、あらゆる言語での https クライアント接続の失敗に関する回答として StackOverflow によく投稿されています (そして、よりひどいことには賛成投票されています)。そして、さらに悪いことに、これは通常機能し、開発者のブロックを解除して、開発者は楽しく作業を進めます。しかし、開発者は確かにドアを開けますが、それは誰のドアでしょうか? 開発者はサーバーの ID の検証をオプトアウトしたため、かわいそうなクライアントは、会社のイントラネットに接続したばかりのときに、回線を盗聴している悪意のある人物がいるかどうかを知る方法がありません。

サービスにパブリックSSL証明書がある場合は、https.Agentオペレーティングシステムがパブリックに信頼されたCA証明書の共通セットを提供するため、通常はそれ以上の設定は必要ありません。これは通常、ブラウザが使用するように設定されているCA証明書のセットと同じであり、デフォルトのaxiosクライアントがヒットできる理由です。https://google.comあまり大騒ぎせずに。

サービスにプライベート SSL 証明書 (テスト目的で自己署名されたもの、または社内の秘密を保護するために会社のプライベート CA によって署名されたもの) がある場合は、サーバー証明書の署名に使用されるプライベート CA を信頼するように https エージェントを構成する必要があります。

const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });

ここで、は、MY_CA_BUNDLEアクセスするエンドポイントのサーバー証明書と、その証明書の完全な証明書チェーンの両方を含む CA 証明書の配列です.pem。信頼ルートまでのチェーン内のすべての証明書を含める必要があります。


これらのオプションはどこに文書化されていますか?

HTTPS は TLS/SSL 経由の HTTP プロトコルです。Node.js では、これは別のモジュールとして実装されています。

したがって、に渡されるオプションは、https.Agentに渡されるオプションのマージです。tls.connect()そしてtls.createSecureContext()

おすすめ記事