#はじめに
いよいよSSL証明書のSHA-2への移行に皆さん本腰入れ始めたのか、APIやWebサービスなど各所からSHA-1からSHA-2へ切り替える旨の連絡が届く毎日です。
SSL証明書の署名アルゴリズムをSHA–1からSHA–2へと変更したり、証明書を再発行すること自体は難しいことではありませんが、SHA-2での自己発行証明書のつくり方ってあまり見かけない気がするので、ちょうど最近作成したのでその手順を書いておきます。
自己発行証明書は開発環境での使用が主となると思いますが、ECサイトの構築案件などをやっていると、特に1台のWEBサーバで複数のドメインをホストするケースが出てきがちです。
名前ベースのバーチャルホストでは、基本的に1つのIPにつきひとつのSSL環境しか作れませんので、複数のIPを用意したりポートを変えるかなどする必要がありますが、SANs(Subject Alternative Names)とSNI(Server Name Indication)を使うことによって、1つのIPで複数ドメインに対応したSSL環境を1つの証明書で作ることができます。
簡単に言うと、
SANs ... 1つの証明書で複数ドメインに対応することができます。
SNI ... 1IPで複数ドメインのSSLが可能になります。
SANsに関しては、あまりメリットがないかもしれませんが、しいて言えば、あらかじめ複数のドメインに対応した証明書を作成する必要があるとわかっているときに、一度の証明書作成で全ドメインに対応したものが作れることでしょうか。
今更ながら、ワイルドカード証明書のほうが使い勝手がいいかもしれないと思い始めましたが、そちらはまた別の機会に。
#環境
CentOS 6.7
openssl-1.0.1e-42
#自己発行証明書の作成準備
/etc/pki/tls/openssl.cnf をコピーして
/etc/pki/tls/openssl_san.cnf を作成
[req]セクションで
x509_extensions = v3_req
req_extensions = v3_req
[ v3_req ]セクションで
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
といった箇所を探し、その下に以下を追加する。
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.example.com
DNS.2 = hogehoge.example.net
DNS.3 = humuhumu.example.jp
[alt_names] のところはSSL対応させるドメインを列挙していきます。
#秘密鍵と証明書の作成
/etc/httpd/conf/ssl.key 以下に秘密鍵を、
/etc/httpd/conf/ssl.crt 以下に証明書を保存することにします。
これらのディレクトリは予め作成しておいてください。
$ openssl genrsa -out /etc/httpd/conf/ssl.key/server.key 2048
これで秘密鍵が作成されました。
次は証明書の作成です。正規のSSL証明書を作成する際は、csrを生成しますが、自己発行証明書はいきなりcrtを作成しちゃいます。
$ openssl req -config /etc/pki/tls/openssl_san.cnf -new -sha256 -x509 -key /etc/httpd/conf/ssl.key/server.key -out /etc/httpd/conf/ssl.crt/server.crt -days 1000
これで、期限1000日間の自己発行証明書となります。
#たとえばapacheでのhttpd.confの設定
SNIを有効にするために、以下のような記述がまず必要です。
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
NameVirtualHost *:443
VirtualHostの設定は、以下のように名前ベースで。
<VirtualHost *:80>
ServerName www.example.com
...
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
...
</VirtualHost>
#対応ドメインの追加方法
上記のopenssl_san.cnfの[alt_names]にドメイン追記して、その後、証明書の作成を実行。あとはhttpd.confでVirtualHostを追加・編集するなどして、apacheを再起動。