server-memo.net

apache+mod_sslでSSL

      2016/01/22

SHA2の証明書作成について

2015.10.10追記

SSL証明書の暗号アルゴリズムがSHA-1からSHA-2(sha256)へ変更されているところです。

SHA-2を使用してのオレオレ(自己証明)証明書作成手順をこちらのページで説明してます。

検証環境

OS:CentOS 4.4
httpd: 2.0.52-28.ent.centos4
mod_ssl-2.0.52-28.ent.centos4
openssl-0.9.7a-43.10

apache+mod_sslによるSSL設定

apache+mod_sslのSSL対応設定です。

apacheはrpmでインストールされている環境で検証しています。

アプリケーションの確認

SSLの設定に必要なmod_sslとopensslがインストールされているか確認します。

mod_sslの確認
# rpm -qa | grep mod_ssl
mod_ssl-2.0.52-28.ent.centos4
opensslの確認
# rpm -qa | grep openssl
openssl-0.9.7a-43.10

ここでインストールされていればここの説明は読みとばして良いです。

mod_sslとopensslがインストールされていない場合は、インストールしなくてはいけません。 ここでは、いつもどおりお手軽なyumを使ってインストールをします。

mod_sslインストール

お手軽に、yumからインストールします。

# yum -y install mod_ssl
opensslインストール
# yum -y install openssl

SSLの設定

mod_sslのインストールが終わったら、いよいよSSLの設定を行っていきます。

SSLの設定を行っていく手順は大まかに分けると、以下のようになっています。

  1. 秘密鍵の生成
  2. CSRファイルの作成
  3. CSRへの署名(CRTファイルの作成)
  4. apacheの設定

秘密鍵の作成

鍵の保管場所

必要ならばSSLに必要な鍵の保存ディレクトリ作成します。
私の環境では、/etc/httpd/conf ディレクトリにssl.key等のディレクトリが ありましたので、それを使うことにしました。

# cd /etc/httpd/conf
# ls
Makefile    httpd.conf.org  ssl.crl  ssl.csr  ssl.prm
httpd.conf  magic           ssl.crt  ssl.key
秘密鍵の生成
# cd ssl.key/
# pwd
/etc/httpd/conf/ssl.key
# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.....................................................++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:       <--秘密鍵のパスワード設定
Verifying - Enter pass phrase for server.key:  <--パスワードの確認

これで、sever.keyという名の秘密鍵が作成されました。
他の人から秘密鍵が読めないように、パーミッションを変更します。

# chmod 400 server.key
# ls -la
合計 20
drwx------  2 root root 4096  6月  4 14:45 .
drwxr-xr-x  7 root root 4096  1月 15 02:12 ..
-r--------  1 root root  958  6月  4 14:45 server.key

以上で秘密鍵の作成は完了です。

※ここで作成された鍵ファイルは「/etc/httpd/conf.d/ssl.conf」「SSLCertificateKeyFile」項目に設定します。

CSRファイルの作成

CSR(Certificate Signing Request 証明書署名要請書)
これを認証局にわたして証明してもらいCRTキーを受け取ります。

# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:                <--秘密鍵作成時に入力したパスワードを入力
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) [GB]:JP     <--国コードを入力。日本は、「JP」
State or Province Name (full name) [Berkshire]:Tokyo     <--都道府県名を入力
Locality Name (eg, city) [Newbury]:Suginami     <--市区町村名を入力
Organization Name (eg, company) [My Company Ltd]:server-memo Corp     <--企業名・組織名を入力
Organizational Unit Name (eg, section) []:     <--部署名を入力(省略可)
Common Name (eg, your name or your server's hostname) []:www.server-memo.net <--サーバのホスト名をFQDNで入力
Email Address []:     <--担当者のE-mailアドレス(省略可)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:         <--パスワードを入力(省略可、今回は何も入力しません)
An optional company name []:     <--パスワードの再確認(省略可、今回は何も入力しません)

server.csrというCSRファイルが作成されます。
セキュリティのため他のユーザで内容を参照できないようにします。

# chmod 400 server.csr
# ls -l
-r--------  1 root root 651  6月  4 15:02 server.csr
-r--------  1 root root 958  6月  4 14:45 server.key

このCSRファイルを第三者認証機関(ベリサインとか)に送るとサーバID証明書(Certificate)が発行されます。

サーバ認証(CRTファイル作成)

通常は認証局にお願いするサーバ認証なのですが、実際に頼むと結構な金額になります。 検証や、自分だけがつかうサーバのためにお金をかける事は家計の事情で厳しいので、 今回は、自己署名サーバ認証 (通称オレオレ証明 :-p)を作成することとします。

# openssl x509 -in server.csr -out ../ssl.crt/server.crt -req -signkey server.key -days 365
Signature ok
subject=/C=JP/ST=Tokyo/L=Suginami/O=server-memo Corp/CN=www.server-memo.net
Getting Private key
Enter pass phrase for server.key: ←秘密鍵作成時に入力したパスワードを入力

今回は -days 365 としているので、有効期間が1年のserver.crtというCSRファイルが作成されます。
セキュリティのため他のユーザで内容を参照できないようにします。

# cd ../ssl.crt
# ls
server.crt
# chmod 400 server.crt
# ls -l
合計 8
-r--------  1 root root 843  6月  4 15:05 server.crt

作成されたCRTファイルは/etc/httpd/conf.d/ssl.conf「SSLCertificateFile」項目に設定されます。

apacheの設定

ssl.confの編集 作成したkeyのフルパスを設定します。

# cd /etc/httpd/conf.d/
# cp -p ssl.conf ssl.conf_org
# vi ssl.conf
設定内容

SSLCertificateFile サーバ証明書のフルパス
SSLCertificateKeyFile サーバ秘密鍵ファイルのフルパス

今回の例では、以下のようになります。

秘密鍵
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
CRTファイル
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt

apache起動

設定が完了しましたら、apacheを再起動することでSSLの設定が有効となります ただ、apache起動の際パスワードの入力が必要となるので注意が必要です

# /etc/init.d/httpd restart
httpd を停止中:                          [  OK  ]
httpd を起動中: Apache/2.0.52 mod_ssl/2.0.52 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server sun.server-memo.net:443 (RSA)
Enter pass phrase:

OK: Pass Phrase Dialog successful.
                                         [  OK  ]

動作確認

webブラウザでhttps://127.0.0.1に接続して、SSL通信できていることを確認します。

秘密鍵からパスワードを消去

今のままの秘密鍵ですと、apache(httpd)起動時に毎回パスワードを入力する必要があります。 このままでは自動起動の設定ができません。(パスワードを入力しないとapacheが起動しないため) なので、セキュリティレベルは下がるのですが、秘密鍵からパスワードを消去し、 apache起動時のパスワード入力処理を行わないようにします。

秘密鍵からパスワードを消去する場合、以下のようなメリット・デメリットがありますので 十分検討してから、秘密鍵からパスワードを消去するかどうか決めてください。

メリット
Apache(httpd)起動時にパスワード入力の必要がないので自動起動が可能です。
デメリット
秘密鍵と証明書が盗まれてた場合にパスワード入力が無いので、証明書を悪用される危険性が高まります。
秘密鍵からパスワード消去

秘密鍵からパスワードを消去するのは非常に簡単です。

現在使用している秘密鍵の名前を変更し、それを元にパスワードなしの秘密鍵を再作成します。

# cd /etc/httpd/conf/ssl.key
# mv server.key server.key_org
# openssl rsa -in server.key_org -out server.key
Enter pass phrase for server.key_org:  <--秘密鍵作成時に入力したパスワードを入力
writing RSA key

パスワードなしの秘密鍵ができましたら、rootだけが読めるように秘密鍵のパーミッションを400に変更します。

# chmod 400 server.key
# ls -la
drwxr-xr-x 2 root root 4096  6月 11 18:41 .
drwxr-xr-x 4 root root 4096  6月 11 18:24 ..
-r-------- 1 root root  672  6月 11 18:28 server.csr
-r-------- 1 root root  887  6月 11 18:41 server.key
-r-------- 1 root root  963  6月 11 18:25 server.key_org

以上で、パスワードなしの秘密鍵の作成は完了です。

apache起動

秘密鍵からパスワードを消去したので、apache起動時のパスワード入力が 無くなったことを確認します。

# /etc/init.d/httpd restart
httpd を停止中:          [  OK  ]
httpd を起動中:          [  OK  ]

パスワードを入力しなくても起動するようになりました。:-)

 - apache