■OpenSSLのインストール
個人情報がうるさく言われる現在、SSLで暗号化をかけることはよくあります。ベリサインなどの認証局などで発行される証明書は有料となりますので自分で署名する自己証明書でSSL暗号化をかけてみます。まず必要なモジュールをインストールします。
# yum install mod_ssl # rpm -qa | grep mod_ssl mod_ssl-2.4.6-80.el7.centos.1.x86_64 |
まず最初にopenssl.cnfファイルを編集しサーバ証明書の有効期限に関する設定を行っておきます。
# vi /etc/pki/tls/openssl.cnf <一部抜粋> default_days = 3650 # how long to certify for |
秘密鍵を作成するための乱数ファイルを作成します。下記では/var/log/messagesを指定しています が、/etc/*としてもOKですし何でもOKだと思います。
# cd /etc/pki/tls/ # openssl md5 /var/log/messages* > rand.dat # more rand.dat MD5(/var/log/messages)= 8335a10c5ce431648989ab9824ee286a MD5(/var/log/messages-20180805)= e99a16ac446e255057accc7412a6e995 MD5(/var/log/messages-20180812)= 846299effaab492fd16308f04e28a299 MD5(/var/log/messages-20180819)= a38e2599530c749c4d60fa8ebcef26a9 MD5(/var/log/messages-20180826)= aa81d5d78bf22aea7dcf425475e5612d |
乱数ファイルができましたのでこれを用いて秘密鍵を作成します。
# openssl genrsa -rand rand.dat -des3 2048 > ./private/test.key 321 semi-random bytes loaded Generating RSA private key, 2048 bit long modulus ...........+++ ...........................+++ e is 65537 (0x10001) Enter pass phrase: [パスワード入力] Verifying - Enter pass phrase:[再度パスワード入力] |
上記にて秘密鍵ができましたので、これを用いて証明書発行要求(Certificate Signing Request)を作成します。
# openssl req -new -key ./private/test.key -out ./test.csr Enter pass phrase for /etc/pki/tls/private/test.key:[上で入力したパスワード] 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) [XX]:JP State or Province Name (full name) []:Kagawa Locality Name (eg, city) [Default City]:Takamatsu-shi Organization Name (eg, company) [Default Company Ltd]:Hogehoge Organizational Unit Name (eg, section) []:Tech Common Name (eg, your name or your server's hostname) []:www.unix-power.net Email Address []:webmaster@unix-power.net Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: [何も入力しない] An optional company name []:[何も入力しない] |
上記でCSRが作成されましたので今度はこれを用いて証明書を発行します。有効期限は任意に決めることができますが下の例では10年にしています。
# openssl req -x509 -days 3650 -in test.csr -key private/test.key -out ./test.crt Enter pass phrase for private/test.key:[秘密鍵のパスフレーズを入力] |
これでWebサーバに設定する秘密鍵および証明書が作成されましたのでこれをApacheに組み込みます。編集するファイルは/etc/httpd/conf.d/ssl.confになります。
# vi /etc/httpd/conf.d/ssl.conf # 証明書ファイルの指定 SSLCertificateFile /etc/pki/tls/test.crt # 秘密鍵ファイルの指定 SSLCertificateKeyFile /etc/pki/tls/private/test.key # ベリサインなどを利用する際は下記の中間証明書を設定する必要あり #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt |
あとはapacheを起動すればhttpsが起動しますが、起動の際に秘密鍵のパスフレーズを聞かれます。セキュリティ上の観点からはこのままでも良いのですが都度入力するのが面倒くさい場合は以下のコマンドで外すことも可能です。
# openssl rsa -in private/test.key -out private/test-nopass.key # vi /etc/httpd/conf.d/ssl.conf SSLCertificateKeyFile /etc/pki/tls/private/test-nopass.key |
SSLは通常443番を待ち受けているバーチャルサーバという形で実現されます。このためSSLに対する設定の他、SSLサーバに関する設定が必要となります。以下、デフォルトでインストールされているhttpd.confのSSLに関連する設定ファイルの抜粋です。
# vi /etc/httpd/conf.d/ssl.conf <一部抜粋> <VirtualHost _default_:443> #DocumentRoot "/var/www/html" #ServerName www.example.com:443 ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA SSLCertificateFile /etc/pki/tls/test.crt SSLCertificateKeyFile /etc/pki/tls/private/test-nopass.key #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt <Files ~ "\.(cgi|shtml|phtml|php3?)$"> SSLOptions +StdEnvVars </Files> <Directory "/var/www/cgi-bin"> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-5]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost> |
最近のWebサイトは全てのコンテンツをhttpsでアクセスさせるのが主流となりつつあります。そうさせたい場合はhttpd.confに以下を追記してください。
# vi /etc/httpd/conf/httpd.conf <以下を追記> RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R] |
これでApacheを再起動させるとhttpでアクセスがあっても自動でhttpsにリダイレクトされます。