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の設定を行っていく手順は大まかに分けると、以下のようになっています。
- 秘密鍵の生成
- CSRファイルの作成
- CSRへの署名(CRTファイルの作成)
- 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 ]
パスワードを入力しなくても起動するようになりました。:-)
コメント