やさしい自己認証局と自己署名証明書の作り方
Contents
概要
- 今回はテストのため、開発環境に自己認証局を構築し、自己認証局による自己署名証明書を発行しました。手順をまとめます。
- 自己署名証明書は、自分を認証局(CA)として立て、自分で自分の正当性を証明するいわゆる「オレオレ証明書」となります。自己署名証明書の利用で、通信は暗号化されますが、組織の実在性確認はできません。あくまでもテスト向けであり、サービス向けには信頼できる第三者認証局が発行した証明書を利用します。
- AWS では、ACM(AWS Certificate Manager)で証明書を発行する構成が多いですが、Load Balancer ではSSL終端せず、バックエンドのEC2やコンテナでSSL終端もあり得ます。このような構成では、ACMではなく、外部認証局 or 自己認証局で発行した証明書をバックエンド側で配置することもあります。
自己認証局と自己署名証明書の作り方
自己認証局の作り方
- 先ず、自己認証局用の秘密鍵と証明書を作成します。
- Linuxサーバーにhttpd, mod_sslをインストールします。(下記ログには含まず)
- openssl genrsaコマンドで、RSA 2048 bit の秘密鍵を作成します。秘密鍵は、/etc/pki/CA/private/niikawa-test-ca.key として配置しています。
- openssl reqコマンドで上記秘密鍵を使用して、CSRを作成します。-keyで秘密鍵を指定します。証明書の署名アルゴリズムにSHA-256を指定します。CSRは、/etc/pki/CA/niikawa-test-cacert.csr として配置しています。
- openssl x509コマンドで、CA証明書を発行します。-inでCSRを指定します。CAの秘密鍵で署名します。-signkeyで秘密鍵を指定します。-daysで有効期間を指定します。有効期間は3年(1095日)とします。証明書は/etc/pki/CA/certs/niikawa-test-cacert.pem として配置します。
CRL(証明書失効リスト)の作成
- 次にCAとして管理するCRL(証明書失効リスト)を作成します。CRLは、失効した公開鍵証明書のリスト(証明書のシリアル番号のリスト)です。CRLがない場合、次の証明書作成でエラーとなります。今回はテストのため、証明書のシリアル番号は"0x1″ とします。本来はもっと桁数の多いシリアル番号です。
- 有効(Valid)な証明書は、index.txt の先頭に“V" がマークされます。失効された(Revoked)証明書は、先頭に“R"がマークされます。
自己署名証明書の作り方
- openssl genrsaコマンドで、RSA 2048 bit の秘密鍵を作成します。秘密鍵は、/etc/pki/tls/private/niikawa-test-servercert.key として配置しています。
- openssl reqコマンドで上記秘密鍵を使用して、CSRを作成します。-keyで秘密鍵を指定します。証明書の署名アルゴリズムにSHA-256を指定します。CSRは、/etc/pki/tls/niikawa-test-servercert.csr として配置しています。
- openssl caコマンドで、サーバー証明書を発行します。-inでCSRを指定します。CAの秘密鍵で署名します。-keyfileで秘密鍵を指定します。-certでCAの証明書を指定します。-daysで有効期間を指定します。有効期間は3年(1095日)とします。証明書は/etc/pki/tls/certs/niikawa-test-servercert.pem として配置します。
- 下記の通り、CRL(証明書失効リスト)が更新されました。index.txtに証明書の情報が追加されています。有効(Valid)な証明書のため、"V"がマークされています。CAで失効された(Revoked)場合は、"R" がマークされます。
- serialのシリアル番号がカウントアップし、次の証明書には"0x2″が使われます。
- opensslコマンドで、発行された証明書の内容を確認します。
Apacheに証明書と秘密鍵を配置
- /etc/httpd/conf.d/ssl.conf に証明書および秘密鍵を指定します。vhost を作成している場合は、vhostのconf を編集します。
- httpdを再起動します。
curl 疎通確認
/etc/ssl/certsにCA証明書を配置する
- クライアントからcurl を実行します。今回、クライアントにはCA証明書が存在しないため、/etc/ssl/certsにCA証明書を配置しています。
- しかし、今回は自己証明書を利用しているため、“SSL certificate problem" が出力されました。"self signed certificate in certificate chain" とあり、自己署名証明書のためエラーとなっているようです。
自己署名証明書利用時に指定するcurl オプション
- 自己署名証明書利用時に出力された"SSL certificate problem" を回避するため、curl に“–insecure"オプションを追加します。次は無事にリクエストが送られ、レスポンス 200 OK も返りました。
参考資料