(2015-07-01)
突然ですが、Apache2でSSL(ほんとはTLS)を立ち上げてみます。
モジュールの組み合わせは、 Apache + mod_ssl ということで。mod_sslなので openssl が必要になります。
(2016-06-14追記 本ページの内容は Raspbian wheezy での手順だが、Jessie でも大体同じようにできると思う、おそらく。)
URLは
とでもしてみますか。
まずは、オレオレ証明書でやってみます。
作業はすべてスーパーユーザーで。
参考サイト
ほか、いろいろ。
目次
マシン本体はいつもの Raspberry Pi model B(管理人TK宅の1号機)。
OSもいつもの Raspbian:
# uname -a Linux rasp00 3.18.11+ #781 PREEMPT Tue Apr 21 18:02:18 BST 2015 armv6l GNU/Linux
Apache2、opensslは apt-get でインストールしたもの。
# apache2 -v Server version: Apache/2.2.22 (Debian) Server built: Jan 10 2015 15:51:04 # openssl version OpenSSL 1.0.1e 11 Feb 2013
Apache2の環境構築の内容は本サイト内の Apache+PHP構築 を参照。
基準のディレクトリを
/usr/local/apache2/
として動作するように小細工しています。(「オレオレApache2」(仮称))
このやり方だと、Apache2を再構築(再コンパイル)しなくても、オリジナルとは別の独自のディレクトリ環境でApache2を平行稼働することができるので便利であります。
作業はほぼ、スーパーユーザーで実施します。
Apache2の設定ファイルディレクトリの下に、新たに ssl.key ディレクトリを作成します(まあどこでもいいんですけど)。
# cd /usr/local/apache2/conf # mkdir ssl.key ssl.crt # chmod 700 ssl.key ssl.crt # ls -ld ssl.key ssl.crt drwx------ 2 root root 4096 6月 17 11:33 ssl.key/ drwx------ 2 root root 4096 6月 17 11:33 ssl.crt/
秘密鍵とデジタル証明書の置き場所を分けていますが、このあたりは自由に変更してくださいませ。
以下のコマンドで生成。
パスフレーズはつけていません。パスフレーズをつけると、Apache2 起動時にパスフレーズの入力が要求されてしまいますのでそれを避けるためです。
# cd /usr/local/apache2/conf/ssl.key # RANDFILE=/dev/null openssl genrsa 2048 > server.key # chmod 400 server.key
補足:
WikiPediaによると・・・WikiPedia.ja:証明書署名要求、要するにSSL証明書を発行してもらうために、認証局への申請時に提出するファイル、ということです。
オレオレ証明書ではこのファイルを作成せずにいきなりデジタル証明書を生成することもできるらしいのですが、いずれ正式な証明書を入手することも考え、手順通りに作成してみます。
1つ注意点としては、openssl のオプションとして -sha256 を加えています。
これは、世の中的に、署名アルゴリズムが SHA-1 から SHA-2 へ移行しつつあるため(セキュリティ対策)、それにならって指定しているものです。
# cd /usr/local/apache2/conf/ssl.crt # とりあえずのワークディレクトリ # openssl req -new -key ../ssl.key/server.key -sha256 -out server.csr 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) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Aisorasi Organization Name (eg, company) [Internet Widgits Pty Ltd]:ARMS Corp. Organizational Unit Name (eg, section) []:March Hare Unit Common Name (e.g. server FQDN or YOUR name) []:www.angelcurio.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
まずはオレオレなので、入力内容はいい加減のでっち上げです。
これで、証明書署名要求のファイル server.csr が完成です。
中身を見る方法はこれ。
# openssl req -text -noout -in server.csr Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, ST=Tokyo, L=Aisorasi, O=ARMS Corp., OU=March Hare Unit, CN=www.angelcurio.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) (以下省略)
WikiPedia.ja:公開鍵証明書です。SSL証明書と言ったりもしますかね。
ここでもコマンドラインオプションとして -sha256 が必要です。
また、証明書の有効期限として -days 366 で日数を指定します(この例では作成後366日で期限切れになる)。
# cd /usr/local/apache/conf/ssl.crt # openssl x509 -in server.csr -days 366 -req -signkey ../ssl.key/server.key -sha256 -out server.crt Signature ok subject=/C=JP/ST=Tokyo/L=Aisorasi/O=ARMS Corp./OU=March Hare Unit/CN=www.angelcurio.com Getting Private key
これにてデジタル証明書のファイル server.crt の完成です。
中身を見るには下記を実行します。
# openssl x509 -in server.crt -text
出力内容は割愛します。CSR作成の際に入力した内容や証明書の有効期限、公開鍵などを見ることができます。
期限が切れたら再度上記の手順で *.crt ファイルを再作成します。
その際、Apache2の再起動かリロードが必要になるかもしれません(未確認)。
秘密鍵は再作成する必要は特にありません(やりたい人はどうぞ、と言いたいところですが、セキュリティ的に、定期的に鍵も作成しなおした方がいいのかしら・・・)。
Raspbian == Debian なので、モジュールの有効化は下記の通り。
# /usr/local/apache2/bin/a2enmod-me ssl
こうすることで、/usr/local/apache2/conf/mods-enabled/ の下に、
ssl.load ssl.conf という2つのシンボリックリンクが作成され、Apache2起動時に有効になります。
(ssl.conf は SSLv3禁止するために後ほど修正)。
うちのApache2は Apache+PHP構築 により「My Apache2」化しているので、a2enmod-me は通常 a2enmod という名称ですので、読み替えてください。
ふつーにやるなら下記のようになりますかね。(管理人TKは Debian な環境を持っていないので試してないです、念のため)
# a2enmod ssl
/usr/local/apache2/conf/ディレクトリ下の各種ファイルをいじります。
SSLプロトコルの脆弱性が明らかな昨今、SSLを全面禁止して、TLSのみとします。
ファイル:/usr/local/apache2/conf/mods
変更内容:
72c72 < SSLProtocol all -SSLv2 --- > SSLProtocol all -SSLv2 -SSLv3
雑談:
それにしてもプロトコルとしての「SSL」は使えなくなるというのに名称だけは「SSL」が残る・・・という。
実際WikiPediaではすでに、WikiPedia.ja:Secure_Sockets_Layerへ飛ぶとTLSのページへリダイレクトされるようです(2015-07-01現在)。
SSLで仮想ホストを複数立ち上げる場合にこの設定が必要です。
ファイル:/usr/local/apache2/conf/ports.conf
変更内容:
<IfModule mod_ssl.c>の中に下記を追記します。
NameVirtualHost *:443
ご丁寧に、ports.conf の中にこれに関する説明が(英語で)書いてあります。
デフォルトで用意されているSSLサイト用の設定ファイル default-ssl を変更します。
IPアドレス等でHTTPSアクセスされた場合には、エラーページ等を表示するようにします(いずれ)。
ファイル:/usr/local/apcahe2/conf/sites-available/default-ssl
変更内容:
下記のディレクティブの変更必須。
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
ついでにSSLで仮想ホストを複数立てるために、前述のports.confの変更と同時に、2行目を下記のように変更します。
<VirtualHost _default_:443> → <VirtualHost *:443>
デフォルトにしたいので、ServerName ディレクティブは入れません。
あと、DocumentRoot や <Directory> などは、通常の(仮想)サイトと同じように適当に調整します。
こっちが本命の仮想サイトの設定。 https://www.angelcurio.com でアクセスされた場合の定義をします。
まずは default-ssl を vhost-ssl-angelcurio-selfcert へコピーして、中身を修正します。
ファイル:/usr/local/apache2/conf/sites-available/vhost-ssl-angelcurio-selfcert
変更内容:
下記を追加(ServerAdminディレクティブの下あたり)
ServerName www.angelcurio.com
その他の設定はお好みで。
下記のコマンドを実行し、先ほど修正・作成した設定ファイルを有効化します。
# /usr/local/apache2/bin/a2ensite-me default-ssl # /usr/local/apache2/bin/a2ensite-me vhost-ssl-angelcurio-selfcert
なお、前述の a2enmod-me と同様、上記の a2ensite-me コマンドも、a2ensite へのシンボリックリンクになっています(オレオレApache2)。
再起動はこれ。
# /usr/local/apache2/bin/apache2ctl-me restart
くどいようですが、元のコマンドは /usr/sbin/apache2ctl です(シンボリックリンクのリンク先)。
エラーが出るようであれば、下記で Syntax Check が可能(先にこっちをやっとけという話もある)。
# /usr/local/apache2/bin/apache2ctl-me -t
おまけ
起動すると、error.log に以下のような警告が出力されます。
[Tue Jun 30 21:13:30 2015] [warn] RSA server certificate \ CommonName (CN) `www.angelcurio.com' does NOT match server name!?
おそらく、証明書内に書かれたホスト名と実際のホスト名が違うんでないかい? って言われているんだと思うけど、とりあえずは気にしない、気にしない。
静的IPマスカレード設定にて、外からのポート443へのアクセスがWEBサーバーマシン(192.168.1.20)のポート443へ届くようにします。
(操作等はありがちなので省略)。
ブラウザでアクセスしてみます。
Firefoxで https://www.angelcurio.com/ へアクセスすると、「信頼できない接続」とかいうお馴染みの画面になりますので、ひとまずHTTPSでアクセスできているようです。
次回は、本物のまっとうな認証局で取得した証明書の組み込みに挑戦してみようかな、と思います。
(「その2-正規の認証局編」へ続く)。
おしまい。