どちらも情報を発信するサイトで、サイトの運営者の身元を明確にすることでユーザーに安心を与えるため、全ページSSL化(常時SSL)を行っていた。こういう用途で使うなら、SSL は必要だけど暗号はいらんよね。正規の発信元からの情報であること、それが途中経路上で改竄されていないことを確認できればいいのであって、他人から覗かれることを気にして通信内容を秘匿する必要はない。だってもともと公開情報なんだから。_ ちうことで、週末に変なもん食ったのか腹が痛くてお休みしたこともあり(トイレとお友達になりすぎてケツが痛い…)、布団にこもってノート PC で実験くん。
_ httpd.conf に、こう書く。
eNULL = 暗号を使わない。あくまで暗号化しないだけで認証その他は通常どおりおこなうので、他人が通信内容を読むことはカンタンだけどそれを改竄するのは困難。実際に使われるアルゴリズムは以下のいずれかが選択される。SSLCipherSuite eNULL:!aNULL:!MD5> /usr/local/bin/openssl ciphers -v eNULL:\!aNULL:\!MD5 ECDHE-RSA-NULL-SHA SSLv3 Kx=ECDH Au=RSA Enc=None Mac=SHA1 ECDHE-ECDSA-NULL-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=None Mac=SHA1 ECDH-RSA-NULL-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=None Mac=SHA1 ECDH-ECDSA-NULL-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=None Mac=SHA1 NULL-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=None Mac=SHA256 NULL-SHA SSLv3 Kx=RSA Au=RSA Enc=None Mac=SHA1_ 結果。ダメダメでした。ブラウザの方が拒否しやがって SSL のネゴシエーションが成立しない。たしかに暗号化してないので用途によっては危険なんだけど、そういう用途に使わない(秘匿しなきゃいけない情報を流さない)ことが確定してる場合にそのことをちゃんと理解して使うなら十分以上に有益だと思うんだけどなー。
_ ちなみに、ブラウザを使わず openssl で直接叩くとこんな感じ。openssl のデフォルトは ALL:!aNULL:!eNULL でやっぱり eNULL が除外されてるので、明示的に -cipher eNULL を指定しないとネゴに失敗する。
ちうことで、鍵交換とかはちゃんとやってるけど暗号は使わない ECDHE-RSA-NULL-SHA で通信されている。上では省略したけど、オレオレ証明書ではないちゃんと正規に発行された証明書でテストしてるので、ルート証明書からのチェインもつながっている。ふつーのブラウザでもこんな感じで通信できることを期待してたんだけどなー。> /usr/local/bin/openssl s_client -connect maya.st:443 -cipher eNULL -CAfile /etc/ssl/cert.pem CONNECTED(00000003) (証明書チェインの表示とかそのへん略) New, TLSv1/SSLv3, Cipher is ECDHE-RSA-NULL-SHA Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-NULL-SHA (略) Verify return code: 0 (ok) --- GET / HTTP/1.0 HTTP/1.1 200 OK Date: Mon, 17 Jun 2013 11:03:47 GMT Server: Apache/2.4.4 (Unix) OpenSSL/1.0.1e Last-Modified: Mon, 01 Apr 2013 04:24:02 GMT ETag: "75-4d944fd913c80" Accept-Ranges: bytes Content-Length: 117 Connection: close Content-Type: text/html (略)_ まだ仕様は流動的だけど HTTP/2.0 では SSL がふつーになるようなので(いちおう必須にはならない見込みっぽいけど…)、単なる情報提供だけのサイトでも HTTPS が使われることが多くなるんじゃないかと予想される。現行の HTTP でもお役所なんかの公的情報を発信するサイトは HTTPS の方が望ましいんじゃないかと思ってるんだけど、こういったどうせ公開情報だから盗聴されるのは問題ないが改竄されるのは困るというサイトでは、eNULL は暗号化のオーバーヘッドがないぶんだけ負荷が低くなってかなり有益なはず。暗号がほんとに必要なサイトであっても、apache の SSLCipherSuite はサーバ単位ではなくディレクトリ単位で設定できるので、
のように、画像などの秘匿の必要のない部品だけを暗号化なしで吐き出す設定にして負荷を抑える、という手も使えたはず (*1)。せっかく有用な使い方があるのに、使えないようになってるというのは残念だな。foolproof として禁止するというのも理解できるんだけどね…。SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 <Location /images> SSLCipherSuite eNULL:!aNULL:!MD5 </Location>
(*1): ただし、Set-Cookie の path 指定がよろしくないと画像に対しても Cookie が送られることはあるので、ちゃんと検討してそういうふうに設計しておく必要がある。