2016-11-14 22 views
0

SSL/TLSで追加するオーバーヘッドはいくらですか?なぜTLSが遅いのですか?

私はOpenSSL 1.0.1fとPython 3.4.3でUbuntu 14.04を使用しています。

test.py

from datetime import datetime 
import socket 
import ssl 

with socket.socket() as server: 
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    server.bind(('', 8001)) 
    server.listen(1) 
    while True: 
     with server.accept()[0] as client: 
      start = datetime.now() 
      client = ssl.wrap_socket(client, 'key.pem', 'cert.pem', True) 
      end = datetime.now() 
      print('{:.0f}ms'.format((end - start).total_seconds() * 1000)) 
      client.send(b'hello') 
      client.shutdown(socket.SHUT_RDWR) 
がサーバー

$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes 
$ python3 test.py 

を起動したとしても、同じホスト上で

$ for i in $(seq 20); do openssl s_client -cert cert.pem -key key.pem -connect localhost:8001; done 
$ # output shows TLSv1.2 is being used 

を接続

TLSネゴシエーションは15msのを取っています。 TLSを削除すると、接続、転送、シャットダウン全体が< 1msと測定されます。

私はここで多くの経験はありませんが、これは私が期待するよりもかなり遅いようです。これは数百万クロックサイクルです。 LAからニューヨークへの移動よりも遅いです。

(1)このパフォーマンスは、私が期待するべきものと同じですか? (2)このパフォーマンスの原因となる制限要因は何ですか? (3)このコードを変更して、最初のTLSネゴシエーションを高速化できますか?

+0

[このページ](https:// zoompf。com/blog/2014/12/optimizing-tls-handshake)は、ネットワークの待ち時間のために典型的な250〜500msです。同じホスト上で15msがうまくいくようです(DH鍵交換が計算集約的であるため、おそらく数百万クロックサイクルを使用しています)。そのトリックは、接続を開いたままにして、一度だけ行う必要があるようにすることです。 – kindall

答えて

3
  • TLSは7件のTCP旅行暗号関与があるため、暗号化層
  • を確立する(RSA、DHEは、...)

15msの処理を行いますので、そのくらい本当にないです。

3

プレーンなTCPの場合、待ち時間とリソース使用を最小限に抑えるために、OSカーネル内で完全に処理される単一のTCPハンドシェイク(1 RTT)があります。

TLSとコードでは、に加えて、に完全なTLSハンドシェイクがあります。これは、コードがセッションの再利用を行わないためです。これは、毎回鍵交換のためのハンドシェイクと重い暗号のための2つのRTT(暗号に応じて影響)を意味します。また、(カーネル内の)TCPシャットダウンの上に、順序付きTLSシャットダウンのための追加のRTTもあります。また、TCPハンドシェイクの場合よりも多くのデータが転送され、TLSハンドシェイクがユーザ空間で完全に行われ、スケジューリング、データの読み書きのための多くのシステムコール、カーネルとユーザスペース間のコンテキストスイッチおよびコピーこれらのシステムコール。また、不要なオーバーヘッドを追加する証明書の読み込みなど、毎回新しいSSLコンテキストを設定します。

同じシステムにクライアントとサーバーがあり、クライアント証明書も使用するため、このオーバーヘッドはすべて同じシステムで2回行われます。 さらに、TLSハンドシェークに必要な時間(TLSの最も高価な部分)のみを測定するため、ごくわずかなデータ(TLSハンドシェイクだけでは必要以上に少ない)を転送することはありません。また、単一のスレッド化されたクライアントと単一のスレッド化されたサーバーがあるため、それぞれが速度制限になる可能性があります。

つまり、ベンチマークでは、実際の一般的なシナリオでのTLSとTCPの実際のオーバーヘッドが反映されていません。しかし、それは、TLSが非常に単純な方法で使用される場合、すなわち、多くのTLSを実行するアプリケーションによって典型的に行われる最適化なしで、顕著な影響を有することを示している。

関連する問題