Server ≫ Linux Server ≫ Fedora Core 4 ≫ SSLによる暗号化通信

 
これまでのApacheの設定だけではデータはインターネット上にそのまま平分として流れていきます。ログイン画面等でパスワード等を入力する際この平分のままではインターネット上に悪意のあるユーザーがいた場合、そのパスワード等を盗み見て悪用してしまう可能性があります。

そこで、暗号化通信を行うSSL(Sekure Sockets Layer)ソフト『mod_ssl』をインストールします。

mod_ssl のインストール
 

デスクトップ上で右クリックをしてメニューを表示させ“端末を開く(E)”をクリックします。この操作には root 権限が必要になりますので user でログインしている場合は su コマンドで root になって下さい。

下図のように yum install mod_ssl と入力して Enter キーを押します。

ダウンロードが開始されます。

ダウンロードが終了しインストールして良いか聞かれますので “ y ” を入力して “ Enter ” キーを押します。

インストールが開始されます。

“ complete! ” と表示されればインストールの完了です。

セキュリティレベルの設定
 

デスクトップ上部にあるメニューバーより“デスクトップ”⇒“システム設定”⇒“セキュリティレベル”を選択して“セキュリティレベルの設定”を起動します。

“セキュリティレベルの設定”が起動したら下図のように『Secure WWW (HTTPS)』の前のチェックボックスにチェックを入れ『OK(O)』をクリックします。

下図のように警告画面が表示されますが『はい(Y)』をクリックします。

これでセキュリティレベルの設定は終了です。

認証キーの作成
  SSL通信の正当性を認証してくれる公の正規認証局から発行される証明書をWebサーバに置いておくことが必要になります。

しかし、正規認証局にサーバを認証してもらうには認証局と契約をしなければなりません。また費用もかなり掛かります。そこで自分で認証し証明書を発行ます。ただし、自己認証ですので何らの補償はありません。

サーバー用認証キーを作成します。最初に認証キー用ディレクトリがFedoraでは無いので作成します。

デスクトップ上で右クリックをしてメニューを表示させ“端末を開く(E)”をクリックします。この操作には root 権限が必要になりますので user でログインしている場合は su コマンドで root になって下さい。

下図のように mkdir /etc/httpd/conf/ssl.key/ と入力して Enter キーを押します。

これで認証キー用ディレクトリが作成されました。

続いて今作ったディレクトリに移動します。下図のように cd /etc/httpd/conf/ssl.key/ と入力して Enter キーを押します。

次にサーバー用認証キーを作成します。下図のように openssl genrsa -des3 1024 > server.key と入力して Enter キーを押します。

認証キー用のパスワードの入力を求められますのでパスワードを入力します。(実際にはパスワードは表示されません)

再度、認証キー用のパスワードの入力を求められますのでパスワードを入力します。(実際にはパスワードは表示されません)

このままではWebサーバー起動時にパスワードを求められるのでWebサーバー起動時にパスワードを要求されないようにするためサーバー用認証キーからパスワードを削除します。

下図のように openssl rsa -in server.key -out server.key と入力して Enter キーを押します。

認証キー用のパスワードの入力を求められますのでパスワードを入力します。(実際にはパスワードは表示されません)

これでWebサーバー起動時にパスワードを要求されないようになりました。

自己認証書の作成です。下図のように openssl req -new -key server.key -out server.csr と入力して Enter キーを押します。

まず国名の入力です。

jp(日本)を入力。

都道府県の入力です。

tokyo(東京都)を入力。

市区町村の入力です。

chiyoda(千代田区)を入力。

サーバ名の入力です。

Webサーバーのサーバー名を入力。

部署の入力です。

個人運営のサーバーなので何も入力しないで Enter を押します。

続いてホスト名の入力です。

ホスト名(ドメイン名)を入力。

サーバー管理者のメールアドレスの入力です。

サーバー管理者のメールアドレスの入力。

パスワードの入力です。

パスワードを使用しないので何も入力しないで Enter を押します。

続いて会社名の入力です。

個人運営のサーバーなので何も入力しないで Enter を押します。

続いてサーバー用証明書の作成です。

下図のように openssl x509 -in server.csr -out server.crt -reg -signkey server.key と入力して Enter キーを押します。

下図では2行になっていますが1行で入力して下さい。

下図のようなメッセージが表示されればOKです。

