ここでは不特定多数に公開する WEB サーバーを対象としておりません。独自CA による WEBサイトの暗号化は限られた用途のみに限定する必要があります。
SSLで公開する場合のディレクティブ設定例を挙げます。設定はApache 1.3です。Apache 2 では、SSLに関する設定は別ファイルに分けられています。
SSL専用のディレクティブを指定するには以下のように設定します。もし、httpで接続しようとした場合、ssl_only.html(警告)が表示されるようになっています。
< Directory "/home/taro/public_html/cgi-bin">
SSLRequireSSL
ErrorDocument 403 http://www.cuz.homeip.net/ssl_only.html
省略
</Directory>
このように指定しておけば誤ってhttpで接続することもなくなります。
クライアント認証を行う場合、前ページで指定した
<VirtualHost _default_:443> ~ </VirtualHost>
このタグ内でSSLVerifyClient require を有効にした場合、 SSLCACertificateFile で指定されたCA局が発行した証明書を持つユーザーのみがhttpsに接続可能となります。
ここのディレクティブで設定された内容は https 全体に関する設定を行うので、この場合、httpsの接続要求すべてに対しクライアント認証を求めるようになってしまいます。
つまり自CA局に発行された証明書を持たないユーザーは https接続は出来ないことになります。特定のディレクトリのみにクライアント認証を行い、他のディレクトリには通常のSSL通信を利用させたいのであ れば先程の設定を以下のように変更します。
<VirtualHost _default_:443> ~ < /VirtualHost> 内の SSLVerifyClient をコメントを付けて無効にします。 これで全てのアドレスに対してクライアント証明書の提示は求めなくなります。
#サイト全体では、証明書を求めない
<VirtualHost _default_:443>
# SSLVerifyClient 1 ← コメント
< /VirtualHost>
# クライアント認証を行いたいディレクティブごとに指定する
<Directory "/home/fml/public_html/cgi-bin">
SSLRequireSSL
SSLVerifyClient require
SSLVerifyClient 1
ErrorDocument 403 http://www.cuz.homeip.net/ssl_only.html
省略
</Directory>
このように、公開するディレクティブに直接認証方式を指定することで特定のディレクトリにクライアント認証を限定する事が可能です。httpd.confの設定では、この設定に限らず、最終的に
<Directory "/home/"> ~ </Directory>
タグ内で指定された内容が最優先されます。Directoryタグで指定されていない場合、タグ外で指定される内容が適用されます。
これまでの設定では自CAにより発行された証明書を持つユーザーであれば接続可能となります。クライアント認証といっても、証明書発行元による制限です。
特定の証明書によりアクセス制限を行いたい場合は、従来の.htaccessによるディレクトリ認証にクライアント証明書を組み合わせます。
まずディレクティブでFakeBasicAuthを有効にし、特定の証明書による認証機能を有効にします。
<Directory "/home/fml/public_html/cgi-bin">
SSLRequireSSL
SSLVerifyClient require
SSLVerifyClient 1
SSLOptions +FakeBasicAuth
ErrorDocument 403 http://www.cuz.homeip.net/ssl_only.html
省略
</Directory>
次にディレクトリ認証を行いたいディレクトリへ移動し、(例では/home/fml/public_html/cgi-bin) htpasswdコマンドでディレクトリ認証アカウントを作成します。
ここでは分かりやすくするために同じディレクトリでパスワードファイルを作成していますが、パスワードファイルの場所は必ず外部からアクセスできないディレクトリに設置してください。
.htpasswdはパスワードファイル名、user_nameは適当にします。暗号化されたパスワードファイルが生成されるので、適当なエディタで開きます。以下のようになっていると思います。
user_name:cLaeS1sRAc8
クライアントに提示を求める証明書(web_korogi_cert.pem)に記載されている
Subjectのカンマ " , " をスラッシュ"/ "に変更した内容を先ほどの .htpasswdのユーザーとして指定します。 1行です
/C=JP/ST=Nagoya/O=Creative.Unit.ZERO/OU=puripuri
/CN=www.cuz.homeip.net
/Email=my@mydomain.net:1EsGeOalc67JI:cLaeS1sRAc8
同じく認証を行いたいディレクトリに以下の .htaccess を作成しパスワードファイルを指定します。
AuthUserFile /上記パスワードファイルのパス/.htpasswd
AuthName "Please Your ID Passwd"
AuthType Basic
<Limit GET>
require valid-user
</Limit>
実際のところ、特定の証明書で認証を行うといっても、証明書の違いを判断しているのはこの部分だけであり、SSLVerifyClient requireが指定されていない、0に設定されていれば、外部のCAで作られた証明書でアクセスが可能となってしまいます。本稿での運用ポリシーにはメリットはありません。