自己署名証明書 - 暗号化全般

暗号化全般 | IT用語集

自己署名証明書とは

自己署名証明書(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証明書を指定

権威あるリソース

関連用語

この用語についてもっと詳しく

自己署名証明書に関するご質問やセキュリティ設計のご相談など、お気軽にお問い合わせください。