続いてrootのみ参照できるようにパーミッションを変更します。

下図のように chmod 400 /etc/httpd/conf/ssl.key/server と入力して Enter キーを押します。

以上で終了です。

SSL の設定
 

mod_ssl の設定は root 権限がないとできませんのであらかじめ root でログインしておいて下さい。

デスクトップ上部にあるメニューバーより“アプリケーション”⇒“アクセサリー”⇒“GNOMEテキスト・エディタ”を選択して“gedit”を起動します。

“gedit”が起動したら、面メニューバーより“ファイル(E)”⇒“開く(O)”を選択して /etc/httpd/conf.d/ にある ssl.conf を開きます。

下図のような画面が表示されます。

これが mod_ssl の設定ファイルです。

下記に mod_ssl の設定ファイルの全文を掲載します。緑色の部分を青色に変更(書き換え・削除)して下さい。赤文字は説明です。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

#
# This is the Apache server configuration file providing SSL support.
# It contains the configuration directives to instruct the server how to
# serve pages over an https connection. For detailing information about these
# directives see <URL:http://httpd.apache.org/docs-2.0/mod/mod_ssl.html>
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#

LoadModule ssl_module modules/mod_ssl.so

# Until documentation is completed, please check http://www.modssl.org/
# for additional config examples and module docmentation. Directives
# and features of mod_ssl are largely unchanged from the mod_ssl project
# for Apache 1.3.

#
# When we also provide SSL we have to listen to the
# standard HTTP port (see above) and to the HTTPS port
#
Listen 443

##
## SSL Global Context
##
## All SSL configuration in this context applies both to
## the main server and all SSL-enabled virtual hosts.
##

#
# Some MIME-types for downloading Certificates and CRLs
#
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl

# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
# The filtering dialog program (`builtin' is a internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog builtin

# Inter-Process Session Cache:
# Configure the SSL Session Cache: First the mechanism
# to use and second the expiring timeout (in seconds).
#SSLSessionCache dc:UNIX:/var/cache/mod_ssl/distcache
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300

# Semaphore:
# Configure the path to the mutual exclusion semaphore the
# SSL engine uses internally for inter-process synchronization.
SSLMutex default

# Pseudo Random Number Generator (PRNG):
# Configure one or more sources to seed the PRNG of the
# SSL library. The seed data should be of good random quality.
# WARNING! On some platforms /dev/random blocks if not enough entropy
# is available. This means you then cannot use the /dev/random device
# because it would lead to very long connection times (as long as
# it requires to make more entropy available). But usually those
# platforms additionally provide a /dev/urandom device which doesn't
# block. So, if available, use this one instead. Read the mod_ssl User
# Manual for more details.
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random 512
#SSLRandomSeed connect file:/dev/random 512
#SSLRandomSeed connect file:/dev/urandom 512

#
# Use "SSLCryptoDevice" to enable any supported hardware
# accelerators. Use "openssl engine -v" to list supported
# engine names. NOTE: If you enable an accelerator and the
# server does not start, consult the error logs and ensure
# your accelerator is functioning properly.
#
SSLCryptoDevice builtin
#SSLCryptoDevice ubsec

##
## SSL Virtual Host Context
##

<VirtualHost _default_:443>

# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"
     ↓ ドキュメントルート(ホームぺージファイルの格納フォルダ)の指定
DocumentRoot "/home/user/www"
#ServerName www.example.com:443

# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
     ↓ 認証キーファイルの指定
SSLCertificateFile /etc/httpd/conf/ssl.key/server.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
     ↓ 認証キーファイルの指定
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key

# Server Certificate Chain:
# Point SSLCertificateChainFile at a file containing the
# concatenation of PEM encoded CA certificates which form the
# certificate chain for the server certificate. Alternatively
# the referenced file can be the same as SSLCertificateFile
# when the CA certificates are directly appended to the server
# certificate for convinience.
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt

# Client Authentication (Type):
# Client certificate verification type and depth. Types are
# none, optional, require and optional_no_ca. Depth is a
# number which specifies how deeply to verify the certificate
# issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
#SSLVerifyDepth 10

# Access Control:
# With SSLRequire you can do per-directory access control based
# on arbitrary complex boolean expressions containing server
# variable checks and other lookup directives. The syntax is a
# mixture between C and Perl. See the mod_ssl documentation
# for more details.
#<Location />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
#</Location>

