EC2とApacheでSSL通信(RapidSSL)を行う


SSL暗号化通信を行うまでのサーバ設定

HTTPではセキュリティに問題があるということで,今回は初めてSSL暗号化通信の設定を行ってみたいと思います.

SSL通信とは?

まずSSL通信を使うと嬉しいこと.

  • やりとりされるデータを暗号化できる

  • Webサイトの運営者が本物であるか認証できる

アクセス先が安全なWebサイトであることを保証してくれるものと考えるとわかりやすい.
SSL通信で行われている「共通鍵暗号方式」や「公開鍵暗号方式」などの詳しい仕組みの解説は他を参考にしていただくとして,
ここではサーバ上での設定方法について調べた結果をまとめていきます.
(参考)SSLとは?仕組みから、共有・独自SSLの違い、証明書についてが分かるまとめ

サーバ上の設定詳細

開発環境

  • EC2(Amazon Linux AMI)

  • Apache2.2.31

(参考)さくらのVPS(CentOS 5.5)に RapidSSL をインストールするまでのメモ

SSL通信を実現するためにはOpenSSLというライブラリを使います.
EC2にはデフォルトでインストールされていると思いますが念のためコマンドで確認

$ rpm -q openssl

ApacheをSSLに対応させるためのモジュールをインストール

$ yum -y install mod_ssl

秘密鍵を作成.これを使って暗号化して送られてきたデータを複合化します.
RapidSSLの認証書が2048bitなので2048を指定する.

$ cd /etc/pki/tls/private/
$ openssl genrsa -des3 -out keyname.key 2048

秘密鍵からCSRを生成する.
CSRファイルとは,SSL通信に利用する公開鍵暗号系の公開鍵に,コモンネームなどの情報を付加したものです.
これが認証局に提出する署名リクエスト(Certificate Signing Request)となります.

$ openssl req -new -key server.key -out csrname.csr

CSRをRapid-SSL.jpに送信して、証明書発行を申し込む.
そして受け取った認証用ファイルを,申請対象のFQDN(コモンネーム)配下に置くことで
認証局がファイルを確認して証明書を発行します.
(参考)ファイル認証について

メール認証後,サーバ証明書が送られてくるのでCRTファイルとしてサーバにあげます.

# crtファイルを作成してコピー
$ cd /etc/pki/tls/certs/
$ touch crtname.crt
$ vim crtname.crt

サーバ証明書はセキュリティ上の理由等により複数階層による認証を行っているため,
ここから中間CA証明書をダウンロードしてサーバにあげます,

# 中間CA証明書の中身をコピー
$ cd /etc/pki/tls/certs/
$ touch rapidssl-chain.crt
$ vim rapidssl-chain.crt

ここから,バーチャルホストを設定していない場合はssl.confを直接編集します.

ssl.conf
$ vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/pki/tls/certs/crtname.crt
SSLCertificateKeyFile /etc/pki/tls/private/keyname.key
DocumentRoot "/var/www/html"
ServerName www.example.com:443

バーチャルホストを設定している場合はその設定ファイルを編集します.

virtualhost.conf
$ vim /etc/httpd/conf.d/virtualhost.conf
NameVirtualhost *:443
<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /path/to/documentroot

    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/crtname.crt
    SSLCertificateKeyFile /etc/pki/tls/private/keyname.key
    SSLCertificateChainFile /etc/pki/tls/certs/rapidssl-chain.crt

    ErrorLog logs/ssl.error.log
    CustomLog logs/ssl.access.log combined env=!no_log
</VirtualHost>

Apacheのconfigファイルを編集したのでhttpdを再起動.

$ service httpd restart

以上で快適なSSL通信ライフを送れるはず!
あとは,HTTPからHTTPSへのリダイレクトの設定などをするといいかも.