SSLサイトの構築

通常のwebサイトは、情報のやりとりを平文(暗号化されていない)で行います。
したがって、ネットワーク回線を盗聴すれば、全の情報を取得できます。
元々webサイトは、情報を不特定多数の人に発信するために考えられた技術なので、盗聴の心配をする必要がありませんでした。
しかし現在では、カード番号や暗証番号など他人に知られたくない情報をネットワークで扱う場面が増えています。
これらの問題を解決するために、SSL(Secure Sockets Layer)を使ったwebサイトが誕生しました。

SSLサイトの作成


  1. SSLサイト用バーチャルサイトの定義ファイルの作成
    SSLサイト用の定義ファイルを作成します。
    Apache2をインストールした時点で下記ファイルが作成されています
    これを元に筆者の環境に合わせる形で若干の変更を行いました
    ファイル名:/etc/apache2/sites-available/default-ssl
    <IfModule mod_ssl.c>
    <VirtualHost _default_:443>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/wwwssl/ ←/var/wwwssl/を新規に作成
    <Directory />
    Options FollowSymLinks
    AllowOverride None
    </Directory>
    <Directory /var/wwwssl/> ←ここも上と同じように変更
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    LogLevel warn

    CustomLog /var/log/apache2/ssl_access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

    SSLEngine on

    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
    SSLOptions +StdEnvVars
    </Directory>

    BrowserMatch ".*MSIE.*" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0

    </VirtualHost>
    </IfModule>

  2. SSLサイト定義ファイルとSSLモジュールの有効化

    # a2ensite default-ssl
    Enabling site default-ssl.
    Run '/etc/init.d/apache2 reload' to activate new configuration!
    # a2enmod ssl
    Enabling module ssl.
    See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
    Run '/etc/init.d/apache2 restart' to activate new configuration!
これで、サイトのSSL化の準備は終わりです。
必要な公開鍵・秘密鍵もインストール時に準備済みです。
/var/wwwssl/へコンテンツファイルを置けばSSLサイトの完成です

新たに鍵を作成する場合

下記に設定する2つのファイルを作成する必要があります。
SSLCertificateFile ←公開鍵
SSLCertificateKeyFile ←秘密鍵

公開鍵は自身がCAとなり署名します。

証明書発行機関(CA)の構築

通常、証明書はベリサイン等の証明書発行機関(CA)に発行を依頼するのですが有料です。
貧乏サーバのため、第三者CAへの証明書発行依頼(有料)をあきらめ、自身で証明書を発行します。
そのために、CAを構築します。
  1. opensslの設定ファイルのを修正

    /etc/ssl/openssl.cnfの修正
    修正前 修正後
    [ CA_default ]

    dir = ./demoCA
    [ CA_default ]

    dir = ./alkCA

  2. 必要なディレクトリ・ファイルの作成
    # cd /etc/ssl/
    # mkdir ./alkCA
    # cd alkCA
    # mkdir ./certs
    # mkdir ./private
    # mkdir ./crl
    # mkdir ./newcerts
    # chmod 700 ./private ←秘密鍵が置かれるので他から見られないように
    # echo "01" > ./serial ←シリアルの初期化
    # touch ./index.txt ←証明書データベースの初期化

  3. 自己署名済みの証明書と秘密鍵を作成

    # openssl req -new -x509 -newkey rsa:2048 -out ./cacert.pem -keyout ./private/cakey.pem -days 3650←3650日有効な証明書を作成
    ./cacert.pem:CAの証明書ファイル
    ./private/cakey.pem:CAの秘密鍵
      (CAは、要求があればこの秘密鍵を使って署名を行う)
    Generating a 2048 bit RSA private key
    ...................................+++
    ..................................................+++
    writing new private key to './private/cakey.pem'
    Enter PEM pass phrase:←パスワードを入力
    Verifying - Enter PEM pass phrase:←再度パスワードを入力
    -----
    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]:Osaka ←都道府県名を入力
    Locality Name (eg, city) []:HigashiOsaka ←市区町村名を入力
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Yoppa ←会社名、団体名等を入力
    Organizational Unit Name (eg, section) []:Hoge ←部門名・部署名等を入力
    Common Name (eg, YOUR name) []:yoppa.yoppa ←URLを入力a
    Email Address []:←何も入力しない

    # chmod 600 ./private/cakey.pem ←他人から見られないように

  4. ブラウザ用証明書(der形式)への変換
    ca_cert.pemをブラウザに組み込めるようにder形式に変換します
    #openssl x509 -inform PEM -outform DER -in ./cacert.pem -out ./alkCAcert.der
    alkCAcert.derをブラウザに組み込みます(次項)。
    これをしないと、作成したSSLサイトへのアクセス毎に警告メッセージが表示されます。
    (この項での作業の意味が無くなる)

  5. CA証明書のブラウザへの組み込み(WindowsXPの場合)
    1. 4 で作成したalkCAcert.derをWindowsPCへコピー
    2. alkCAcert.derをダブルクリック
    3. 証明書情報が表示されるので[証明書インストール]を押す
    4. 証明書のインポートウィザード画面を表示 [次へ]を押す
    5. 証明書のインポートウィザード:証明書ストア画面を表示 [次へ]を押す
    6. 証明書のインポートウィザード:完了画面を表示 [完了]を押す
    7. 証明書をルートストアへの追加確認画面を表示 [はい]を押す
    8. 終了画面を表示 [OK]を押す

