CentOS5 Webサーバーの構築[Apache] Apacheの通信をSSL/TLSで暗号化する - itochif.com
CSR(Certificate Signing Request)の作成
認証局からサーバー証明書を発行してもらうには、CSR(Certificate Signing Request)と呼ばれる情報を認証局に提出し、署名をしてもらう必要があります。VeriSign等の認証局からサーバー証明書を発行してもらうには、その認証局の指示に従ってCSRを作成します。(例:日本ベリサインの場合)
# cd /etc/pki/tls/misc/ # ./CA -newreq Generating a 1024 bit RSA private key ...++++++ ..................................................++++++ writing new private key to 'newkey.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) [GB]:JP # 国名を入力(大文字) State or Province Name (full name) [Berkshire]:Kanagawa # 都道府県名を入力 Locality Name (eg, city) [Newbury]:Yokohama # 市区町村名を入力(ローマ字) Organization Name (eg, company) [My Company Ltd]:itochif.com # 組織名を入力(ローマ字) Organizational Unit Name (eg, section) []:WebSection # 部門/部署名等、任意の判別文字列を入力 Common Name (eg, your name or your server's hostname) []:www.itochif.com # 証明書を使用するサーバーのFQDNを入力 Email Address []:itochif@example.com # メールアドレスを入力 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # Enterを押下。詳細は [man req]コマンドで。 An optional company name []: # Enterを押下。詳細は [man req]コマンドで。 Request is in newreq.pem, private key is in newkey.pem図1.Webサーバーで使用する秘密鍵とCSRの作成
作成されるファイルのパスは以下になります。
- /etc/pki/tls/misc/newkey.pem (Webサーバーの秘密鍵)
- /etc/pki/tls/misc/newreq.pem (WebサーバーのCSR)
サーバー証明書の作成(認証局)
VeriSign等の認証局に署名をしてもらうには、その認証局にCSRの内容を送ります。(/etc/pki/tls/misc/newreq.pem)以下は自前の認証局での署名です。
# cd /etc/pki/tls/misc/ # ./CA -sign Using configuration from /etc/pki/tls/openssl.cnf Enter pass phrase for ../../CA/private/cakey.pem: # CA用秘密鍵のパスフレーズを入力 Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Mar 23 02:32:33 2008 GMT Not After : Mar 23 02:32:33 2009 GMT Subject: countryName = JP stateOrProvinceName = Kanagawa localityName = Yokohama organizationName = itochif.com organizationalUnitName = WebSection commonName = www.itochif.com emailAddress = itochif@example.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 31:4E:66:BA:C9:F5:A5:12:9E:22:EC:2C:54:88:0E:53:9E:37:D6:4C X509v3 Authority Key Identifier: keyid:40:FF:7B:8E:0E:7E:EE:2F:34:9E:F9:54:2B:79:12:B2:B9:AA:9E:BF Certificate is to be certified until Mar 23 02:32:33 2009 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 Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C=JP, ST=Kanagawa, O=itochif.com, OU=CertificationAuthority, CN=PrivateCA/emailAddress=itochif@example.com Validity Not Before: Mar 23 02:32:33 2008 GMT Not After : Mar 23 02:32:33 2009 GMT Subject: C=JP, ST=Kanagawa, L=Yokohama, O=itochif.com, OU=WebSection, CN=www.itochif.com/emailAddress=itochif@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:a2:70:6c:f2:0c:1e:dc:9c:a1:0f:9e:71:1d:1f: ec:9b:a0:7f:46:63:49:65:df:5e:a3:fc:ff:59:bd: 60:b6:2a:03:59:a8:0b:dd:d3:c1:e2:12:30:53:c0: 29:44:38:10:68:95:46:13:87:de:db:b8:e6:fb:c0: 76:5e:79:47:96:4f:f0:dd:fc:0c:52:94:0b:7b:7e: 66:5c:5e:f6:23:86:be:2c:67:28:38:69:40:31:91: 1c:52:4f:94:cd:a5:5c:43:a2:37:49:77:51:d5:4d: 0d:b3:98:24:5a:85:bc:13:14:c6:25:3d:74:dd:c6: 7d:98:30:ca:8d:15:67:e5:73 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 31:4E:66:BA:C9:F5:A5:12:9E:22:EC:2C:54:88:0E:53:9E:37:D6:4C X509v3 Authority Key Identifier: keyid:40:FF:7B:8E:0E:7E:EE:2F:34:9E:F9:54:2B:79:12:B2:B9:AA:9E:BF Signature Algorithm: sha1WithRSAEncryption 3f:4f:ee:57:8c:fc:56:39:9f:04:0f:0d:cc:e7:79:3c:cf:f8: b7:d1:04:7b:09:57:28:a6:c7:3a:93:c3:15:24:fa:b1:b0:3b: 0b:f4:d2:e4:06:7c:d5:02:37:c9:2a:c1:93:14:c0:3e:40:ad: c3:21:3e:61:4b:df:85:d0:d3:6d:40:fd:35:ec:43:2c:6b:57: 07:7c:8a:98:94:66:ca:2b:09:2f:66:c7:d5:ff:b0:14:76:4a: c5:6e:34:7f:f8:30:4b:5e:00:be:a5:aa:8b:ca:18:f6:48:ac: 68:7b:a2:be:24:43:8b:b8:1c:ea:f7:db:d2:a9:99:f3:1b:4d: 69:ec -----BEGIN CERTIFICATE----- MIIDHjCCAoegAwIBAgIBATANBgkqhkiG9w0BAQUFADCBjzELMAkGA1UEBhMCSlAx ETAPBgNVBAgTCEthbmFnYXdhMRQwEgYDVQQKEwtpdG9jaGlmLmNvbTEfMB0GA1UE CxMWQ2VydGlmaWNhdGlvbkF1dGhvcml0eTESMBAGA1UEAxMJUHJpdmF0ZUNBMSIw IAYJKoZIhvcNAQkBFhNpdG9jaGlmQGV4YW1wbGUuY29tMB4XDTA4MDMyMzAyMzIz M1oXDTA5MDMyMzAyMzIzM1owgZwxCzAJBgNVBAYTAkpQMREwDwYDVQQIEwhLYW5h Z2F3YTERMA8GA1UEBxMIWW9rb2hhbWExFDASBgNVBAoTC2l0b2NoaWYuY29tMRMw EQYDVQQLEwpXZWJTZWN0aW9uMRgwFgYDVQQDEw93d3cuaXRvY2hpZi5jb20xIjAg BgkqhkiG9w0BCQEWE2l0b2NoaWZAZXhhbXBsZS5jb20wgZ8wDQYJKoZIhvcNAQEB BQADgY0AMIGJAoGBAKJwbPIMHtycoQ+ecR0f7Jugf0ZjSWXfXqP8/1m9YLYqA1mo C93TweISMFPAKUQ4EGiVRhOH3tu45vvAdl55R5ZP8N38DFKUC3t+Zlxe9iOGvixn KDhpQDGRHFJPlM2lXEOiN0l3UdVNDbOYJFqFvBMUxiU9dN3GfZgwyo0VZ+VzAgMB AAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQxTma6yfWlEp4i7CxUiA5TnjfWTDAf BgNVHSMEGDAWgBRA/3uODn7uLzSe+VQreRKyuaqevzANBgkqhkiG9w0BAQUFAAOB gQA/T+5XjPxWOZ8EDw3M53k8z/i30QR7CVcopsc6k8MVJPqxsDsL9NLkBnzVAjfJ KsGTFMA+QK3DIT5hS9+F0NNtQP017EMsa1cHfIqYlGbKKwkvZsfV/7AUdkrFbjR/ +DBLXgC+paqLyhj2SKxoe6K+JEOLuBzq99vSqZnzG01p7A== -----END CERTIFICATE----- Signed certificate is in newcert.pem # /usr/bin/openssl x509 -in /etc/pki/tls/misc/newcert.pem -out /etc/pki/tls/misc/newcert.crt # newcert.pemからwebサーバーで使用する証明書部分のみを抜き出す # /bin/chmod 0400 /etc/pki/tls/misc/new* # 作成されたファイルに他人がアクセス出来ないように権限を変更する # /bin/mkdir -p /root/certs/webserver # 保存用にディレクトリを作成 # /bin/mv new* /root/certs/webserver/ # 作成されたファイルを保存用ディレクトリに移動 # /bin/mkdir -p /etc/httpd/conf.d/certs # サーバー運用時にサーバー証明書と秘密鍵を読み込むディレクトリの作成 # /bin/chmod 0700 /etc/httpd/conf.d/certs # ディレクトリへのアクセス権の設定 # /bin/cp /root/certs/webserver/newkey.pem /etc/httpd/conf.d/certs/privatekey.httpd.pem # 秘密鍵を読み込み用ディレクトリにコピーする # /bin/cp /root/certs/webserver/newcert.crt /etc/httpd/conf.d/certs/httpd.crt # サーバー証明書を読み込み用ディレクトリにコピーする図2.サーバー証明書の作成
ApacheをTLS/SSLに対応させる
ApacheをTLS/SSLに対応させるため、yumを使用してmod_sslモジュールをインストールします。
# yum -y install mod_ssl Loading "installonlyn" plugin Setting up Install Process Setting up repositories extras 100% |=========================| 1.1 kB 00:00 updates 100% |=========================| 951 B 00:00 base 100% |=========================| 1.1 kB 00:00 addons 100% |=========================| 951 B 00:00 Reading repository metadata in from local files primary.xml.gz 100% |=========================| 98 kB 00:00 ################################################## 338/338 primary.xml.gz 100% |=========================| 198 kB 00:03 ################################################## 361/361 Parsing package install arguments Resolving Dependencies --> Populating transaction set with selected packages. Please wait. ---> Downloading header for mod_ssl to pack into transaction set. mod_ssl-2.2.3-11.el5_1.ce 100% |=========================| 12 kB 00:00 ---> Package mod_ssl.i386 1:2.2.3-11.el5_1.centos.3 set to be updated --> Running transaction check --> Processing Dependency: libdistcache.so.1 for package: mod_ssl --> Processing Dependency: libnal.so.1 for package: mod_ssl --> Restarting Dependency Resolution with new changes. --> Populating transaction set with selected packages. Please wait. ---> Downloading header for distcache to pack into transaction set. distcache-1.4.5-14.1.i386 100% |=========================| 8.8 kB 00:00 ---> Package distcache.i386 0:1.4.5-14.1 set to be updated --> Running transaction check Dependencies Resolved ============================================================================= Package Arch Version Repository Size ============================================================================= Installing: mod_ssl i386 1:2.2.3-11.el5_1.centos.3 updates 84 k Installing for dependencies: distcache i386 1.4.5-14.1 base 119 k Transaction Summary ============================================================================= Install 2 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 203 k Downloading Packages: (1/2): mod_ssl-2.2.3-11.e 100% |=========================| 84 kB 00:01 (2/2): distcache-1.4.5-14 100% |=========================| 119 kB 00:00 Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing: distcache ######################### [1/2] Installing: mod_ssl ######################### [2/2] Installed: mod_ssl.i386 1:2.2.3-11.el5_1.centos.3 Dependency Installed: distcache.i386 0:1.4.5-14.1 Complete!図3.yumを使用してmod_sslモジュールをインストール
Apacheの設定を変更します。以下は変更を行う箇所を元の行番号と共に掲載します。viで行番号を表示するにはコマンドモード(Escキーを押下)で[:set number]と入力します。
# vi /etc/httpd/conf.d/ssl.conf ------------------------------ 次の行からssl.confの中身(の一部) DocumentRoot "/var/www/html" #84:コメントをはずしてドキュメントルートを指定する ServerName www.itochif.com:443 #85:サーバー名:ポート番号を記載する SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:!LOW #105:強度の弱いCipherSuiteを除く SSLCertificateFile /etc/httpd/conf.d/certs/httpd.crt #112:サーバー証明書ファイルを指定する SSLCertificateKeyFile /etc/httpd/conf.d/certs/privatekey.httpd.pem #119:サーバーの秘密鍵ファイルを指定する ------------------------------ ssl.conf終了図4.TLS/SSL対応の設定
Apacheを再起動する
Apacheの再起動を行い、設定を反映させます。再起動する前に、[/usr/sbin/apachectl configtest]コマンドで、設定ファイルに文法エラーがないかどうかを確認します。
# /usr/sbin/apachectl configtest # 設定ファイルの文法をチェック Syntax OK # 文法エラーの無い事を確認する # /sbin/service httpd restart # Apacheの再起動 httpd を停止中: [ OK ] httpd を起動中: Apache/2.2.3 mod_ssl/2.2.3 (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 itochif.com:443 (RSA) Enter pass phrase: # Webサーバーの秘密鍵用パスフレーズを入力 OK: Pass Phrase Dialog successful. [ OK ]図5.Apacheの再起動
Apacheを再起動するたびにパスフレーズの入力が必要となります。以下の操作を行うことで、Apacheやシステムの再起動時にパスフレーズを入力する必要がなくなります。(必須の作業ではありません)
# /usr/bin/openssl rsa -in /etc/httpd/conf.d/certs/privatekey.httpd.pem -out /etc/httpd/conf.d/certs/privatekey.httpd.pem Enter pass phrase for /etc/httpd/conf.d/certs/privatekey.httpd.pem: # Webサーバーの秘密鍵用パスフレーズを入力 writing RSA key図6.再起動の度にパスフレーズの入力をしないようにしている
ファイアウォールの設定
ファイアウォールの設定で行ったiptablesの設定では自分自身以外からのWebサーバーへの要求(https)と返事は破棄されてしまいます。 以下はWEBサーバー稼動後、クライアントから問い合わせを行おうとした時の/var/log/messagesの内容です。
# /bin/grep DROP /var/log/messages
Mar 23 16:00:00 www kernel: [DROP DEFAULT] :IN=eth0 OUT= SRC=xxx.xxx.xxx.xxx DST=192.168.10.2 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=3540 DF PROTO=TCP SPT=4229 DPT=443 WINDOW=65535 RES=0x00 SYN URGP=0
図7.ファイアウォールによって破棄されたクライアントからの問い合わせ(抜粋)
これら通信を行うために上記ログから必要な情報を抜き出すと以下のリストになります。
- 内向きの新規TCP通信(IN=eth0/PROTO=TCP(SYN)/)
- 宛先IPアドレスはこのサーバ(DST=192.168.10.2)
- 送信元IPアドレスはANY(SRC=xxx.xxx.xxx.xxx)
- 宛先ポートは443(DPT=443)
ファイアウォールの設定で作成したシェルスクリプトに、この情報を元にして作成したiptablesコマンドを追記します。 「※この下に受け入れる接続を記述する」の部分に以下の設定を追記します。
# ----- Webサーバーへのリクエスト(https)を許可する /sbin/iptables -A INPUT -p tcp -i $IF1 -d $IP1 --dport 443 -m state --state NEW -j ACCEPT図8.「ファイアウォールの設定」に追記するコマンド
上記のコマンドを追記した後、以下のコマンドでパケットフィルタテーブルを更新します。
# /usr/local/sbin/iptables.sh ファイアウォールのルールを /etc/sysconfig/iptables に保存中[ OK ] ファイアウォールルールを適用中: [ OK ] チェインポリシーを ACCEPT に設定中filter [ OK ] iptables モジュールを取り外し中 [ OK ] iptables ファイアウォールルールを適用中: [ OK ] iptables モジュールを読み込み中ip_conntrack_netbios_ns [ OK ]図9. パケットフィルタテーブルの更新
ブロードバンドルーター等を使用していて、外部からもこのWebサーバーへのアクセスを行うには、ルーターの設定を変更して、TCP443ポートへのアクセスをこのサーバーにフォワードする必要があります。


![インテルCentrino Duo搭載ThinkPad T60 [468x60]](http://www.ibm.com/jp/pc/campaign/affiliate/10000001.gif)

Webサイトの利用ユーザーとApacheの稼動しているこのサーバー間の通信をSSL/TLSを使って暗号化します。この設定を行う上で、認証局(CA)から発行された証明書を使用します。サーバー証明書の発行は、認証局(CA)の構築で構築した認証局で行うか、VeriSign等の認証局から発行してもらいます。ここでは認証局(CA)の構築で構築した認証局を使ってサーバー証明書を発行します。
※[Apacheのインストールと設定]と[認証局(CA)の構築]が完了している前提です。