サーバ証明書は、Webシステムを作る上で必須の知識だが、ちゃんと理解してる人は意外と少ない。
今回は、そんなサーバ証明書について検証を通して学ぼう。
検証環境
AWS上のEC2インスタンス。
AmazonLinux+Apache+mod_ssl+OpenSSL
EC2インスタンスを作ったら、予めApacheとmod_sslとOpenSSLをインストールしておこう。
# yum install httpd mod_ssl openssl
サーバ証明書の作成手順
サーバ証明書を実際に作ってみよう。手順としては、次のような流れとなる。
- 秘密鍵の生成
- 公開鍵の生成。公開鍵を使ってCSR(証明書作成要求)の作成。
- CSRをCA(認証局)に提示して、サーバ証明書を発行してもらう。
それでは早速作ってみよう。
1.秘密鍵の生成
# openssl genrsa 2048 > server_sec.key
このコマンドで秘密鍵(server_sec.keyとした)を生成する。生成した秘密鍵の中身は、このコマンドで確認することができる。
# openssl rsa -text < server_sec.key
2.公開鍵の生成。公開鍵を使ってCSR(証明書作成要求)の作成
CSRは公開鍵と作成時に入力する項目から作成される。そのため、まずは秘密鍵から公開鍵を作成する必要がある(この秘密鍵と公開鍵のことをキーペアと呼ぶ)。
しかし実際には、下記コマンド1行で、
- 秘密鍵から公開鍵の作成
- 公開鍵からCSRの作成
を実施することが可能だ。
# openssl req -new -key server.key > server.csr
3.CSRをCA(認証局)に提示して、サーバ証明書を発行してもらう
あとは、このCSRを認証局に提示して、サーバ証明書を発行してもらえば、サーバ証明書の完成だ。
おそらく認証局のWebサイトでCSRをコピペするような手順になるだろう。
ところで、認証局はCSRを受領してからどのような操作を実施しているのだろうか?
その前にサーバ証明書とは何か?について学習しておく必要がある。
サーバ証明書とはなにか?
サーバ証明書について書く前に、「署名」について書こうと思う。
署名とは、受領したCSRから算出したハッシュ値を、認証局の秘密鍵で暗号化したものだ。このときに使われるハッシュ関数がSHA-1、SHA-2などになる(ハッシュ値の算出には、ハッシュ関数が必要だ)。
そしてサーバ証明書とは、CSRに認証局の署名をつけたもののことを言う。
グローバルサインでは、提出されたCSRに認証機関としての署名をして、サーバ証明書を発行します。
つまり認証局は、CSRを受領してから認証局の秘密鍵を使って、CSRに署名を付与する作業を実施しているのだ。
自己証明書とは?
ちなみに自己証明書とは、CAによる署名(秘密鍵による暗号化)ではなく、自身の秘密鍵で署名をしたサーバ証明書のこと。
先程の環境におけるコマンドはこちら。
# openssl x509 -req -signkey server.key < server.csr > server.crt
自己証明書を利用してWebサーバにhttpsでアクセスしてみよう
さて、作成した自己証明書をWebサーバにセットして、クライアントからhttpsでアクセスしてみよう。
ApacheのConfigを編集して、SSLのアクセスを受けられるようにする。
# cd /etc/httpd/conf
# vi + httpd.conf
<最下行に下記を追加>
--------------------------
<VirtualHost _default_:443>
SSLEngine on
SSLCertificateFile /etc/httpd/server.crt
SSLCertificateKeyFile /etc/httpd/server.key
</VirtualHost>
--------------------------
編集が終わったら、Apacheを再起動する。
# service httpd restart
これでSSLの通信が受けられるようになっているはずだ。ブラウザからhttpsでアクセスしてみよう。すると、こんな画面が出る。
今回、この画面が出ている理由は「自己証明書」を利用しているからだ。
パブリック認証局から発行された証明書を利用して、正しいFQDNでアクセスすれば、この警告は表示されない。
SHA-1、SHA-2とは?
ちなみに最近良く言われる『SHA-1』『SHA-2』とは、署名のときに利用されるハッシュ関数のこと。
(先に書いたが、CSRからハッシュ値を算出して、そのハッシュ値に対して、認証局の秘密鍵で暗号化するのが、『署名』だ。)
SHA-2にはSHA-224、SHA-256、SHA-384、SHA-512の4つのバリエーションがあり、末尾の数字がハッシュ値のビット長を表している。最長であるSHA-512が最も安全性が高いが、一般的にはSHA-256が最もよく利用されています。
参考サイト:
- 知らなきゃマズい!?「SHA-1」廃止問題を解説 - IT、IT製品の情報なら【キーマンズネット】
- 図解で学ぶネットワークの基礎:SSL編 - Lesson4:相手が信頼できることを確かめる「サーバー証明書」とは?:ITpro
- [FAQ] CSRについて教えてください。 | SSL・電子証明書ならGMOグローバルサイン
- オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっている