9.1. Webサーバの設定(Apache)
9.1.1. Apache
Apache(Apache HTTP Server)はOSSのWEBサーバの1つ。
Apacheの2.0系ではMPMへの対応やIPv6への対応が行われた。
また、2.2系ではキャッシュの改善や負荷分散機能の追加などが行われた。
MPM(Multi Processing Module):MPMにはprefork, worker, perchild, eventがある。
- preforkは1.3系と同じマルチプロセスモデルでリクエストごとにプロセスを割り当てる
- workerはスレッド対応モデルでクライアントのリクエストを子プロセスで処理し、処理増大で子プロセスを増やす
- perchildはバーチャルホスト向けのスレッド対応で子プロセスを固定し負荷に応じてスレッドを増減する
- eventはworkerと似た機能であるがkeepaliveの処理が異なる
なおCentOS7系の場合はApacheのMPMはpreforkとなる。
Apacheのインストール方法
Apacheのインストール方法は2通り。
- ディストリビューションごとのパッケージを利用する方法- RedHat系: yum install httpd
- Debian系: apt-get install apache2
 
- RedHat系: 
- ソースからコンパイルして使用する方法- configure
- make
- make install
 
またconfigureの役立つオプションは以下の通り。
| オプション | 説明 | 
|---|---|
| –prefix=ディレクトリ | インストール先のディレクトリ | 
| –sysconfdir=ディレクトリ | 設定ファイルのディレクトリ | 
| –enable-module=モジュール | 標準モジュールの組み込む | 
| –disable-module=モジュール | 標準モジュールを組み込まない | 
| –enable-shared=モジュール | 標準モジュールをDSOで組み込む | 
| –diable-shared=モジュール | 標準モジュールをDSOで組み込まない | 
使用例は以下の通り。
# インストールディレクトリの指定とsshモジュールの有効化
./configure --prefix=/usr/local/apache --enable-module=ssl9.1.2. Apacheの基本設定
Apacheのメイン設定ファイルはhttpd.confとなる。
Apacheの主な設定ファイルのディレクトリは以下の通り。
ソースからインストールした場合
| ファイル/ディレクトリ | 説明 | 
|---|---|
| /usr/local/apache2/conf/httpd.conf | メインの設定ファイル | 
| /usr/local/apache2/conf/extra | 補助の設定ファイルを保存するディレクトリ | 
| httpd-language.conf | 言語/文字コードの設定 | 
| httpd-userdir.conf | 一般ユーザのホームディレクトリ設定 | 
| httpd-info.conf | server-info, server-statusの設定 | 
| httpd-vhosts.conf | バーチャルホストの指定 | 
| httpd-default.conf | デフォルトのサーバ全般設定 | 
| httpd-ssl.conf | SSL/TLSの設定 | 
Red Hat系でインストールした場合
| ファイル/ディレクトリ | 説明 | 
|---|---|
| /etc/httpd/conf/httpd.conf | メインの設定ファイル | 
| /etc/httpd/conf.d/ | 補助の設定ファイルを保存するディレクトリ | 
| ssl.conf | SSL/TLS設定ファイル | 
| php.conf | PHPモジュールの設定 | 
| perl.conf | Perlモジュールの設定 | 
Debian系でインストールした場合
| ファイル/ディレクトリ | 説明 | 
|---|---|
| /etc/apache2/apache2.conf | メインの設定ファイル | 
| /etc/apache2/ | 補助の設定ファイルを保存するディレクトリ | 
| /etc/apache2/ports.conf | ポートの設定 | 
| /etc/apache2/sites-enabled/ | サイト定義ファイルのリンク | 
| /etc/apache2/sites-avaiable/ | サイト定義ファイル | 
httpd.confの設定項目
httpd.confの設定項目はディレクティブと呼ばれ以下のように設定する。
ディレクティブ名 設定値また適用範囲は以下のように指定できる。
<Files ファイル名> ... </Files>
<Directory ディレクトリ名> ... </Directory>
<Location URL> ... </Location>大まかな設定項目は以下の通り。
# Apacheの設定ファイル/ログファイルの起点となるトップディレクトリ
ServerRoot "/usr/local/apache2"
# 待ち受けポート
Listen 80
# ロードモジュール
LoadModule authn_file_module modules/mod_authn_file.so
# 実行ユーザと実行グループ
User apache
Group apache
# バージョン情報の出力設定
ServerSignature On
ServerTokens Full
# 管理者のメールアドレス
ServerAdmin root@localhost
# Webサーバーとして公開するホスト名を指定
# ホスト名は FQDN(Fully Qualified Domain Name) で記述
ServerName www.example.com:80
# /ディレクトリ以下の設定
<Directory />
    # AllowOverride は 上位のディレクトリ(この場合は/(root)ディレクトリ)でした設定を下位のディレクトリで設定を上書きできるかどうか(オーバーライドできるかどうか)を設定。none → 下位での変更が無効。all → 下位での変更が有効。
    AllowOverride none
    # アクセス制限に関する設定。デフォルトではすべて拒否する設定になっている。
    Require all denied
</Directory>
# ドキュメントルート(DocumentRoot)は、Webサーバーのトップディレクトリ
DocumentRoot "/var/www/html"
# ドキュメントルート以下の設定
<Directory "/var/www/html">
    # シンボリックリンクをたどれるようにする
    Options Indexes FollowSymLinks
    AllowOverride None
    # /var/wwwディレクト配下へのアクセスは全員が可能(Webサイトを閲覧することができる)
    Require all granted
</Directory>
# dirモジュールが有効時にディレクトインデックスの指定
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
# ディレクトリに「.htaccess」ファイルや「.htpasswd」ファイルがあった場合、ユーザーに表示するかどうかを設定
<Files ".ht*">
    Require all denied
</Files>
# エラーログの場所を指定
ErrorLog "logs/error_log"
# ログレベルの指定
LogLevel warn
# emerg:緊急、システムが利用できないレベル
# alert:今すぐに対処が必要なレベル
# crit:致命的な状態
# error:エラーレベル
# warn:(デフォルト) 警告レベル
# notice:注意すべき重要な情報
# info:一般的な情報
# debug:デバッグレベル
<IfModule log_config_module>
    # ログのフォーマットを指定。ログフォーマットのニックネームを「combined」と名付ける。
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    # ログのフォーマットを指定。ログフォーマットのニックネームを「common」と名付ける。
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    # カスタムログの場所とフォーマットを指定。フォーマットは、ニックネーム「combined」の形式にする。
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
    # 【例】http://sample.ne.jpの場合、「/var/www/cgi-bin/」ディレクトリを「http://sample.ne.jp/cgi-bin」に割り当てます。つまりどのディレクトリを「cgi-bin」に割り当てるのか設定する。エイリアス定義
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
# cgi-binディレクトリの動作について設定
<Directory "/var/www/cgi-bin">
    AllowOverride None
    # オプションは何もなし
    Options None
    # 全員がアクセス可能
    Require all granted
