[解決済み] axiosがSSL証明書を使用するように設定するにはどうしたらよいですか?
質問
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が証明書を信頼し、正しく検証するように設定するにはどうしたらよいですか。
解決方法は?
古い質問ですが、ここにたどり着いた人のためにチャイムを鳴らしておきます。専門家はいません。お近くのセキュリティの専門家にご相談ください。
Axiosはhttp(s)クライアントで、httpクライアントは通常匿名でTLSに参加します。言い換えれば、サーバーは誰が接続しようとしているのかを特定することなく、その接続を受け入れるのです。これは、サーバーとクライアントがハンドシェイクを完了する前にお互いを確認する、例えば相互TLSとは異なります。
インターネットは恐ろしい場所なので、なりすましの公開エンドポイントに接続されないようにクライアントを保護したいのです。このため、プライベートデータを送信する前に、クライアントがサーバーを特定できるようにします。
// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httpsAgent = new https.Agent({ rejectUnauthorized: false });
これは、StackOverflow で、あらゆる言語での https クライアント接続の失敗に関する回答として、しばしば投稿されます(さらにひどく upvoted されます)。さらに悪いことに、この方法は通常うまくいき、開発者のブロックを解除し、彼らは陽気な道を進んでいくのです。しかし、彼らは確かにドアを開けることができましたが、それは誰のドアなのでしょうか?サーバーの身元確認を行わなかったため、クライアントは、会社のイントラネットに接続した際に、悪意ある人物に盗聴されているかどうかを知る術がないのです。
サービスが公開SSL証明書を持っている場合は
https.Agent
なぜなら、あなたのオペレーティングシステムは、一般に信頼されているCA証明書の共通セットを提供しているからです。これは通常、ブラウザが使用するように設定されているCA証明書のセットと同じで、そのためデフォルトのaxiosクライアントは以下のようにヒットします。
https://google.com
を、わずかな手間で実現することができます。
サービスにプライベート SSL 証明書(テスト用に自分で署名したもの、または会社の内部機密を保護するために会社のプライベート CA によって署名されたもの)がある場合、https エージェントは、サーバー証明書に署名するために使用したプライベート CA を信頼するように設定されなければなりません。
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()
.
関連
-
[解決済み] "app.use(express.cookieSession())" に "secret" オプションが必要です。
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] OpenSSLを使用して自己署名入りSSL証明書を生成する方法を教えてください。
-
[解決済み】自己署名付きlocalhost証明書をChromeが受け入れるようにする方法
-
[解決済み】自己署名証明書を持つWindowsでgitを使用して「unable to get local issuer certificate」を解決できない。
-
[解決済み】ファイアウォール越しにHTTPSでGitHubにアクセスしようとすると、SSL証明書が拒否される。
-
[解決済み】urllibと「SSL: CERTIFICATE_VERIFY_FAILED」エラーの関係
-
[解決済み】rubygemsインストール時のSSLエラー、'https://rubygems.org/'からデータを引き出せない。
-
[解決済み】ssl証明書はどのように検証されるのですか?
-
[解決済み】PHP - SSL証明書エラー: ローカルの発行者証明書を取得できない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リソースの読み込みに失敗しました: net::ERR_CONNECTION_REFUSED : Nodejs
-
[解決済み] (node:63208) DeprecationWarning: collection.ensureIndex は非推奨です。代わりにcreateIndexesを使用してください [重複]。
-
[解決済み】nodemon - app crashed - waiting for file changes before start
-
[解決済み】Passport.js - エラー: ユーザーのセッションへのシリアライズに失敗しました。
-
webpack ENOENTソリューションの起動
-
[解決済み】POSTできない/expressを使用するとエラーが発生する
-
[解決済み] ReferenceError: describe は定義されていません NodeJs
-
[解決済み] express は `body-parser deprecated undefined extended` としてエラーを投げます。
-
[解決済み] ノードマータ予期せぬフィールド
-
[解決済み] NPMが同じエラーで固まる EISDIR: ディレクトリに対する不正な操作、エラーで読み込み (ネイティブ)