はじめに
HTTPS通信では通常、認証局(CA)によって発行された証明書を使ってサーバーの正当性を検証します。ですが、以下のようなケースでは自己署名証明書が使われることがあり、そのままでは axios などのライブラリで接続時にエラーが発生します。
自己署名証明書とは?
通常、HTTPSは「信頼された認証局(CA)」によって発行された証明書を使って、通信相手の正当性を保証します。
一方、自己署名証明書は「自分自身で署名した証明書」であり、外部の信頼機関による検証がされていないという違いがあります。
よくあるケース
- ローカル開発環境やステージング環境
開発用に mkcert や OpenSSL で生成した自己署名証明書を使って HTTPS を立てている場合。
- ✅ 本番と同じHTTPS環境を再現したい
- ❌ でも正式な証明書を取得するのは面倒 or コストがかかる
- イントラネットで使う社内サーバー
閉じたネットワーク内で使われており、社内CAや自己署名で構築されたサーバー。
- ✅ 外部公開されていないためLet's Encrypt等が使えない
- ❌ 通常のSSL検証では弾かれてしまう
- レガシーな外部サービスや開発中API
まだ正式な証明書を取得していないテスト用サービスに接続する場合。
無視しないとどうなる?
例えば以下のようなエラーが発生します:
Error: unable to verify the first certificate
または
UNABLE_TO_VERIFY_LEAF_SIGNATURE
これは、証明書の発行元が信頼できないため、Node.jsが接続を拒否している状態です。
対策
https.Agent({ rejectUnauthorized: false })を使う
const agent = new https.Agent({
rejectUnauthorized: false,
});
この設定を axios に渡すことで、自己署名証明書でも接続できるようになります。
axios.get(url, {
httpsAgent: agent,
});
注意:本番環境で使ってはいけない
これはあくまで一時的な開発用・検証用の措置です。rejectUnauthorized: false を使うと中間者攻撃(MITM)に対して完全に無防備になります。
👎 危険な使い方
- 本番APIへの常時通信
- インターネット越しに使う社外向けサービス
👍 安全な代替
- 信頼されたCAから証明書を取得(Let's Encrypt など)
-
NODE_EXTRA_CA_CERTSで自己署名証明書を信頼リストに追加 - 自前のCAを作り、それを信頼する設定を行う
おわりに
自己署名証明書を使う場面は確かにあります。
自己署名証明書のままではAPIとの通信がブロックされるため、「開発効率」を優先してあえて無視することがありますが、そのリスクと使用範囲を正しく理解したうえで限定的に使うことが重要です。
| 利用目的 | 推奨 | 対応策 |
|---|---|---|
| ローカル開発・社内検証環境 | ✅ |
rejectUnauthorized: false で回避可能 |
| 本番運用・公開サービス | ❌ | 必ず認証局から正式な証明書を取得 |
SSLを回避するaxiosラッパーをご参考ください。