# SSL Engine Options:
# Set various options for the SSL engine.
# o FakeBasicAuth:
# Translate the client X.509 into a Basic Authorisation. This means that
# the standard Auth/DBMAuth methods can be used for access control. The
# user name is the `one line' version of the client's X.509 certificate.
# Note that no password is obtained from the user. Every entry in the user
# file needs this password: `xxj31ZMTZzkVA'.
# o ExportCertData:
# This exports two additional environment variables: SSL_CLIENT_CERT and
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
# server (always existing) and the client (only existing when client
# authentication is used). This can be used to import the certificates
# into CGI scripts.
# o StdEnvVars:
# This exports the standard SSL/TLS related `SSL_*' environment variables.
# Per default this exportation is switched off for performance reasons,
# because the extraction step is an expensive operation and is usually
# useless for serving static content. So one usually enables the
# exportation for CGI and SSI requests only.
# o StrictRequire:
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
# under a "Satisfy any" situation, i.e. when it applies access is denied
# and no other module can change it.
# o OptRenegotiate:
# This enables optimized SSL connection renegotiation handling when SSL
# directives are used in per-directory context.
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>

# SSL Protocol Adjustments:
# The safe and default but still SSL/TLS standard compliant shutdown
# approach is that mod_ssl sends the close notify alert but doesn't wait for
# the close notify alert from client. When you need a different shutdown
# approach you can use one of the following variables:
# o ssl-unclean-shutdown:
# This forces an unclean shutdown when the connection is closed, i.e. no
# SSL close notify alert is send or allowed to received. This violates
# the SSL/TLS standard but is needed for some brain-dead browsers. Use
# this when you receive I/O errors because of the standard approach where
# mod_ssl sends the close notify alert.
# o ssl-accurate-shutdown:
# This forces an accurate shutdown when the connection is closed, i.e. a
# SSL close notify alert is send and mod_ssl waits for the close notify
# alert of the client. This is 100% SSL/TLS standard compliant, but in
# practice often causes hanging connections with brain-dead browsers. Use
# this only for browsers where you know that their SSL implementation
# works correctly.
# Notice: Most problems of broken clients are also related to the HTTP
# keep-alive facility, so you usually additionally want to disable
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
# Similarly, one has to force some clients to use HTTP/1.0 to workaround
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
# "force-response-1.0" for this.
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

# Per-Server Logging:
# The home of a custom SSL log file. Use this when you want a
# compact non-error SSL logfile on a virtual host basis.
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

以上の書き換え(変更)をしたら保存します。

apacheの再起動

デスクトップ上部にあるメニューバーより“デスクトップ”⇒“システム設定”⇒“サーバ設定”⇒“サービス”を選択しします。

“httpd” を選択して “再起動” ボタンをクリックします。

下図のように警告画面が表示されますが『はい(Y)』をクリックします。

これで apache は再起動されました。

閲覧者への周知
これでホームページの暗号化通信ができるようになりましたが正規の認証局から認証され た訳ではないのでSSL通信をする場合はホームページ閲覧者に対してその旨を説明し下記のような作業をしていただくようにお願いしなければなりません。

以下はホームページ閲覧者に実際に行ってもらう作業です。

下図のようにホームページを表示させます。(下図では Fedora のテストページを表示させています)

そして、http の後に s を追加して https://localhost と入力して SSL を使った暗号化通信で自分のホームページを表示させます。

下図のような警告が表示されます。この警告は、Webサーバーが正規の認証局によって認証されていないことをユーザーに示すものです。 『証明書の表示(V)』をクリックします。

下図のようなダイアログが表示されます。『証明書のインストール』をクリックします。

下図のような“証明書のインポートウィザード”が表示されます。『次へ(N)』をクリックします。

『次へ(N)』をクリックします。

『完了』をクリックします。

続いて、下図のような“セキュリティ警告”が表示されます。『はい(Y)』をクリックします。

『OK』をクリックします。

『OK』をクリックします。

『はい(Y)』をクリックします。

SSL を使った暗号化通信でホームページを表示させました。画面右下に鍵マークが付いています。この鍵マークが暗号通信で表示されている証拠です。

この設定以後はセキュリティメッセージは出なくなります。

ホームページ閲覧者に対してよく説明して上記の設定をしてもらって下さい。

戻る