客户端和服务器的SSL握手失败

时间:2016-05-26 05:24:30

标签: java python ssl sslhandshakeexception

所以我在Python上构建一个客户端,在Java上构建一个服务器来传递和传输文件和字符串。我认为我必须做的第一件事(除了连接服务器和客户端)就完成了SSL握手。以下是我实现的Python客户端代码和Java服务器代码:

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:

错误[SSL:SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3警报握手失败(_ssl.c:645)

非常感谢任何和所有帮助。

由于

2 个答案:

答案 0 :(得分:0)

  

javax.net.ssl.SSLHandshakeException:没有共同的密码

这意味着服务器仅支持客户端不支持的密码,即没有重叠,因此没有可用于身份验证和加密的通用密码。

根据您服务器的源代码,我的猜测是您错过了设置服务器应该使用的证书。在这种情况下,只能进行匿名身份验证,并且SSL客户端通常不会启用此密码(也不会在浏览器中启用)。

答案 1 :(得分:0)

由于安全漏洞,SSLV3已被弃用。您的客户端正在尝试使用SSLV3协议,而服务器甚至无法识别它。

你可以:

  • 设置服务器以允许SSLV3(不是我建议的)
  • 在python客户端中配置您的套接字,以明确不使用任何基于SSLV3的协议。您可以使用TLS代替。您通常希望通过覆盖使用的SocketFactory来实现。

在Java世界中,我们在java 1.6中使用客户端时遇到此问题。 Java 1.7已删除了SSLV3Hello的默认使用。