apacheでSSLポート番号を変更
インターネット上にデータ取得のためのエンドポイントを作りたかったり、閲覧者を制限したいWebページを生成したい場合、パスワードを設定するのはもちろんですが、接続ポートを変更すれば意図しない接続がログインページまで到達しにくくなります。
そこで今回は、apacheのSSL通信のポートをデフォルトの443から444に変更することにしました。
環境はDebianで、Apacheがインストールはされているものとします。レンタルサーバー等を利用している場合は、サービス側で利用可能なポートに制限があったりしますので、確認の上実施してください。
ファイアウォールの設定
Debianにおいてファイアウォール(iptables)はデフォルトではすべての通信を通過させるようになっています。もし、iptablesを設定方法を知りたい場合は過去の記事を参考にしていただければと思います。
もし設定がされていないままでよければ、以下の設定は不要です。
iptablesで444番ポートへの入りを許可する場合は次のようになります。
さらにIPアドレスの制限も必要なら -sオプションを加えます。特定のサーバーからデータを取得するためのエンドポイントとさせる場合などにはこのような設定になると思います。
Apacheの設定変更
Apacheの設定を変更します。Debianの分割されたApacheの設定ファイルを利用している場合は、次のようにします。
Debian以外か、DebianでもApacheをビルドした場合は、すべてhttpd.confで設定します。その際は、SSLモジュールを有効にして、ポートを構成し、ホストの設定をしてください。
- sslを有効に
sslモジュールとサイトを有効にします。
詳しくはDebaianのApacheの設定ファイルの構成を説明した際の記事をみていただければと思いますが、a2から始まるコマンドを使って、分割された設定ファイルを有効(または無効)にします。
# a2enmod ssl # a2ensite default-ssl
- ports.confの修正
ports.confは /etc/apache2 ディレクトリにあります。
Listenするポートを指定します。80番を使わないなら、コメントアウトしても構いません。その際は合わせて「 a2dissite 000-dafault 」を実行します。 またIPv6での接続については今回は対象外としているので0.0.0.0も指定しています。
IPv6を対象にする場合は、ポート番号の指定だけで問題ありませんが、ファイアウォール等は別途設定する必要があります。
ports.conf
... # Listen 80 <IfModule ssl_module> Listen 0.0.0.0:444 </IfModule> <IfModule mod_gnutls.c> Listen 0.0.0.0:444 </IfModule>
- default-ssl.confの修正
default-ssl.conf は /etc/apache2/sites-avairable ディレクトリにあります。
この設定ファイルは、先ほどa2ensiteで有効にした default-ssl の設定内容を保持しているものです。
SSL設定なので、基本的に秘密鍵と公開鍵(証明書)が必要ですが、ここではプライベートなCAでそれらを構成しました。
opensslを使って証明書を作成します。このあたりについては何度かブログで取り上げているので、コマンドの流れだけ紹介しておきます。
中間CAはなくても動くかもしれません。
CA
# CAの秘密鍵を生成 openssl genrsa -aes256 -out ca.key -passout pass:[CA秘密鍵のパスワード] 2048 # CA用の署名要求を作成 openssl req -subj "/C=JP/ST=Tokyo/O=MyCom/CN=MyCA" -new -key ca.key -out ca.csr -passin pass:[CA秘密鍵のパスワード] # 自己署名 openssl x509 -req -in ca.csr -signkey ca.key -days 730 -out ca.crt -passin pass:[CA秘密鍵のパスワード]
中間CA
# 中間CAの秘密鍵を生成 openssl genrsa -aes256 -out mca.key -passout pass:[中間CA秘密鍵のパスワード] 2048 # 中間CA用の署名要求を作成 openssl req -subj "/C=JP/ST=Tokyo/O=MyCom/CN=MyMCA" -new -key mca.key -out mca.csr -passin pass:[中間CA秘密鍵のパスワード] # 中間CA用のV3オプションファイル生成 echo basicConstraints=CA:TRUE>mca-option.v3 echo subjectKeyIdentifier=hash>>mca-option.v3 echo authorityKeyIdentifier=keyid,issuer>>mca-option.v3 echo keyUsage= keyUsage=cRLSign,keyCertSign>>mca-option.v3 echo subjectAltName=IP:[サーバーのIPアドレス]>>mca-option.v3 # 中間CAの署名要求にCAで署名 openssl x509 -req -in mca.csr -CA ca.crt -CAkey ca.key -days 730 -out mca.crt -extfile mca-option.v3 -CAcreateserial -passin pass:[CA秘密鍵のパスワード]
サーバー
# サーバー秘密鍵作成 openssl genrsa -aes256 -out server.key -passout pass:[サーバー秘密鍵のパスワード] 2048 # サーバー用の署名要求 openssl req -subj "/C=JP/ST=Tokyo/O=MyCom/CN=[サーバーのIPアドレス]" -new -key server.key -out server.csr -passin pass:[サーバー秘密鍵のパスワード] # サーバー証明書V3オプション作成 echo basicConstraints=CA:FALSE>option.v3 echo subjectKeyIdentifier=hash>>option.v3 echo authorityKeyIdentifier=keyid,issuer>>option.v3 echo keyUsage= nonRepudiation, digitalSignature, keyEncipherment>>option.v3 echo subjectAltName=IP:[サーバーのIPアドレス]>>option.v3 # サーバー用の署名要求を中間CAで署名 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -days 730 -out server.crt -passin pass:[中間CA秘密鍵のパスワード] -extfile option.v3 -CAcreateserial # サーバーの秘密鍵はパスワード解除 openssl rsa -in server.key -out server.key -passin pass:[サーバー秘密鍵のパスワード]
バーチャルホスト構成にしておけば、通常の一般公開のサーバーとは別に稼働させることができます。例えば、先ほど80番ポートの設定をそのまま残した場合は、80番のサイトの設定は 000-default.conf に記述されています。その際DocumentRoot のエントリーを別にすることで80番と444番でまったく別のサイトを構成することができます。
default-ssl.conf
... <VirtualHost _default_:444> ServerName [サーバーのIPアドレス] DocumentRoot /var/www/ssl444 SSLEngine On # サーバーの証明書 SSLCertificateFile /path/to/server.crt # サーバーの秘密鍵(パーミッションに注意) SSLCertificateKeyFile /path/to/server.key # 中間CA証明書 SSLCertificateChainFile /path/to/mca.crt # CA証明書 SSLCACertificateFile /path/to/ca.crt </VirtualHost> ...
テスト接続
SSLサーバーが稼働しているかは、通常ブラウザから接続してみて確認すると思います。
たとえばブラウザがGoogle Chromeの場合、表示されるエラーが「 ERR_CONNECTION_REFUSED 」といった接続拒否系のエラーならばファイアウォールを確認してみましょう。
「 SSL Protocol ERROR 」などの証明書関連のエラーの場合。ApacheのSSLの設定が有効になっていないか、証明書が正しく設定されていないかだと思います。SSLモジュールが有効になっているか、証明書のパスに間違いはないか、秘密鍵のアクセス権にも注意しましょう。
サーバーに保存した証明書を確認するには、openSSLを使って確認することができます。
また、openSSLをWebクライアントとしてサイトの証明書を確認する場合は次のようにします。
先のopenSSLのコマンドで「 wrong version number 」がでた場合は、メッセージ通りSSLのバージョンの指定が不正な場合もありますが、そもそも sslが有効になっていない可能性が高いです。
ポートが違っていたり、ファイアウォールで拒否された場合は「 Connection refused 」となります。
正常な場合は、証明書の内容等が返ってきます。
この手法はglobalsignのページを参考にさせていただききました。ありがとうございました。