自己署名証明書は自分で作成するもので、自分自身が認証局として機能します。CA署名証明書は、ブラウザが既に信頼している信頼された認証局(Let’s EncryptやDigiCertなど)によって発行・署名されます。
実用的な違い:自己署名証明書はブラウザのセキュリティ警告を引き起こします。CA署名証明書は引き起こしません。
比較
| 自己署名 | CA署名 | |
|---|---|---|
| 作成者 | 自分(opensslコマンド) | 信頼された認証局 |
| ブラウザの信頼 | ❌ 警告:「信頼されていません」 | ✅ パドロックアイコン |
| 暗号化強度 | 同じ | 同じ |
| コスト | 無料 | 無料(Let’s Encrypt)または有料 |
| 検証 | なし — 自分で保証 | 認証局がドメイン/組織を検証 |
| ユースケース | 開発、内部、テスト | 本番Webサイト |
| 更新 | 手動(有効期間を自分で設定) | 90日(LE)または1年(有料) |
| 中間者攻撃からの保護 | ⚠️ 弱い — ユーザーが警告をクリックして通過する習慣がつく | ✅ 強い — 実際の問題がある場合のみ警告 |
自己署名証明書が警告を表示する理由
ブラウザは誰が署名したかに基づいて証明書を信頼します。OSとブラウザには約100〜150の信頼されたルート認証局のリストが同梱されています。サーバーがこれらの認証局の1つが署名した証明書を提示すると、ブラウザはパドロックを表示します。
自己署名証明書はいずれの信頼された認証局にも署名されていません — 自身の秘密鍵で署名されています。ブラウザは証明書が正当であることを検証する方法がないため、警告を表示します。これは正しい動作です — 認証局の検証なしでは、誰でもgoogle.comを名乗る証明書を作成できます。
自己署名証明書を使用すべき場合
内部サービス
インターネットに公開されていないサービス — 内部ダッシュボード、監視ツール、データベース管理パネル。チームは自己署名CAをトラストストアに追加できます。
開発とテスト
mkcertを設定したくない場合のローカル開発用クイックHTTPS。ブラウザ警告は面倒ですが、テストには機能します。
IoTと組み込みデバイス
既知のサーバーと通信し、証明書をピン留めできるデバイス — ブラウザのトラストストアは関係ありません。
エアギャップネットワーク
インターネットアクセスのないネットワークで、Let’s EncryptのACMEプロトコルが到達できない場合。自己署名が唯一の選択肢です。
自己署名証明書を使用すべきでない場合
公開Webサイト
ユーザーが怖い警告を見て離脱します。検索エンジンは信頼されていない証明書のHTTPSページをクロールしない場合があります。Let’s Encrypt証明書が無料である以上、自己署名する理由はありません。
ユーザーデータを扱うサイト
自己署名証明書はユーザーにセキュリティ警告をクリックして通過する習慣を付けます — 良いセキュリティの正反対です。実際の攻撃が警告を引き起こした場合、「続行する」をクリックする習慣がついたユーザーは気づきません。
自己署名証明書の作成方法
# ECDSA(推奨)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=internal.example.com" \
-addext "subjectAltName=DNS:internal.example.com,IP:10.0.0.5"
# RSA
openssl req -x509 -newkey rsa:2048 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=internal.example.com"
生成されたcert.pemとkey.pemをサーバー設定で使用します。注意:fullchain.pemとchain.pemは不要です — 自己署名証明書にはチェーンがありません。
すべてのシナリオのより良い代替案
| シナリオ | 自己署名の代わりに |
|---|---|
| 本番Webサイト | GetHTTPS経由のLet’s Encrypt — 無料、信頼される、5分 |
| ローカル開発 | mkcert — ローカルで信頼される、警告なし |
| 内部サービス | Let’s Encrypt(インターネットアクセス可能なら)またはプライベートCA |
| テスト/ステージング | Let’s Encryptのステージング環境 — 無制限のテスト証明書 |
SSL証明書が$100以上/年だった時代には自己署名証明書は理にかなっていました。今やLet’s Encryptが無料なので、本当に隔離された環境以外で自己署名する理由はほとんどありません。
よくある質問
自己署名証明書はCA署名より安全性が低いですか?
暗号化は同一です — 同じアルゴリズム、同じ鍵強度。違いは信頼です:CA署名証明書は信頼された第三者を通じてサーバーのIDを証明します。自己署名証明書は何も証明しません — 誰でもどのドメインの証明書でも作成できます。セキュリティの問題は暗号ではなく、認証の欠如です。
ブラウザに自己署名証明書を信頼させることはできますか?
はい、管理しているマシンで。証明書(またはそれに署名した自己署名CA)をOS/ブラウザのトラストストアにインポートします。これがmkcertの自動化するものです。ただし、他の人のブラウザには信頼させることはできません — 実際の認証局が必要です。
ホスティングプロバイダーが自己署名証明書を提供しました。大丈夫ですか?
公開Webサイトには、いいえ。プロバイダーに無料のLet’s Encryptを有効にするよう依頼してください(ほとんどのホストが対応しています)。対応していない場合は、GetHTTPSを使用して自分で信頼された証明書を取得してください。
自分の認証局を作ればいいのでは?
可能ですが、ブラウザのトラストストアに参加する年単位の高額なプロセスを経なければ信頼されません。プライベートCAは内部インフラ(チームがルート証明書をインストール)には機能しますが、公開Webサイトには機能しません。公開サイトにはLet’s Encryptのような信頼された認証局を使用してください。