</Directory>
# エラーとエラーページの設定
ErrorDocument 500 "The Server mode a boo boo."
ErrorDocument 404 /missing.html
# 他の設定ファイルの読み込み
IncludeOptional conf.d/*.con9.1.3. httpd.confの主要な設定
ServerTokens Prod|Major|Minor|MinOS|Full
HTTPヘッダ内に出力されるバージョン情報(バナー情報)を指定する。
クライアントに返信する応答ヘッダにどのような情報を含めるかということを決めれる。
セキュリティの関係で通常は「Prod」で良い。
ServerTokens Prod|Major|Minor|MinOS|Full| 設定値 | 出力 | 
|---|---|
| Prod | Server: Apache | 
| Major | Server: Apache/2 | 
| Minor | Server: Apache/2.4 | 
| MinOS | Server: Apache/2.4 (CentOS) | 
| Full | Server: Apache/2.4 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 | 
ServerRoot パス
httpdが利用するトップディレクトの指定。 設定ファイルなどを格納する。
ServerRoot パスServerName サーバのホスト名
ホスト名の指定。
ServerName サーバのホスト名ServerAdmin メールアドレス
サーバ管理者のメールアドレスを指定。
ServerAdmin メールアドレスServerSignature on|off
エラーメッセージなどのフッタ表示の有効無効化を指定。
ServerSignature on|offTraceEnable on|off
TRACEメソッドの使用の有無の指定。
TracerEnable on|offプロセス系の設定項目
Apacheでは複数のプロセスが処理を分担する。
仕組みとしては以下の通り。
- 親プロセスがクライアントからの接続を待ち受ける
- 個々のクライアントの対応は子プロセスが処理する
なお、待機している子プロセス数よりもクライアント数が多くなれば、子プロセス数を新たに不足分起動するのでレスポンスが低下する。
また待機している子プロセス数が多いほどメモリの使用量は多くなる。
# 起動時の子プロセス数の数
StartServers 子プロセス数
# 待機子プロセスの最小数
MinSpareServers 子プロセス数
# 待機子プロセスの最大数
MaxSpareServers 子プロセス数
# 生成される子プロセスの上限の指定
ServerLimits 子プロセス数
# 最大同時接続数の指定
MaxClients 同時接続数
MaxRequireWorkers 同時接続数
# クライアント接続がタイムアウトになる時間を秒数指定
Timeout タイムアウト時間
# KeepAlive(TCP接続のキープ)の設定(パフォーマンス向上が見込める)
KeepAlive on | off
KeepAliveRequires 上限リクエスト数
KeepAliveTimeout タイムアウト時間Listen [IPアドレス:]ポート番号
待ち受けポート番号の指定。
Listen :80User/group
httpd子プロセスの実行ユーザと実行グループの指定。
User ユーザ名
Group グループ名DocumentRoot ディレクトリ
ドキュメントルートとなるディレクトリの指定
DocumentRoot ディレクトリUsrDir 公開ディレクトリ|disabled
一般ユーザの公開ディレクトリの指定。
UsrDir 公開ディレクトリ|disabledDirectoryIndex インデックスファイル
ディレクトリのインデックスとして返すファイル名の指定。
DirectoryIndex インデックスファイルErrorLog ログファイルのパス
エラーログを記録するログファイルの指定。
ErrorLog ログファイルのパスLoglevel ログレベル
エラーログのログレベルの指定。
Loglevel ログレベルLogFormat “フォーマット” 書式名
ログを記録する項目と書式名を指定する。
LogFormat "フォーマット" 書式名フォーマット文字列は以下の通り。
| フォーマット文字列 | 説明 | 
|---|---|
| %a | リモート IP アドレス | 
| %A | ローカル IP アドレス | 
| %B | レスポンスのバイト数。HTTP ヘッダは除く。 | 
| %b | レスポンスのバイト数。HTTP ヘッダは除く。CLF 書式。 すなわち、1 バイトも送られなかったときは 0 ではなく、 ‘-’ になる | 
| %f | ファイル名 | 
| %h | リモートホスト | 
| %H | リクエストプロトコル | 
| %l | リモートログ名。 これは mod_ident がサーバに存在して、 IdentityCheck ディレクティブが On に設定されていない限り、 - になる。 | 
| %m | リクエストメソッド | 
| %r | リクエストの最初の行 | 
| %t | リクエストを受付けた時刻。 CLF の時刻の書式 (標準の英語の書式) | 
| %T | リクエストを扱うのにかかった時間、秒単位 | 
| %u | リモートユーザ (認証によるもの。ステータス (%s) が 401 のときは意味がないものである可能性がある) | 
| %U | リクエストされた URL パス。クエリ文字列は含まない | 
| %>s | サーバがクライアントに返すステータスコード | 
| %{Referer}i | リクエスト内のrefererヘッダの内容 | 
| %{User-agent}i | リクエスト内のUserAgentヘッダの内容 | 
Custom ログファイル名 ログ書式名
出力するログの指定を行う。
CustomLog logs/access_log combinedHostnameLookups on|off
DNSの逆引きを行いアクセス元IPアドレスからホスト名を取得する
ログにホスト名やホスト名でアクセス制御を行う場合に使用する。
HostnameLookups on|offAlias ディレクトリ パス
ドキュメントルートツリー以外の参照できるようにする際に使用する。
# /var/www/html/imagesではなく/home/www/imagesを参照できるようにする
Alias /images /home/www/imagesRedirect ディレクトリ|ファイル 転送先URL
指定したURLにリダイレクトを行う
Redirect ディレクトリ|ファイル 転送先URLScriptAlias ディレクトリ CGI格納ディレクトリ
CGIスクリプト用ディレクトリを指定する。
ScriptAlias /cgi-bin/ /var/www/cgi-bin/ErrorDocument エラーコード ファイル|ディレクトリ
エラーが発生した際の処理をエラーコードに続けて指定する。
ErrorDocument 404 /error.htmlOptions オプション
ディレクトリごとにオプションを指定できる。
| オプション | 説明 | 
|---|---|
| All | MultiViews 以外のすべての機能を有効にする(デフォルト) | 
| None | すべての機能を無効にする | 
| ExecCGI | CGI スクリプトの実行を許可する | 
| FollowSymLinks | シンボリックリンクをたどることを許可する | 
| Includes | SSI を有効にする | 
| Indexes | ファイル一覧の表示を行う | 
| MultiViews | コンテントネゴシエーションを有効にする | 
9.1.4. 外部設定のファイル
httpd.conf以外に設定ファイルを記述し、httpd.confを上書きして設定することもできる。
外部設定のファイル名はhttpd.confのAccsessFileNameディレクティブで指定できる。
AccsessFileName
外部設定のファイルを指定できる。
AccsessFileName .htaccessAllowOverride パラメータ
AllowOverrideディレクティブは外部ファイルの利用許可ができる。
複数パラメータの指定。
Directoryセクションで指定できる。
AllowOverride パラメータ| パラメータ | 説明 | 
|---|---|
| AuthConfig | 認証に関する設定を有効にする | 
| indexes | DirectoryIndexなどの設定の有効にする | 
| FileInfo | ファイルタイプの制御設定を有効にする | 
| Limit | Order, Allow, Denyによる設定を有効にする | 
| Options | Opitionsの設定を有効にする | 
| None | .htaccessでの変更を無効にする | 
| All | .htaccsessで変更可能なすべての設定を有効にする | 
9.1.5. Apacheの制御
Apacheの起動方法は以下の通り。
# SysVinitを採用したシステムでのApacheの起動
/etc/init.d/httpd start
# Systemdを採用したシステムでのApacheの起動
systemctl start httpd.conf
# Ubuntuの場合
systemctl start apache2.service
# Apachectlによる起動
apachectl startapachectlコマンド
apacheの操作/情報参照できるコマンド。
apachectl サブコマンド| サブコマンド | 説明 | 
|---|---|
| start | Apacheを起動 | 
| stop | Apacheの終了 | 
| restart | Apacheの再起動 | 
| graceful | Apacheを安全に再起動 | 
| reload | 設定ファイルの再読み込み | 
| configtest | 設定ファイルの構文チェック | 
9.1.6. モジュールの使用
Apacheではモジュールによって様々な機能を提供できる。
機能追加などもApacheのインストールのし直しの必要はなく、モジュールのロード/アンロードで行える。
Apacheの主要なモジュールは以下の通り。
| モジュール名 | 説明 | 
|---|---|
| mod_accsess_compat | ホストベースのアクセス制御 | 
| mod_authz_host | ホストベースのアクセス制御(Requireディレクティブ) | 
| mod_authz_user | ユーザベースのアクセス制御(Requireディレクティブ) | 
| mod_auth_basic | 基本認証 | 
| mod_auth_digest | Digest認証 | 
| mod_authn_file | .htaccsessファイルによるユーザ認証 | 
| mod_alias | エイリアス機能の利用 | 
| mod_cgi | CGIスクリプトの実行 | 
| mod_dir | ディレクティブのインデックス実行 | 
| mod_info | サーバの設定情報表示 | 
| mod_log_config | リクエストログの生成 | 
| mod_mime | 拡張子に応じたファイルタイプの指定 | 
| mod_negotiation | クライアントごとの自動判別機能の提供 | 
| mod_perl | Perlの利用 | 
| mod_php | PHP5の利用 | 
| mod_proxy | プロキシ機能 | 
| mod_so | モジュールを読み込むDSO機能の提供 | 
| mod_ssl | SSL/TLS機能の利用 | 
| mod_status | サーバステータスの表示 | 
| mod_unixd | 実行ユーザ/グループのChroot機能 | 
| mod_userdir | ユーザディレクリの公開 | 
| mod_version | バージョン依存の設定 | 
モジュールは/usr/lib/httpd/modulesなどにインストールされ、LoadModuleディレクティブで読み込む。
LoadModule perl_module modules/mod_perl.soまたApacheのインストール後にモジュールを読み込むには以下のように実施する方法もある。
- aspxコマンドによるコンパイル
- httpd.confに- LoadModulesディレクティブを追加
aspxコマンド
Apacheのインストール後にモジュールをDSOとしてインストールするコマンド。
sudo aspx -i -a -c mod_foofoo.chttpdコマンド
組み込み済みのモジュールの確認や一覧の表示を行えるコマンド。
# 組み込み済みモジュールの確認
httpd -l
# Debian/Ubuntuの場合
apache2 -l
# 組み込みモジュール/DSOモジュールの一覧表示と設定ファイルの文法チェック
httpd -MまたDebian/Ubuntuの場合はa2enmodコマンドにより対話的にモジュールを有効化できる。
9.1.7. クライアントのアクセス認証
指定したディレクトリにアクセスするときにユーザ/パスワードがないときにアクセス制限をかけることができる。
認証にはBasic認証とDigest認証を使うことができる。
Basic認証
Basic認証の実装手順はhttpd.confにユーザ認証設定を実装することで可能。
なおBasic認証では平文で認証情報が流れる。
設定例は以下の通り。
<Directory "/var/www/html/private">
 # 認証タイプの指定
 AuthType Basic
 # 認証ダイアログのメッセージ
 AuthName "Please Enter Your ID and PassWord!"
 # パスワードファイル名
 AuthUserFile /etc/httpd/conf/passwd
 # AuthGroupFile
 # アクセス可能なユーザ(user ユーザ または valid-user)
 Require valid-user
</Directory>valid-userにすると、パスワードファイルにエントリあるすべてのユーザがアクセスが許可される。
認証に用いるユーザ名とパスワードの設定はhtpasswdコマンドを用いる。
htpasswd [オプション] ファイル名 ユーザ名| オプション | 説明 | 
|---|---|
| -c | パスワードファイルを新規に作成 | 
| -m | MD5で暗号化する | 
| -s | SHA1で暗号化する | 
| -D | ユーザを削除する | 
注意点としてドキュメントルート以下のブラウザからアクセスできる場所にパスワードファイルを設置する際にアクセスできないようにする必要がある。
Digest認証
Digest認証ではチャレンジ/レスポンス形式で認証を行うので認証情報が盗聴されてもパスワードがすぐに漏洩しない特徴がある。
設定は以下の通り。
Digest認証ではAuthNameでは認証領域を指定する。
<Directory "/var/www/html/private">
 # 認証タイプの指定
 AuthType Digest
 # ユーザ認証の領域を指定
 AuthName "private"
 # パスワードファイル名
 AuthUserFile /etc/httpd/conf/passwd
 # AuthGroupFile
 # アクセス可能なユーザ(user ユーザ または valid-user)
 Require valid-user
</Directory>認証に用いるユーザ名とパスワードの設定はhtdigestコマンドを用いる。
htdigest [オプション] ファイル名 領域 ユーザ名| オプション | 説明 | 
|---|---|
| -c | パスワードファイルを新規に作成 | 
ホストベースのアクセス認証
order, Allow,DenyディレクティブによりIPアドレス/ホスト名によるアクセス制御ができる。
なおこの制御の使用は非推奨になっているため、Requireディレクティブを代用が推奨されている。
# Allow Denyの評価順の指定
Order allow | Deny, allow | Den
# 接続許可するホストの指定
Allow from IPアドレス | ホスト名/ドメイン名
# 接続を許可しないホストの指定
Deny from IPアドレス | ホスト名/ドメイン名なお現在推奨であるRequireディレクティブを使用する場合の書式は以下の通り。
Require エンティティ 値指定するエンティティ例は以下の通り。
| エンティティ | 説明 | 
|---|---|
| ip IPアドレス | IPアドレス | 
| ip 192.168 172.16 | 192.168.0.0/24, 172.16.0.0/24のみ | 
| host ドメイン名 | ドメイン名のホストのみ | 
| group admin | adminグループのみ | 
| all granted | すべてのホストを許可 | 
| all denied | すべてのホストを拒否 | 
| local | ローカルホストのみ | 
また以下のディレクティブを使用して複数条件の指定も可能
| ディレクティブ | 説明 | 
|---|---|
| RequireAll | すべての条件にマッチで真 | 
| RequireAny | 1つ以上の条件にマッチで真 | 
| RequireNone | いずれにマッチしなければ真 | 
またApache2.4以降ではorder, Allow,Denyディレクティブを使用する方法ではなく、Requireディレクティブを使用する形が推奨されている。
| 設定 | Order Deny,Allow | Order Allow,Deny | 
|---|---|---|
| デフォルト | 全て許可 | すべて拒否 | 
| 一部のアクセスのみ許可 | Order Deny,Allow Deny from all Allow from IPアドレス/ホスト名 | Order Allow,Deny Allow from all Deny from IPアドレス/ホスト名 | 
| 一部のアクセスのみ拒否 | Order Deny,Allow Deny from IPアドレス/ホスト名 | Order Allow.Deny Allow from IPアドレス/ホスト名 | 
| すべて許可 | Order Deny,Allow | Order Allow,Deny Allow from all | 
| すべて拒否 | Order Deny,Allow Deny from all | Order Allow,Deny | 
またアクセス制御をLimit、LimitExceptディレクティブ内に設定して、特定のHTTPメソッドに適用することもできる。
<Limit DELETE POST PUT>
    Require vaild-user
</limit>
<LimitExcept DELETE POST PUT>
    Require All Deny
</limitExcept>9.1.8. バーチャルホスト
バーチャルホストは1台のサーバで複数のWebサイトを管理する機能のこと。
バーチャルホストには以下の2種類がある。
- 名前ベースバーチャルホスト … 1台のホストに1つのIPと複数のドメイン名を指定する方法
- IPベースバーチャルホスト … 1台のホストに複数のIPアドレスと複数のドメインを指定する方法
名前ベースのバーチャルホスト
設定例は以下の通り。
下記設定の上でDNSを適切に設定するとWebサイトを複数1つのホストで運用できる。
NameVirtualHost *:80
<VirtualHost *:80>
    ServiceName web.hogehoge.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost *:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/test
</VirtualHost>IPベースのバーチャルホスト
設定例は以下の通り。
Listen 192.168.1.10:80
Listen 192.168.1.11:80
<VirtualHost 192.168.1.10:80>
    ServiceName web.hogehoge.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost 192.168.1.11:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/test
</VirtualHost>9.1.9. SSL/TLS
SSL/TLSは公開鍵暗号を使用したTCP/IPのアプリケーション層のセキュリティ技術。
SSL/TLSによりWebブラウザとサーバ間の通信を暗号化できセキュアな通信を実現できる。
認証には認証局により発行されたサーバ証明書によりサイトの正当性を保証し、セキュリティを担保する。
Apacheではmod_sslによりサイトをSSL化することができる。
SSLを利用してWebサーバの運用は以下の手順でサイト証明書を認証局から入手する。
- 公開鍵/暗号鍵の作成
- 作成した公開鍵を認証局(CA)へ送信する
- CAにて証明書を発行して受け取る
- 証明書をWebサーバにインストールする
自己署名証明書(オレオレ認証)
自己署名証明書はSSL接続をテストする為や、限られた利用者のみが使用するWEBサーバなどを構築する際に設定する。
作成手順は以下の通り。
- 秘密鍵(key.pem)と自己署名証明書(cacert.pem)の作成
- サーバ秘密鍵の作成(鍵名.key)
- 証明書発行要求書(CSR)の作成
- 証明書発行要求ファイルに対しCAが認証を行いサーバ証明書(.crt)の作成
自己署名証明書の作成例は以下の通り。
なおCA.sh -newcaやCA.pl -newca(OpenSSL1.1.0以降)も使用可能。
# 秘密鍵と自己署名証明書の作成
./CA -newca
# パスフレーズを入力
# パスフレーズの再入力
# 国コードの入力
# 都道府県名
# 市町村名
# 会社名
# 部署名
# ホストのFDQN
# 管理者メールアドレス
# パスフレーズの入力# サーバ秘密鍵の作成
openssl genrsa -out server.key 2048# 証明書発行要求書(CSR)の作成
openssl req -new -key server.key -out server.csr# サーバ証明書(.crt)の作成
openssl ca -out server.crt -infiles /etc/pki/ca/server.csrSSL関連ファイル
| ファイル | 説明 | 
|---|---|
| .key | サーバ秘密鍵 | 
| .csr | 証明書発行要求書 | 
| .crt | サーバ証明書 | 
またSSL設定(httpd.conf)例は以下の通り。
なおSSLには443ポートを使用するので注意する。
SSLEngine On
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateFile [.crtのパス]
SSLCertificateKeyFile [.keyのパス]SSL/TLSの主要ディレクティブ
ssl.confの主要なディレクティブは以下の通り。
| ディレクティブ | 説明 | 
|---|---|
| SSLEngine | SSL/TLSの有効無効 | 
| SSLProtocol | all,SSLv2, SSLv3, TLSv1, TLSv1.1 , TLSv1.2がある。 -で無効化、+で有効化 | 
| SSLCipherSuite | 使用する暗号化アルゴリズムのリスト | 
| SSLCertificateFile | サーバ証明書ファイル | 
| SSLCertificateKeyFile | サーバ秘密鍵のファイル | 
| SSLCerificateChainFile | 中間CA証明書ファイル | 
| SSLCACertificateFile | クライアント証明書発行のCA証明書ファイル | 
| SSLCAcertificatePath | クライアント証明書発行のCA証明書ディレクトリ | 
| SSLVerifyClient | クライアント認証レベル(none, optional, opitional_no_ca, require) | 
SNI
SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み。
名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。
この機能により、複数独自ドメインを利用するサーバにて複数のSSL/TLS証明書を使用することが可能になった。 特徴は以下の通り。
- IPベースのVirtualHostであれば、クライアントに依存せずにSSLを使える
- 名前ベースのVirtualHostの場合、クライアントがSNIに対応していればSSLを使用できる
SNIでは、SSLセッションのハンドシェイク(SSL接続)のタイミングでクライアント側から接続したいホスト名を提示する。これによりサーバは、クライアントが提示したホスト名を確認して適切な証明書を返すことができる。
なお、SNIはサーバだけでなくクライアント側(ブラウザ)も対応している必要がある。