Webサーバを構築する時にSSLを有効化する設定を行うことが良くあります。 しかし、サーバの鍵を作って、証明書を作って、それをWebサーバのconfファイルに設定してなどとしていると、「証明書」「電子署名」「.pem」「.csr」「.crt」など色々な用語が出てきてわけが分からなくなってしまいます。
そこでSSL/TLS周りの知識の整理として今回はPKI(公開鍵基盤)についてまとめていきます。
PKI(公開鍵基盤)
PKI(公開鍵基盤)は公開鍵とその公開鍵の持ち主との対応関係を保証するための仕組みです。PKIでは認証局が公開鍵に対する証明書を作成することによって対応関係の保証を実現しています。
SSL/TLSではこれによりサーバの証明書(サーバの公開鍵の証明書)を取得し、サイトのなりすましを防いでいます。
証明書
証明書の発行は認証局(Certification Authority: CA)が行います。 証明書には以下の情報が含まれます。
- 申請者情報
- 認証局情報
- 申請者の公開鍵
- 認証局の電子署名
これによって申請者の公開鍵と申請者本人を対応付けており、認証局の電子署名によってそれを保証しています。
証明書を検証する際は、認証局の公開鍵を用いて証明書に含まれる電子署名を復号化し、証明書の情報が正しいことを確認します。
証明書発行の手順
証明書は以下の流れで生成されます。
- 申請者は秘密鍵ファイル(private.pem)を生成。
- 申請者は秘密鍵ファイルから、公開鍵ファイル(public.pem)とその電子署名から証明書要求ファイル(CSRファイル)を生成し、認証局に送付する。
- 認証局は自身の秘密鍵で証明書要求ファイルに電子署名をし、証明書ファイル(CRTファイル)を生成し返却する。
中間認証局とルート認証局
証明書の中には認証局の電子署名が含まれるため復号化には認証局の公開鍵が必要でした。よって、この公開鍵の証明書も必要となります。
そこで認証局は階層構造になることによって上位の認証局が下位の認証局の証明書を作成するという仕組みになっています。最上位の認証局をルート認証局(Root CA)、それ以外の認証局を中間認証局(Intermediate CA)と呼びます。
通常、申請者がサーバの証明書を申請した際には、サーバ証明書の他にこの認証局の証明書も送られてきます。もし上位に認証局がある場合はさらにその証明書も共に送られ、最終的にルート認証局の証明書も送られてきます。
opensslを用いたCSRファイルの作成
openssl rsaコマンドを用いて、証明書を取得するために必要なCSRファイルを作成する例を以下に示します。
# RSA秘密鍵の生成 $ openssl genrsa 1024 > private.pem # CSRファイルの生成 # (opensslコマンドでは以下で公開鍵、署名を作らなくてもCSRファイルを生成します。) $ openssl req -new -key private.pem > request.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP <- 自分の情報を入力 State or Province Name (full name) [Some-State]:Tokyo <- 自分の情報を入力 Locality Name (eg, city) []:Shibuya <- 自分の情報を入力 Organization Name (eg, company) [Internet Widgits Pty Ltd]: Hogehoge Inc <- 自分の情報を入力 Organizational Unit Name (eg, section) []: <- 自分の情報を入力 Common Name (e.g. server FQDN or YOUR name) []: <- 自分の情報を入力 Email Address []: <- 自分の情報を入力 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: <- 自分の情報を入力 An optional company name []: <- 自分の情報を入力
鍵ファイルについて
上の例では秘密鍵、公開鍵は共に「.pem」拡張子のファイルでした。これは鍵のデータをBase64エンコード化したデータであるということを意味します。この他にも「.DER」拡張子があります。
また、「.key」拡張子がついたファイルもありますが、これは鍵ファイルであることを意味しており、中身は「.pem」や「.der」と同じです。