Secure
Hypertext Transfer Protocol(S-HTTP)は、HTTPで行われるウェブ通信を
暗号化するためのプロトコルで、
HTTPSプロトコルの代替として開発されました。Eric RescorlaとAllan M. Schiffmanによって開発され、1999年にRFC 2660として公開されました。
ウェブブラウザは通常、ウェブサーバーとの通信にHTTPを使用しますが、このプロトコルでは情報が
暗号化されずに送受信されます。そのため、インターネット上での
電子商取引や金融機関の口座へのオンラインアクセスなど、機密性の高い情報のやり取りにはセキュリティ上の問題がありました。この問題を解決するために、1990年代半ばに
HTTPSとS-HTTPが定義されました。
S-HTTPは当初、Spyglassのウェブサーバーで使用されましたが、ネットスケープや
マイクロソフトは
HTTPSを支持したため、
HTTPSがウェブ通信のセキュリティを確保するための
デファクトスタンダードとなりました。
HTTP over TLSとの比較
S-HTTPとHTTP over TLS(
HTTPS)には、いくつかの重要な違いがあります。
S-HTTPは、ページデータやPOSTフィールドなど送信されるデータのみを
暗号化し、プロトコルの開始部分は
暗号化されません。そのため、S-HTTPでは
暗号化されていないヘッダーから通信が
暗号化されているかどうかが判断でき、HTTPと同じポートで同時に使用できました。
一方、HTTP over TLSは、通信全体を
Transport Layer Security(TLS、旧SSL)で包み込みます。これにより、プロトコルデータが送信される前に
暗号化が開始されます。このため、名前ベースの仮想ホストでは、どのDNS名が要求されたかを判断する際に「ニワトリと卵」のような問題が生じます。
つまり、
Server Name Indication(SNI)をサポートしていない
HTTPSの実装では、DNS名ごとに個別の
IPアドレスが必要になり、すべての
HTTPSの実装では、
暗号化を使用するために個別のポート(通常は443、HTTPの標準ポートは80)が必要になります(ほとんどのブラウザでは、個別のURIスキーム `https://` として使用されます)。
RFC 2817にあるように、
HTTP/1.1 Upgradeヘッダー|HTTP_1.1 Upgradeヘッダーを実装してTLSにアップグレードすることでHTTPを保護することも可能です。この方法で協定されたHTTP over TLSの実行は、名前ベースの仮想ホスティング(追加の
IPアドレス、ポート、またはURIスペースなし)に関して
HTTPSの影響を持ちません。しかし、この方法をサポートする実装はほとんどありません。
S-HTTPにおいては、要求されたURLは平文のヘッダーでは送信されず、空白のままになります。
暗号化されたペイロード内に別のヘッダーのセットが存在します。HTTP over TLSでは、すべてのヘッダーが
暗号化されたペイロード内に存在し、サーバーアプリケーションは通常、TLSの致命的なエラー(例:「クライアント証明書が信頼されていない」や「クライアント証明書の有効期限が切れている」)から正常に回復する機会がありません。
まとめ
S-HTTPは、HTTP通信を
暗号化する初期の試みでしたが、
HTTPSに取って代わられました。
HTTPSは、通信全体を
暗号化することでより高いセキュリティを提供し、現在ではウェブ通信の標準となっています。S-HTTPは、その技術的なアプローチと
HTTPSとの違いを理解する上で、歴史的な観点から興味深いプロトコルと言えるでしょう。
出典
* RFC 2660 The Secure HyperText Transfer Protocol