自己署名証明書とは?

自己署名証明書は、信頼された認証局(CA)ではなく、その作成者自身によって署名されたデジタル証明書です。Let's Encrypt、DigiCert、Comodoなどの認証局によって発行された証明書とは異なり、自己署名証明書はブラウザやオペレーティングシステムによって自動的に信頼されません。

デジタル証明書は公開鍵暗号を使用して、クライアントとサーバー間のセキュアで暗号化された接続を確立します。証明書には、証明書の所有者(サブジェクト)、発行者、有効期間、および公開鍵に関する情報が含まれています。サーバーが証明書を提示する場合、クライアントは信頼されたルート証明書に対して検証し、接続がセキュアで真正であることを確認します。

証明書生成はどのように機能しますか?

証明書生成プロセスには、いくつかの暗号化ステップが含まれます:

  1. 鍵ペア生成:RSA鍵ペア(公開鍵と秘密鍵)が生成されます。秘密鍵は秘密に保つ必要があり、公開鍵は証明書に埋め込まれます。

  2. 証明書作成:サブジェクト情報(Common Name、Organization、Countryなど)、有効期間、および公開鍵を含む証明書構造が作成されます。

  3. 自己署名:証明書は秘密鍵とハッシュアルゴリズム(SHA-256、SHA-384、またはSHA-512)を使用してデジタル署名されます。この署名により、公開鍵を持つ誰もが証明書の整合性を検証できます。

  4. PEMエンコーディング:証明書と秘密鍵はPEM(Privacy-Enhanced Mail)形式でエンコードされます。これはBase64エンコード形式で、サーバーとアプリケーションで広くサポートされています。

ツール説明

このツールは、自己署名X.509証明書とそれに対応する秘密鍵をブラウザ内で直接生成します。データはサーバーに送信されません。すべての暗号化操作はnode-forgeライブラリを使用してローカルで実行されます。証明書のサブジェクトフィールド、鍵サイズ、有効期間、および署名アルゴリズムをカスタマイズして、特定の要件に合わせることができます。

基本的なlocalhostの証明書:

  • Common Name:localhost
  • 鍵サイズ:2048ビット
  • 有効期間:1年
  • アルゴリズム:SHA-256

開発サーバー証明書:

  • Common Name:dev.myapp.local
  • Organization:My Company
  • Country:US
  • 鍵サイズ:2048ビット
  • 有効期間:2年

出力形式(証明書):

-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiUMA0GCSqGSIb3QasEBBUAMEUxCzAJBgNV
...
-----END CERTIFICATE-----

出力形式(秘密鍵):

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA0Z3VS5JJcds3xfn/ygWyF8PbnGy...
...
-----END RSA PRIVATE KEY-----

機能

  • ブラウザベースの生成:すべての暗号化操作はブラウザ内でローカルに実行され、サーバー通信はありません
  • 設定可能な鍵サイズ:異なるセキュリティレベルのために1024、2048、3072、または4096ビットのRSA鍵から選択できます
  • 複数の署名アルゴリズム:SHA-256、SHA-384、およびSHA-512ハッシュアルゴリズムをサポートしています
  • 完全なX.509フィールド:Common Name、Organization、Organizational Unit、Country、State、およびLocalityを設定できます
  • 柔軟な有効期間:30日から10年まで有効な証明書を生成できます

証明書フィールドの説明

フィールド 説明
Common Name(CN) 証明書の対象となるドメイン名またはホスト名 localhostexample.com
Organization(O) 組織の法的名称 Acme Corporation
Organizational Unit(OU) 部門または部署 IT Department
Country(C) 2文字のISO国コード USGBDE
State/Province(ST) 州または県の名前 California
Locality(L) 市町村名 San Francisco

鍵サイズの推奨事項

  • 1024ビット:本番環境には推奨されません。テストのみに適しています
  • 2048ビット:標準的なセキュリティレベル。ほとんどのユースケースに推奨されます
  • 3072ビット:強化されたセキュリティ。機密性の高い開発環境に適しています
  • 4096ビット:最大セキュリティ。生成は遅くなりますが、最高の保護を提供します

ユースケース

  1. ローカル開発サーバー:Service Workers、Geolocation API、WebRTCなどのセキュアコンテキストが必要な機能をテストするために、localhostのHTTPS証明書を作成します

  2. 内部テスト環境:CA署名付き証明書が不要なステージングサーバーとQA環境の証明書を生成します

  3. DockerおよびコンテナアプリケーションDockerおよびコンテナアプリケーション:開発または分離されたネットワーク内のコンテナ間の通信をセキュアにします

  4. API開発とテスト:ローカルAPIサーバーのHTTPSを有効にして、OAuthフロー、セキュアWebhook、および証明書ピンニングをテストします

  5. 学習と教育:独自の証明書を生成して検査することで、SSL/TLS証明書がどのように機能するかを理解します

インストール手順

証明書を生成した後、サーバーを設定し、場合によっては証明書を信頼する必要があります:

Node.js/Expressの場合:

const https = require("https");
const fs = require("fs");

const options = {
  key: fs.readFileSync("private-key.pem"),
  cert: fs.readFileSync("certificate.pem"),
};

https.createServer(options, app).listen(443);

nginxの場合:

server {
    listen 443 ssl;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/private-key.pem;
}

証明書を信頼する(macOS):

  1. Keychain Accessを開きます
  2. certificate.pemファイルをインポートします
  3. 証明書をダブルクリックして、「信頼」を「常に信頼」に設定します

証明書を信頼する(Windows):

  1. certificate.pemファイルをダブルクリックします
  2. 「証明書のインストール」をクリックします
  3. 「ローカルコンピュータ」を選択して、「信頼されたルート認証局」に配置します

セキュリティに関する考慮事項

  • 本番環境では自己署名証明書を使用しないでください。公開されているWebサイトの場合は特にそうです
  • 秘密鍵をセキュアに保つ。アクセス権を持つ誰もがサーバーになりすまされる可能性があります
  • 自己署名証明書はブラウザ警告を表示します。デフォルトでは信頼されていないためです
  • 開発用に短い有効期間を使用して、証明書のローテーションを促進します
  • 信頼されたローカル証明書が必要な場合は、mkcertなどのツールの使用を検討してください