K4750.NET

(正しい)オレオレ証明書の作り方

UbuntuのApache2にて(簡易に)SSL通信する際は、make-ssl-certコマンドを使い「自己署名証明書(self-signed certificate)」(いわゆる、オレオレ証明書)をサーバー証明書として作るのが手っ取り早い上に確実(※1)である。以下にmake-ssl-certコマンドの使い方および、このコマンド(shell-script)が実行している内容について書く。

※1 確実=オレオレ証明書を正確に作れるという意味。


1.make-ssl-cert

標準の/etc/apache2/site-available/default-sslを有効にして使用している場合は特に何もする必要はない。既にインストール時に生成されたオレオレ証明書を使用する設定になっている。なお、ホスト名の変更等を行った場合は、以下を実行することで、オレオレ証明所を再生成することができる(rootで実行する必要)。

# make-ssl-cert generate-default-snakeoil --force-overwrite

2.何をやっているか

make-ssl-certコマンドは単なるShellスクリプトであり、上記をパラメータとして実行した場合、以下の(ような)内容が実行される。

# TMPFILE="$(mktemp)"
# HostName="$(hostname -f)"
# sed -e "s#@HostName@#$HostName#" /usr/share/ssl-cert/ssleay.cnf > $TMPFILE
# openssl req -config $TMPFILE -new -x509 -days 3650 -nodes 
  -out /etc/ssl/certs/ssl-cert-snakeoil.pem 
  -keyout /etc/ssl/private/ssl-cert-snakeoil.key
# chmod 644 /etc/ssl/certs/ssl-cert-snakeoil.pem
# chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key
# chown root:ssl-cert /etc/ssl/private/ssl-cert-snakeoil.key
# cd /etc/ssl/certs/
# ln -sf ssl-cert-snakeoil.pem $(openssl x509 -hash -noout -in ssl-cert-snakeoil.pem)

これにより(中間ファイルはさておき)二つのファイルssl-cert-snakeoil.pemファイル(オレオレ証明書)、ssl-cert-snakeoil.keyファイル(秘密鍵)が生成され、最後にパーミッションの設定等が自動的に行われる。

コマンドの実行状況を見て思うのは、証明書を作る際は、ファイルを生成する以外にも思いのほかやることがあるということ。パーミッションの設定については語られているサイトはあるが、最後のシンボリックリンクを生成する部分(ln -sf …)については、実行状況を見て初めて知った。

自前で“正しく”オレオレ証明書を作りたいのであれば、make-ssl-certコマンドを使うのが手っ取り早い上に、システムにとっても整合的である。


3.ファイルの内容

オレオレ証明書や秘密鍵の内容は、それぞれ以下のコマンドを実行して確認することができる。

# openssl x509 -text < /etc/ssl/certs/ssl-cert-snakeoil.pem
# openssl rsa -text < /etc/ssl/private/ssl-cert-snakeoil.key

内容からは、証明書の有効期間が発行後10年であること、公開鍵暗号方式がRSA(2048bit)であること、発行者(Issuer)および主体者(Subject)が同じ=オレオレ証明書であること等が読み取れる。

SSLを最短で有効化

WordPressの管理画面へhttpsでアクセスできるように設定した際のメモ。ただし、面倒な作業は極力避け、SSLを最短の手数で有効化する。なお、いわゆる「オレオレ証明書(self-signed certificate)」はデフォルトでインストールされているものを使用せずに、今回のSSL化に伴い再生成している。環境はUbuntu 12.04.3 LTS + Apache2。


1.SSL有効化

Apache2のSSLを有効化。オレオレ証明書は再生成する(make-ssl-cert)。

# a2enmod ssl
# a2ensite default-ssl
# make-ssl-cert generate-default-snakeoil --force-overwrite
# service apache2 restart

WordPressのログインおよび管理画面へのアクセスでhttpsを強制するためにwp-config.phpへ以下を追記する。

define('FORCE_SSL_ADMIN', true);

2.make-ssl-cert

make-ssl-certコマンドの正体(何をやっているのか)については後日投稿予定


3.参考

さくらのVPS(1G)におけるApacheの同時接続数の設定値について

Apacheの同時接続数(MaxClients)を適切な値に設定することにより、大量の同時アクセスが発生しても(ある程度の)秒間のリクエスト数(スループット)を維持できるようにしておく。


1.環境

本サイトの環境(概要)は以下のとおり(2013/9/11時点)。

  • さくらのVPS(1G)
  • Ubuntu 12.04.3 LTS
  • Apache/2.2.22
  • WordPress 3.6

2.準備

スループットを計測するためのabコマンド(ApacheBench)と、CPU使用率等を確認するためのsarコマンドをインストールする。

# apt-get install apache2-utils
# apt-get install sysstat

3.計測(設定変更前)

