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