これでCA証明書の組み込み終了です


秘密鍵と証明書要求(CSR)の作成


自サーバの秘密鍵と証明書要求(CSR)を作成します。
このCSRから先ほど構築したCAで証明書を作成します
# mkdir /etc/ssl/key
# cd /etc/ssl/key
# openssl req -new -keyout alk_key.pem -out alk_csr.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Generating a 1024 bit RSA private key
...++++++
.......................++++++
writing new private key to './alk_key.pem'
Enter PEM pass phrase:  ←パスワードを入力
Verifying password - Enter PEM pass phrase:  ←再度パスワードを入力
-----
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 ←国コードを入力JP
State or Province Name (full name) [Some-State]:Osaka ←都道府県名を入力
Locality Name (eg, city) []:HigashOsaka ←市区町村名を入力
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Yoppa ←会社名、団体名等を入力
Organizational Unit Name (eg, section) []:Hoge ←部門名・部署名等を入力
Common Name (eg, YOUR name) []:alk.dip.jp ←正確にドメイン名を入力しなければならない
Email Address []:何も入力しない

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:何も入力しない
An optional company name []:何も入力しない


生成されたファイル 内 容 備 考
alk_key.pem サーバーの秘密鍵 サーバが持つ秘密鍵ファイル
デフォルトで1024bitの鍵ファイルが作成される
デフォルト値は下記ファイルを修正することで変更可能
/etc/ssl/openssl.cnf
alk_csr.pem 証明書要求(CSR) CA機関への証明書要求ファイル
本来、ベリサイン(株)等の第三者CAに証明書を発行してもらう

自サーバ公開鍵への署名


alk_csr.pemを自己CAで署名します。

# cd /etc/ssl
# openssl ca -out ./key/alk_cert.pem -infiles ./key/alk_csr.pem

 
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./alkCA/private/cakey.pem: ←CAのパスワードを入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jan 19 07:52:37 2005 GMT
            Not After : Jan 19 07:52:37 2006 GMT
        Subject:
            countryName = JP
            stateOrProvinceName = Osaka
            organizationName = Yoppa
            organizationalUnitName = Hoge
            commonName = alk.dip.jp
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                43:EA:70:7E:9C:40:AF:1B:DC:B9:45:88:F0:5C:59:FF:78:C5:2B:A3
            X509v3 Authority Key Identifier:
                keyid:B0:A5:A5:F4:08:CD:83:20:D7:4B:7A:79:6C:63:EB:30:B4:72:9C:35
                DirName:/C=JP/ST=Osaka/L=HigashiOsaka/O=Yoppa/OU=Hoge/CN=yoppa.yoppa
                serial:DF:28:7C:A1:04:75:A9:50

Certificate is to be certified until Jan 19 07:52:37 2006 GMT (365 days)
Sign the certificate? [y/n]:y←yを入力


1 out of 1 certificate requests certified, commit? [y/n]y←yを入力
Write out database with 1 new entries
Data Base Updated

最終的には次の2つのファイルを使用します
ファイル名 内 容
/etc/ssl/key/alk_cert.pem 自己CAで署名された公開鍵
/etc/ssl/key/alk_key.pem 秘密鍵

Apache2設定ファイルの修正


作成した公開鍵(alk_cert.pem)と秘密鍵(alk_key.pem)をApche2で使えるように修正します。

修正ファイル名:/etc/apache2/sites-available/ssl

<下記の記述を追加>
SSLCertificateFile /etc/ssl/key/alk_cert.pem
SSLCertificateKeyFile /etc/ssl/key/alk_key.pem

Apache2再起動時にパスフレーズを入力しない


これでSSLサイトとして機能します。
しかし、このままだとApache2を再起動する度にパスフレーズを聞かれます。
この方が安全なのですが、筆者は面倒なのがきらいなので、Apache2の再起動時にもパスフレーズを入力しないでも済むように変更します。

# cd /etc/ssl/key ←カレントディレクトリをSSL鍵の位置へ移動
# openssl rsa -in ./alk_key.pem -out ./alk_key_nopass.pem ←パスフレーズなしの鍵を作成:alk_key_nopass.pemが作成される鍵
Enter pass phrase for ./alk_key.pem: ←alk_key.pem作成時のパスワードを入力
writing RSA key

/etc/apache2/sites-available/sslファイルを変更

変更前 変更後
SSLCertificateKeyFile /etc/ssl/key/alk_key.pem SSLCertificateKeyFile /etc/ssl/key/alk_key_nopass.pem

これで、Apache2を再起動させてもパスフレーズの入力は、必要なくなります。

更新日:2009/11/3