2016-05-26 24 views
1

私は、ファイルと文字列を通信し、転送するためにPython上のクライアントとJava上のサーバを構築しています。私は最初に(サーバーとクライアントを接続する以外に)行う必要があると思っていますが、SSLハンドシェイクは完了です。以下は、私のPythonクライアントコードと私が実装したJavaサーバコードです:クライアントとサーバとのSSLハンドシェイクの失敗

のPythonクライアントコード

import socket 
import ssl 
import struct 
import io 
import threading 
import optparse 
import os 
import sys 

HOST = "localhost" 
PORT = 777 
ADDR = (HOST,PORT) 




def sock_connection(): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    time.sleep(1) 
    ssl_sock = ssl.wrap_socket(sock) 
    try: 
     time.sleep(1) 
     ssl_sock.connect(ADDR) 
     print('CONNECTED!') 
    except socket.error as e: 
     print('ERROR', e) 
     exit(1) 
    return ssl_sock 

def main(): 
    sock_connection() 

main() 

のJava Serverコード:

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map.Entry; 
import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import javax.net.ssl.SSLServerSocket; 
import javax.net.ssl.SSLServerSocketFactory; 
import javax.net.ssl.SSLSocket; 



    public 
    class Server { 
    private static final int PORT = 777; 

    public 
      static 
    void 
      main(String[] arstring) { 
     try { 
      SSLServerSocketFactory sslserversocketfactory = 
        (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
      SSLServerSocket sslserversocket = 
        (SSLServerSocket) sslserversocketfactory.createServerSocket(PORT); 
      SSLSocket sslsocket = (SSLSocket) sslserversocket.accept(); 

      InputStream inputstream = sslsocket.getInputStream(); 
      InputStreamReader inputstreamreader = new InputStreamReader(inputstream); 
      BufferedReader bufferedreader = new BufferedReader(inputstreamreader); 

      String string = null; 
      while ((string = bufferedreader.readLine()) != null) { 
       System.out.println(string); 
       System.out.flush(); 
      } 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

私は正常に実行され、最初のサーバーを実行します私はクライアントを実行し、私は、サーバーの端末で次のエラーが表示されます:

javax.net.ssl.SSLHandshakeException:共通の暗号スーツなし

とPythonで次

ERROR [SSL:SSLV3_ALERT_HANDSHAKE_FAILURE]のSSLv3警告ハンドシェイクに失敗(_ssl.c:645)

任意およびすべてのヘルプをいただければ幸いです。

おかげ

答えて

0

javax.net.ssl.SSLHandshakeException:これは、サーバーはありません、これすなわちオーバーラップとのみをサポートしていないクライアントがサポートされていない暗号化することを意味し、共通の

で無暗号スーツ認証と暗号化に使用できる共通の暗号。

あなたのサーバーのソースコードを考えれば、サーバーが使用する証明書をセットアップすることができなかったと思います。この場合、匿名認証のみが可能で、SSLクライアントではこの暗号は通常有効ではありません(ブラウザでも有効になりません)。

+0

ありがとうございました! ああ、私は参照してください。さて、サーバーで使用する証明書をセットアップして、クライアントが証明書が有効であることをどのように確認する必要がありますか? –

+0

@ D.Crusaf:はい、証明書をセットアップする必要があります。クライアントがそれを受け入れるかどうかは、誰が証明書を発行したか、およびクライアントがこの発行者を信頼しているかどうかによって決まります。 TLSがどのように機能し、どのように証明書検証がより詳細に行われるかを説明することは、この質問の範囲外です。私は[SSL/TLSはどのように動作するのですか?](http://security.stackexchange.com/questions/20803/how-does-ssl-tls-work)を読むことをお勧めします。 –

+0

ありがとうございました!私はサーバーの証明書を作成しようとします。リンクありがとう、非常に感謝します。 –

0

SSLV3はセキュリティの弱点のために推奨されていません。サーバーがSSLV3プロトコルを認識しないうちに、クライアントがSSLV3プロトコルを使用しようとしています。

次のいずれかを実行できます

  • はSSLV3(私はお勧めでしょうではないものを)
  • が明示的にSSLV3に基づいて、任意のプロトコルを使用しないように、あなたのpythonのクライアントであなたのソケットを設定できるようにサーバーを設定します。代わりにTLSを使用できます。通常は、使用されているSocketFactoryをオーバーライドすることでそれを実行します。

Javaの世界では、Java 1.6でクライアントを使用するときにこの問題が発生します。 Java 1.7では、SSLV3Helloのデフォルト使用が削除されました。

+0

私は最新のJavaバージョンを持っていて、クライアントはPythonになっています。私はTomcatが何であるか本当に分かっていませんが、私はちょうど私が書いたいくつかのスクリプトで私のcmdを使用しています。 私は使用されるSocketFactoryをオーバーライドしようとします! ありがとうございます! –

+0

あなたはTomcatについて間違いありません。私はあまりにもformatedだ、それについて忘れてしまった。私は私の答えを編集します。 とにかく、問題は同じです。クライアントがハンドシェイクSSLV3用に使用しており、サーバーがそれを拒否しています。 TLSを使用するようにクライアントを構成する必要があります。 –

+0

申し訳ありません、入力いただきありがとうございます。私はTLSの使い方を正確には分かっていませんが、私はそれを理解するために最善を尽くします。再度、感謝します! –