2017-09-07 13 views
2

以下のコードでハンドシェイク中にエラーGot TLS error: FATAL alert returned by server: HANDSHAKE_FAILUREが発生しました。何が問題なのでしょうか?TLSエラーが発生しました:サーバーによって致命的な警告が返されました:HANDSHAKE_FAILURE

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from __future__ import with_statement 
from __future__ import print_function 
try: 
    # This import works from the project directory 
    from scapy_ssl_tls.ssl_tls import * 
except ImportError: 
    # If you installed this package via pip, you just need to execute this 
    from scapy.layers.ssl_tls import * 

tls_version = TLSVersion.TLS_1_2 
ciphers = [TLSCipherSuite.ECDHE_RSA_WITH_AES_128_GCM_SHA256] 
# ciphers = [TLSCipherSuite.ECDHE_RSA_WITH_AES_256_CBC_SHA384] 
# ciphers = [TLSCipherSuite.RSA_WITH_AES_128_CBC_SHA] 
# ciphers = [TLSCipherSuite.RSA_WITH_RC4_128_SHA] 
# ciphers = [TLSCipherSuite.DHE_RSA_WITH_AES_128_CBC_SHA] 
# ciphers = [TLSCipherSuite.DHE_DSS_WITH_AES_128_CBC_SHA] 
extensions = [TLSExtension()/TLSExtECPointsFormat(), 
       TLSExtension()/TLSExtSupportedGroups()] 


def tls_client(ip): 
    with TLSSocket(client=True) as tls_socket: 
     try: 
      print("kooo") 
      tls_socket.connect(ip) 
      print("Connected to server: %s" % (ip,)) 
     except socket.timeout: 
      print("Failed to open connection to server: %s" % (ip,), file=sys.stderr) 
     else: 
      try: 
       server_hello, server_kex = tls_socket.do_handshake(tls_version, ciphers, extensions) 
       server_hello.show() 
       tls_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, 20) 
      except TLSProtocolError as tpe: 
       print("Got TLS error: %s" % tpe, file=sys.stderr) 
       tpe.response.show() 
      else: 
       resp = tls_socket.do_round_trip(TLSPlaintext(data="GET/HTTP/1.1\r\nHost: pirate.trade\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n")) 
       print("Got response from server") 
       resp.show() 
      # finally: 
      #  print(tls_socket.tls_ctx) 


if __name__ == "__main__": 
    if len(sys.argv) > 2: 
     server = (sys.argv[1], int(sys.argv[2])) 
    else: 
     server = ("pirate.trade", 443) 
tls_client(server) 

上記のコードはこのリンクです。 https://github.com/tintinweb/scapy-ssl_tls/blob/master/examplesfull_rsa_connection_with_application_data.py

+0

私の推測では、サーバーpirate.tradeに必要なSNI拡張機能がないためです。 –

+0

@SteffenUllrichここでSNI拡張機能を追加するにはどうすればいいですか? – tarun14110

答えて

1

pirate.tradeに対して示されているコードを実行する場合、2つの問題があります。

ECDSA暗号だけをサポートしているため、ECDSA暗号のみがサポートされています。これは、例えば、報告された暗号または証明書を見るときにthe SSLLabs reportを見て見ることができます。第二の問題は、サイトがSNI TLS拡張を必要とすることである

ciphers = [TLSCipherSuite.ECDHE_ECDSA_WITH_AES_128_GCM_SHA256] 

暗号ECDSAを提供し、このラインでのみRSA暗号に

ciphers = [TLSCipherSuite.ECDHE_RSA_WITH_AES_128_GCM_SHA256] 

を提供し、この行を置き換える修正します。また、これはSSLLabsから報告見ることができます。

This site works only in browsers with SNI support.

この拡張は、既存の拡張子を変更することで追加することができます

extensions = [TLSExtension()/TLSExtECPointsFormat(), 
       TLSExtension()/TLSExtSupportedGroups(), 
       TLSExtension()/TLSExtServerNameIndication(server_names=TLSServerName(data="pirate.trade"))] 

両方の修正は、ハンドシェイクが成功して行われている場合にのみ。

関連する問題