Java-Client中的单向SSL服务器套接字可以是SSL或非SSL

Java-Client中的单向SSL服务器套接字可以是SSL或非SSL,java,sockets,ssl,Java,Sockets,Ssl,我想创建一个通过SSLServerSocket(单向SSL)进行通信的服务器,以便客户端可以验证服务器(服务器不需要验证客户端) 但我不想强制执行单向SSL。意味着如果客户端希望从普通套接字(而不是在其信任存储中具有我的公共证书的SSLSocket)发送请求,它仍应允许连接。 意味着客户端可以通过Socket或SSLSocket进行连接,这两种方式都可以 我已经尝试实现了这一点,所以我创建了一个SSLServerSocket,在其中添加了我的密钥库(其中包含服务器的私钥)。通过SSLSocket

我想创建一个通过SSLServerSocket(单向SSL)进行通信的服务器,以便客户端可以验证服务器(服务器不需要验证客户端)

但我不想强制执行单向SSL。意味着如果客户端希望从普通套接字(而不是在其信任存储中具有我的公共证书的SSLSocket)发送请求,它仍应允许连接。 意味着客户端可以通过Socket或SSLSocket进行连接,这两种方式都可以

我已经尝试实现了这一点,所以我创建了一个SSLServerSocket,在其中添加了我的密钥库(其中包含服务器的私钥)。通过SSLSocket(客户端),它正在工作。但当我试图连接套接字(非ssl客户端)时,它给出了一个异常。 “无法识别的SSL消息,纯文本连接?”

请建议

编辑1 根据我的评论,我可以说这个问题有两种可能的解决方案

  • 使用两个不同的端口,一个用于SSL,另一个用于非SSL
  • 对于两个连接,都使用单端口。一旦服务器接收到连接,它将检测客户端是否发送非SSL或SSL请求。如果是SSL请求,它会将其转换为SSLSocket
  • 第一点很容易实现。对于第二点,有两部分,第一部分检测连接是否为SSL。第二部分,如果SSL将套接字转换为SSLSocket。我能够实现第二部分,并且能够成功地将套接字转换为SSLSocket。对于第一部分,我正在努力解决如何识别连接是否为SSL(如何检测客户端发送“SSL Hello client”)

    经过搜查,我发现了这个

    这段代码正在检测连接是SSL还是非SSL。但我无法理解这是什么逻辑

    if(fingerPrint[0] == 0x16 && fingerPrint[1] == 0x03 && fingerPrint[5]
    == 0x01)
        return true;
    else
        return false;
    
    这个逻辑正确可靠吗


    这个逻辑是如何检测SSL连接的?

    在不同端口上双向侦听怎么样?@gusto2-同一个端口侦听来自SSLSocket和非SSLSocket的连接请求。我知道。我是问你为什么要把它复杂化。理论上,您可以使用缓冲流,检查客户端是否发送了“SSL Hello client”消息,并重置流。我只是不明白为什么可以使用两个端口。这是可能的,但远不容易。不推荐。@dave:除非是人工约束的家庭作业,我认为“双”用途端口的想法是不好的。真的没有理由做比必要的更复杂的事情
    if(fingerPrint[0] == 0x16 && fingerPrint[1] == 0x03 && fingerPrint[5]
    == 0x01)
        return true;
    else
        return false;