Since 12/1/2007
Home > Linux > CentOS5 > Webサーバーの構築[Apache] > Apacheの通信をSSL/TLSで暗号化する

CentOS5 Webサーバーの構築[Apache] Apacheの通信をSSL/TLSで暗号化する - itochif.com

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

富士通

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対応の設定

マウスコンピューター/G-Tune

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.再起動の度にパスフレーズの入力をしないようにしている

インテルCentrino Duo搭載ThinkPad T60 [468x60]

ファイアウォールの設定

ファイアウォールの設定で行った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ポートへのアクセスをこのサーバーにフォワードする必要があります。

GIGABYTE製 ハイエンドデスクトップ 468x60

掲載日 3/23/2008