自己署名証明書とは
自己署名証明書(Self-Signed Certificate)は、第三者の認証局(CA)を介さずに、自分自身で発行・署名したSSL/TLS証明書です。日本では俗に「オレオレ証明書」とも呼ばれます。
自己署名証明書の特徴:
- 無料:認証局への支払いが不要
- 即時発行:待ち時間なしで生成可能
- 信頼されない:ブラウザに警告が表示される
- 用途限定:開発環境や内部システム向け
自己署名証明書の生成
# OpenSSLで自己署名証明書を生成(有効期限365日)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
-sha256 -days 365 -nodes \
-subj "/C=JP/ST=Tokyo/L=Shibuya/O=MyCompany/CN=localhost"
# SAN(Subject Alternative Name)付きで生成
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
-sha256 -days 365 -nodes \
-subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,DNS:*.local,IP:127.0.0.1"
より詳細な設定(設定ファイル使用)
# openssl.cnf
[req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_req
[dn]
C = JP
ST = Tokyo
L = Shibuya
O = MyCompany
CN = localhost
[v3_req]
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = *.local
IP.1 = 127.0.0.1
IP.2 = 192.168.1.100
# 設定ファイルを使用して生成
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
-sha256 -days 365 -nodes -config openssl.cnf
AIエンジニアとしての実体験
ローカル開発環境でAI APIサーバーをHTTPSで動作させる必要がありました。Let's Encryptはlocalhostに対応していないため、自己署名証明書を使用しました。
# Python + Flaskでの使用例
from flask import Flask
import ssl
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
# AI推論処理
return {"result": "prediction"}
if __name__ == '__main__':
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('cert.pem', 'key.pem')
app.run(host='0.0.0.0', port=443, ssl_context=context)
開発チームへの証明書配布
チーム内で自己署名CAを構築し、そのCAで署名した証明書を使用することで、各メンバーがCA証明書をインストールすれば警告なしで開発できます。
# 自己署名ルートCAの作成
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
-subj "/C=JP/O=MyCompany/CN=Development CA"
# サーバー証明書のCSR作成
openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr \
-subj "/CN=dev.local"
# CAでサーバー証明書に署名
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 365 -sha256
自社サーバー運用への応用
適切な使用場面
- 開発・テスト環境:ローカルでのHTTPS動作確認
- 内部システム間通信:マイクロサービス間のmTLS
- IoTデバイス:クローズドネットワーク内のデバイス間通信
- プライベートPKI:企業内独自の証明書基盤
使用すべきでない場面
- 公開Webサイト:ユーザーに警告が表示され信頼を損なう
- 顧客向けAPI:クライアントが証明書を信頼できない
- 金融・医療系:コンプライアンス要件を満たせない
関連ブログ記事
📝 関連記事
最新動向(2026年)
mkcertツールの普及
mkcertは、ローカル開発用の自己署名証明書を簡単に生成するツールです。システムの信頼済み証明書ストアに自動でルートCAをインストールするため、警告なしで使用できます。
# mkcertのインストールと使用
brew install mkcert # macOS
mkcert -install # ローカルCAのインストール
mkcert localhost 127.0.0.1 ::1 # 証明書生成
Let's Encryptの普及
公開サービスでは、無料のLet's Encrypt証明書を使用することが標準となり、自己署名証明書の必要性は減少しています。
トラブル事例と対策
⚠️ 「NET::ERR_CERT_COMMON_NAME_INVALID」エラー
原因:SAN(Subject Alternative Name)が設定されていない
対策:最新のブラウザはCNではなくSANを参照するため、必ずSANを設定する
⚠️ curlで接続できない
原因:自己署名証明書が信頼されていない
対策:curl -kで検証をスキップ、または--cacert ca.crtでCA証明書を指定
権威あるリソース
- mkcert - A simple tool for making locally-trusted development certificates
- OpenSSL req コマンド
- Let's Encrypt
