どさにっきLTE 〜2013年6月中旬〜

by やまや
<< = >>

2013年6月17日(月)

暗号化しない SSL

_ 少し前の この記事

どちらも情報を発信するサイトで、サイトの運営者の身元を明確にすることでユーザーに安心を与えるため、全ページSSL化(常時SSL)を行っていた。
こういう用途で使うなら、SSL は必要だけど暗号はいらんよね。正規の発信元からの情報であること、それが途中経路上で改竄されていないことを確認できればいいのであって、他人から覗かれることを気にして通信内容を秘匿する必要はない。だってもともと公開情報なんだから。

_ ちうことで、週末に変なもん食ったのか腹が痛くてお休みしたこともあり(トイレとお友達になりすぎてケツが痛い…)、布団にこもってノート PC で実験くん。

_ httpd.conf に、こう書く。

SSLCipherSuite eNULL:!aNULL:!MD5
eNULL = 暗号を使わない。あくまで暗号化しないだけで認証その他は通常どおりおこなうので、他人が通信内容を読むことはカンタンだけどそれを改竄するのは困難。実際に使われるアルゴリズムは以下のいずれかが選択される。
> /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 を指定しないとネゴに失敗する。

> /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

(略)
ちうことで、鍵交換とかはちゃんとやってるけど暗号は使わない ECDHE-RSA-NULL-SHA で通信されている。上では省略したけど、オレオレ証明書ではないちゃんと正規に発行された証明書でテストしてるので、ルート証明書からのチェインもつながっている。ふつーのブラウザでもこんな感じで通信できることを期待してたんだけどなー。

_ まだ仕様は流動的だけど HTTP/2.0 では SSL がふつーになるようなので(いちおう必須にはならない見込みっぽいけど…)、単なる情報提供だけのサイトでも HTTPS が使われることが多くなるんじゃないかと予想される。現行の HTTP でもお役所なんかの公的情報を発信するサイトは HTTPS の方が望ましいんじゃないかと思ってるんだけど、こういったどうせ公開情報だから盗聴されるのは問題ないが改竄されるのは困るというサイトでは、eNULL は暗号化のオーバーヘッドがないぶんだけ負荷が低くなってかなり有益なはず。暗号がほんとに必要なサイトであっても、apache の SSLCipherSuite はサーバ単位ではなくディレクトリ単位で設定できるので、

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
<Location /images>
    SSLCipherSuite eNULL:!aNULL:!MD5
</Location>
のように、画像などの秘匿の必要のない部品だけを暗号化なしで吐き出す設定にして負荷を抑える、という手も使えたはず (*1)。せっかく有用な使い方があるのに、使えないようになってるというのは残念だな。foolproof として禁止するというのも理解できるんだけどね…。


(*1): ただし、Set-Cookie の path 指定がよろしくないと画像に対しても Cookie が送られることはあるので、ちゃんと検討してそういうふうに設計しておく必要がある。

<< = >>
やまや