2016-03-21 26 views
0

Androidデバイス(クライアント)とC#Serverをソケットで接続しようとしています。署名付き証明書を使用しています。C#サーバに接続するJavaクライアントSSL

マシンはお互いを見て、安全に接続しようとします。 Androidの場合を除いて、私は休暇中のエラーを取得しています。

javax.net.ssl.SSLProtocolException: Read error: ssl=0xa1f1c840: Failure in SSL library, usually a protocol error 
error:100bd10c:SSL routines:ssl3_get_record:WRONG_VERSION_NUMBER (external/boringssl/src/ssl/s3_pkt.c:305 0xabf3fd97:0x00000000) 
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method) 
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:705) 
...rest of stack trace 

このエラーを解決するソリューションを私に提供できますか?または、ソケットを使用して適切なSSL接続を行う方法について、インターネット上の情報が不十分であるため、例とのリンクを使用して可能にするクライアントおよび/またはサーバー側のライブラリに。

私はこれはアンドロイド

SSLSocketFactory factory=(SSLSocketFactory) SSLSocketFactory.getDefault(); 
SSLSocket socket=(SSLSocket) factory.createSocket(ip, port); 
DataStream stream = new DataStream(socket); 
Log.v("Log",stream.ReadString() + ""); 
stream.Write("2012"); 

データストリームクラス

にサーバーのバージョン

//Server start 
X509Certificate2 cert = new X509Certificate2(cert, pass); 
TcpListener server = new TcpListener(ip, port); 
server.Start(); 
while (running) 
     { 
      TcpClient tcpClient = server.AcceptTcpClient(); 
      Client client = new Client(this, tcpClient); 
      //In constructor I'm starting a new thread with method below 
     } 

//Method mentioned above 
void SetupConn() 
{ 
     NetworkStream netStream = client.GetStream(); 
     SslStream ssl = new SslStream(netStream, false); 
     ssl.AuthenticateAsServer(prog.cert, false, SslProtocols.Tls, true); 
     dataStream = new DataStream(client.Client); 
     dataStream.Write("2012"); 
     int hello = dataStream.ReadString(); 
     ... //Handling connection 
} 

//DataStream class 
public DataStream(Socket clientSocket) 
{ 
    _clientSocket = clientSocket; 
} 
public void Write(string message) 
{ 
    int toSendLen = Encoding.ASCII.GetByteCount(message); 
    byte[] toSendBytes = Encoding.ASCII.GetBytes(message); 
    byte[] toSendLenBytes = BitConverter.GetBytes(toSendLen); 
    _clientSocket.Send(toSendLenBytes); 
    _clientSocket.Send(toSendBytes); 
} 
public String ReadString() 
{ 
    byte[] rcvLenBytes = new byte[4]; 
    _clientSocket.Receive(rcvLenBytes); 
    int rcvLen = BitConverter.ToInt32(rcvLenBytes, 0); 
    byte[] rcvBytes = new byte[rcvLen]; 
    _clientSocket.Receive(rcvBytes); 
    var ascii = Encoding.ASCII.GetString(rcvBytes); 
    return ascii; 
} 

今簡素化クライアントに簡略化されたもの2.

との間の接続を行うために使用しているコード

public void Write(String message) { 
    byte[] toSendBytes = message.getBytes(); 
    int toSendLen = toSendBytes.length; 
    byte[] toSendLenBytes = new byte[4]; 
    toSendLenBytes[0] = (byte) (toSendLen & 0xff); 
    toSendLenBytes[1] = (byte) ((toSendLen >> 8) & 0xff); 
    toSendLenBytes[2] = (byte) ((toSendLen >> 16) & 0xff); 
    toSendLenBytes[3] = (byte) ((toSendLen >> 24) & 0xff); 
    try { 
     os.write(toSendLenBytes); 
     os.write(toSendBytes); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
public String ReadString() { 
    byte[] lenBytes = new byte[4]; 
    try { 
     is.read(lenBytes, 0, 4); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16) | 
      ((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff)); 
    byte[] receivedBytes = new byte[len]; 
    try { 
     is.read(receivedBytes, 0, len); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return new String(receivedBytes, 0, len); 
} 

AndroidのAPI 23

C#の.Net 4.5

答えて

0

はanwserは、このエラーのビット奇妙ですが、最後に、私はそれを修正するために管理します。

問題は、C#DataStreamクラスの魔女のソケットにありました。その代わりに、私はSSLStreamを使ってクライアントからのデータの書き込みと読み取りを行うべきです。私はこれがBinaryWriterとBinaryReaderを使うのではなく、IOを自分で管理しようとする人にとってはよくある間違いかもしれないと思う。

SSLStream _clientSocket; 
//DataStream class 
public DataStream(SSLStream clientSocket) 
{ 
    _clientSocket = clientSocket; 
} 
public void Write(string message) 
{ 
    int toSendLen = Encoding.ASCII.GetByteCount(message); 
    byte[] toSendBytes = Encoding.ASCII.GetBytes(message); 
    byte[] toSendLenBytes = BitConverter.GetBytes(toSendLen); 
    _clientSocket.Write(toSendLenBytes); 
    _clientSocket.Write(toSendBytes); 
} 
public String ReadString() 
{ 
    byte[] rcvLenBytes = new byte[4]; 
    _clientSocket.Read(rcvLenBytes, 0 , 4); 
    int rcvLen = BitConverter.ToInt32(rcvLenBytes, 0); 
    byte[] rcvBytes = new byte[rcvLen]; 
    _clientSocket.Read(rcvBytes, 0, rcvLen); 
    var ascii = Encoding.ASCII.GetString(rcvBytes); 
    return ascii; 
} 
関連する問題