CPUの各種使用率およびスワップの状態を確認するためのコマンド(sar -P ALL 1 1000sar -S 1 1000)を裏で実行しつつ、abコマンドを実行してみる。まずは同時接続数30、リクエスト数200とする。

# ab -c 30 -n 200 http://www.k4750.net/
...
Concurrency Level:      30
Time taken for tests:   51.828 seconds
Complete requests:      200
Failed requests:        0
Write errors:           0
Total transferred:      6494600 bytes
HTML transferred:       6444200 bytes
Requests per second:    3.86 [#/sec] (mean)
Time per request:       7774.199 [ms] (mean)
Time per request:       259.140 [ms] (mean, across all concurrent requests)
Transfer rate:          122.37 [Kbytes/sec] received
...

すべてのリクエストを捌くのに約52秒、秒間のリクエスト数は3.86回となっている。sarの状況(抜粋)は、

# sar -S 1 1000
10:49:57 PM kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
...
10:50:15 PM    675580    369920     35.38     50872     13.75
10:50:16 PM    639152    406348     38.87     57688     14.20
10:50:17 PM    669316    376184     35.98     69396     18.45
...

%swpused(スワップ領域の使用率)が30%を超え(計測前は7%程度)、

# sar -P ALL 1 1000
...
10:50:14 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:50:15 PM     all     20.45      0.00     12.50     66.48      0.57      0.00
10:50:15 PM       0     22.99      0.00     12.64     63.22      1.15      0.00
10:50:15 PM       1     17.78      0.00     12.22     68.89      1.11      0.00

10:50:15 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:50:16 PM     all     20.97      0.00     13.98     63.44      1.61      0.00
10:50:16 PM       0     21.11      0.00     17.78     60.00      1.11      0.00
10:50:16 PM       1     21.05      0.00     11.58     66.32      1.05      0.00

10:50:16 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:50:17 PM     all     48.70      0.00      9.84     38.86      2.59      0.00
10:50:17 PM       0     45.83      0.00     15.62     36.46      2.08      0.00
10:50:17 PM       1     50.50      0.00      4.95     40.59      3.96      0.00
...

%iowait(ディスクI/O待ちの割合)が60%を超えている(計測前は0%)。メモリが足りず、スワップが発生しているようだ。abコマンドの同時接続数を徐々に下げていくと、20あたりで諸々の調子が良くなるようだ(このときのsarの結果は、%swpused=10%程度、%iowait=ほぼ0%)。

# ab -c 20 -n 200 http://www.k4750.net/
...
Concurrency Level:      20
Time taken for tests:   26.496 seconds
Complete requests:      200
Failed requests:        0
Write errors:           0
Total transferred:      6494600 bytes
HTML transferred:       6444200 bytes
Requests per second:    7.55 [#/sec] (mean)
Time per request:       2649.577 [ms] (mean)
Time per request:       132.479 [ms] (mean, across all concurrent requests)
Transfer rate:          239.37 [Kbytes/sec] received
...

4.Apacheの設定値

Apacheの設定値等を確認してみると、

# apache2 -V
Server version: Apache/2.2.22 (Ubuntu)
...
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
...

# cat /etc/apache2/apache2.conf
...
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>
...

prefork MPM(Multi-Processing Module)を使用しており、同時接続数(MaxClients)は150であることが分かる。abコマンドの同時接続数が20あたりで調子が良いことから、このMaxClientsを20に設定変更する。これにより、最大で150プロセス起動してしまう設定であったのが、最大20に抑えられることになり、「メモリスワップが発生しない=スループットが(極端に)低下しない」状況になるはずだ。


5.計測(設定変更後)

abコマンドの同時接続数を30~100と変化させてみたが、秒間リクエスト数(スループット)に極端な低下はみられない。また、%iowaitや%swpusedの値からも、メモリスワップが発生していないことが分かる。ただし、リクエスト時間(abのTime per requestの値)は徐々に長くなる。これは、サーバ側の調子は良いが、クライアント側は長く待たされる状況ということだ。

同時接続数 テスト時間(秒) 秒間リクエスト数 リクエスト時間
(ミリ秒)(平均)
%iowait
(平均)
%swpused
(平均)
30 25.363 7.89 3790.755 0.00 8.00
40 24.936 8.02 5020.484 0.00 8.00
50 25.427 7.87 6290.902 0.00 8.00
60 24.223 8.26 7289.311 0.00 8.00
100 24.869 8.04 12183.391 0.00 8.00

6.まとめ

簡単ではあるがまとめると「さくらのVPS(1G)環境でApache+WordPressを動作させておく場合は、MaxClientsを20程度にすると(サーバ側の)調子がよい」。


7.今後の予定

今回の設定により、サーバ側に無茶な負荷がかからないようになったので、今後はクライアント側のレスポンス改善を実施する予定。