(2015-07-01)
突然ですが、Apache2でSSL(ほんとはTLS)を立ち上げてみます。
モジュールの組み合わせは、 Apache + mod_ssl ということで。mod_sslなので openssl が必要になります。

(2016-06-14追記 本ページの内容は Raspbian wheezy での手順だが、Jessie でも大体同じようにできると思う、おそらく。)

URLは

https://www.angelcurio.com/

とでもしてみますか。
まずは、オレオレ証明書でやってみます。

作業はすべてスーパーユーザーで。

参考サイト

Apache Module mod_ssl
https://httpd.apache.org/docs/2.4/ja/mod/mod_ssl.html

ほか、いろいろ。

目次

前提条件

マシン本体はいつもの 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

補足:

  • RANDFILE=/dev/null
    opensslは処理に使用した乱数を $HOME/.rnd ファイルへ毎回書き出します。毎度ファイルが更新されるのがうっとおしいので、出力先を /dev/null へ。
  • 鍵の長さは 2048bit
    将来的に正式なSSL証明書を発行するときに備えて。まあそのときに鍵を作成しなおしてもいいんですがね。
  • パスフレーズが必要な場合
    追加のオプションとして -aes128 等をつけます。

証明書署名要求(CSR)

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の再起動かリロードが必要になるかもしれません(未確認)。
秘密鍵は再作成する必要は特にありません(やりたい人はどうぞ、と言いたいところですが、セキュリティ的に、定期的に鍵も作成しなおした方がいいのかしら・・・)。

mod_ssl の有効化

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

Apache2の設定ファイル編集

/usr/local/apache2/conf/ディレクトリ下の各種ファイルをいじります。

ssl.conf(SSLv3を禁止)

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現在)。

ports.conf

SSLで仮想ホストを複数立ち上げる場合にこの設定が必要です。
ファイル:/usr/local/apache2/conf/ports.conf
変更内容:
<IfModule mod_ssl.c>の中に下記を追記します。

NameVirtualHost *:443

ご丁寧に、ports.conf の中にこれに関する説明が(英語で)書いてあります。

default-ssl

デフォルトで用意されている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> などは、通常の(仮想)サイトと同じように適当に調整します。

vhost-ssl-angelcurio-selfcert(新規)

こっちが本命の仮想サイトの設定。 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)。

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-正規の認証局編」へ続く)。

おしまい。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-04-02 (月) 15:44:21 (48d)