Module java.base
Package javax.net.ssl

Class SSLServerSocket

java.lang.Object
java.net.ServerSocket
javax.net.ssl.SSLServerSocket
所有已实现的接口:
Closeable, AutoCloseable

public abstract class SSLServerSocket extends ServerSocket
此类扩展了ServerSocket,并使用诸如安全套接字层(SSL)或传输层安全性(TLS)协议提供安全服务器套接字。

通常使用SSLServerSocketFactory创建此类的实例。 SSLServerSocket的主要功能是通过accept接受连接来创建SSLSocket

SSLServerSocket包含几个状态数据,这些数据在套接字创建时由SSLSocket继承。 这些数据包括启用的密码套件和协议,是否需要客户端身份验证,以及创建的套接字是否应该在客户端或服务器模式下开始握手。 通过调用适当的方法,可以覆盖创建的SSLSocket继承的状态。

自 JDK 版本:
1.4
参见:
  • Constructor Details

    • SSLServerSocket

      protected SSLServerSocket() throws IOException
      仅由子类使用。

      使用默认身份验证上下文创建一个未绑定的 TCP 服务器套接字。

      抛出:
      IOException - 如果创建套接字时发生 I/O 错误
    • SSLServerSocket

      protected SSLServerSocket(int port) throws IOException
      仅由子类使用。

      在端口上创建一个 TCP 服务器套接字,使用默认身份验证上下文。 在系统开始拒绝新连接请求之前,连接队列的默认值为五十个连接。

      端口号0会在任何空闲端口上创建套接字。

      如果存在安全管理器,则将使用port参数调用其checkListen方法以确保允许该操作。 这可能导致 SecurityException。

      参数:
      port - 要监听的端口
      抛出:
      IOException - 如果创建套接字时发生 I/O 错误
      SecurityException - 如果存在安全管理器并且其checkListen方法不允许该操作。
      IllegalArgumentException - 如果端口参数超出有效端口值范围,即介于 0 和 65535 之间(包括边界值)。
      参见:
    • SSLServerSocket

      protected SSLServerSocket(int port, int backlog) throws IOException
      仅由子类使用。

      在端口上创建一个 TCP 服务器套接字,使用默认身份验证上下文和指定的连接队列。 连接队列的请求最大连接数是实现特定的。 特别地,实现可能会施加最大长度,或者可能选择完全忽略该参数。 提供的值应大于0。 如果小于或等于0,则将使用特定于实现的默认值。

      如果存在安全管理器,则将使用port参数调用其checkListen方法以确保允许该操作。 这可能导致 SecurityException。

      参数:
      port - 要监听的端口
      backlog - 请求的最大连接队列长度。
      抛出:
      IOException - 如果创建套接字时发生 I/O 错误
      SecurityException - 如果存在安全管理器并且其checkListen方法不允许该操作。
      IllegalArgumentException - 如果端口参数超出有效端口值范围,即介于 0 和 65535 之间(包括边界值)。
      参见:
    • SSLServerSocket

      protected SSLServerSocket(int port, int backlog, InetAddress address) throws IOException
      仅由子类使用。

      在端口上创建一个 TCP 服务器套接字,使用默认身份验证上下文和指定的连接队列,以及特定指定的网络接口。 此构造函数用于多宿主主机,例如用作防火墙或路由器的主机,以控制通过哪个接口提供网络服务。

      如果存在安全管理器,则将使用port参数调用其checkListen方法以确保允许该操作。 这可能导致 SecurityException。

      端口号0会在任何空闲端口上创建套接字。

      backlog参数是套接字上请求的最大挂起连接数。 其确切语义是特定于实现的。 特别地,实现可能会施加最大长度或可能选择完全忽略该参数。 提供的值应大于0。 如果小于或等于0,则将使用特定于实现的默认值。

      如果address为 null,则默认接受所有本地地址上的连接。

      参数:
      port - 要监听的端口
      backlog - 请求的最大连接队列长度。
      address - 将接受连接的网络接口的地址
      抛出:
      IOException - 如果创建套接字时发生 I/O 错误
      SecurityException - 如果存在安全管理器并且其checkListen方法不允许该操作。
      IllegalArgumentException - 如果端口参数超出有效端口值范围,即介于 0 和 65535 之间(包括边界值)。
      参见:
  • Method Details

    • getEnabledCipherSuites

      public abstract String[] getEnabledCipherSuites()
      返回当前为新接受连接启用的密码套件列表。

      如果此列表尚未明确修改,则系统提供的默认值保证所有启用的密码套件具有最低质量服务。

      请注意,即使启用了密码套件,也可能永远不会使用。 如果对等方不支持它,或者其使用受限制,或者该套件所需的证书(和私钥)不可用,或者启用了匿名套件但需要身份验证,则可能会发生这种情况。

      返回的数组包括来自 Java 安全标准算法名称规范的JSSE Cipher Suite Names部分中的标准密码套件名称列表,还可能包括提供程序支持的其他密码套件。

      返回:
      启用的密码套件数组
      参见:
    • setEnabledCipherSuites

      public abstract void setEnabledCipherSuites(String[] suites)
      设置可用于接受连接的密码套件。

      密码套件必须已在getSupportedCipherSuites()中列出为受支持。成功调用此方法后,只有在参数中列出的套件才能用于启用。

      需要身份验证信息的套件,如果在此ServerSocket的身份验证上下文中不可用,则无论如何都不会被使用。

      请注意,标准密码套件名称列表可以在Java安全标准算法名称规范的JSSE密码套件名称部分中找到。提供程序可能支持未在此列表中找到的密码套件名称,或者可能不使用某个密码套件的推荐名称。

      accept()返回的SSLSocket会继承此设置。

      参数:
      suites - 要启用的所有密码套件的名称
      抛出:
      IllegalArgumentException - 当参数命名的一个或多个密码套件不受支持,或者参数为null时。
      参见:
    • getSupportedCipherSuites

      public abstract String[] getSupportedCipherSuites()
      返回可用于SSL连接的密码套件的名称。

      通常,默认情况下只有这些密码套件的子集会被启用,因为此列表可能包括不符合这些默认服务质量要求的密码套件。这些密码套件在专门的应用程序中很有用。

      返回的数组包括Java安全标准算法名称规范中JSSE密码套件名称列表中的标准密码套件,还可能包括提供程序支持的其他密码套件。

      返回:
      一个密码套件名称数组
      参见:
    • getSupportedProtocols

      public abstract String[] getSupportedProtocols()
      返回可用于使用的协议的名称。
      返回:
      支持的协议名称数组
      参见:
    • getEnabledProtocols

      public abstract String[] getEnabledProtocols()
      返回当前新接受连接可用于使用的协议的名称。

      请注意,即使启用了协议,也可能永远不会被使用。如果对等方不支持协议,或者其使用受限制,或者没有受协议支持的启用密码套件,则可能会发生这种情况。

      返回:
      协议名称数组
      参见:
    • setEnabledProtocols

      public abstract void setEnabledProtocols(String[] protocols)
      控制接受连接可用于使用的特定协议。

      协议必须已在getSupportedProtocols()中列出为受支持。成功调用此方法后,只有在参数中列出的协议才能用于启用。

      accept()返回的SSLSocket会继承此设置。

      参数:
      protocols - 要启用的所有协议的名称。
      抛出:
      IllegalArgumentException - 当参数命名的一个或多个协议不受支持,或者协议参数为null时。
      参见:
    • setNeedClientAuth

      public abstract void setNeedClientAuth(boolean need)
      控制accept的服务器模式SSLSockets是否最初配置为需要客户端身份验证。

      套接字的客户端身份验证设置如下:

      • 需要客户端身份验证
      • 请求客户端身份验证
      • 不需要客户端身份验证

      setWantClientAuth(boolean)不同,如果接受的套接字选项已设置且客户端选择不提供有关自身的身份验证信息,协商将停止并且连接将被断开

      调用此方法会覆盖此方法或setWantClientAuth(boolean)之前的任何设置。

      初始继承的设置可以通过调用SSLSocket.setNeedClientAuth(boolean)SSLSocket.setWantClientAuth(boolean)来覆盖。

      参数:
      need - 如果需要客户端身份验证,则设置为true;如果不需要客户端身份验证,则设置为false。
      参见:
    • getNeedClientAuth

      public abstract boolean getNeedClientAuth()
      如果新accept的服务器模式SSLSocket上将需要客户端身份验证,则返回true。

      初始继承的设置可以通过调用SSLSocket.setNeedClientAuth(boolean)SSLSocket.setWantClientAuth(boolean)来覆盖。

      返回:
      如果需要客户端身份验证,则返回true;如果不需要客户端身份验证,则返回false。
      参见:
    • setWantClientAuth

      public abstract void setWantClientAuth(boolean want)
      控制accept的服务器模式SSLSockets是否最初配置为请求客户端身份验证。

      套接字的客户端身份验证设置如下:

      • 需要客户端身份验证
      • 请求客户端身份验证
      • 不需要客户端身份验证

      setNeedClientAuth(boolean)不同,如果接受的套接字选项已设置且客户端选择不提供有关自身的身份验证信息,协商将继续

      调用此方法会覆盖此方法或setNeedClientAuth(boolean)之前的任何设置。

      初始继承的设置可以通过调用SSLSocket.setNeedClientAuth(boolean)SSLSocket.setWantClientAuth(boolean)来覆盖。

      参数:
      want - 如果请求客户端身份验证,则设置为true;如果不需要客户端身份验证,则设置为false。
      参见:
    • getWantClientAuth

      public abstract boolean getWantClientAuth()
      如果新接受的服务器模式连接上将请求客户端身份验证,则返回true。

      初始继承的设置可以通过调用SSLSocket.setNeedClientAuth(boolean)SSLSocket.setWantClientAuth(boolean)来覆盖。

      返回:
      如果请求客户端身份验证,则返回true;如果不需要客户端身份验证,则返回false。
      参见:
    • setUseClientMode

      public abstract void setUseClientMode(boolean mode)
      控制接受连接是处于(默认)SSL服务器模式还是SSL客户端模式。

      服务器通常会对自身进行身份验证,而客户端则无需这样做。

      在罕见情况下,TCP服务器需要在新接受的连接上以SSL客户端模式操作。例如,FTP客户端获取服务器套接字并在那里监听服务器的反向连接。FTP客户端将使用“客户端”模式的SSLServerSocket来接受反向连接,而FTP服务器将使用禁用“客户端”模式的SSLSocket来启动连接。在结果的握手期间,现有的SSL会话可能会被重用。

      accept()返回的SSLSocket会继承此设置。

      参数:
      mode - 如果新接受的连接应使用SSL客户端模式,则为true。
      参见:
    • getUseClientMode

      public abstract boolean getUseClientMode()
      如果接受的连接将处于SSL客户端模式,则返回true。
      返回:
      如果连接应使用SSL客户端模式,则返回true。
      参见:
    • setEnableSessionCreation

      public abstract void setEnableSessionCreation(boolean flag)
      控制是否允许从此服务器套接字创建的套接字建立新的SSL会话。

      accept()返回的SSLSocket会继承此设置。

      参数:
      flag - true表示可以创建会话;这是默认设置。false表示必须恢复现有会话。
      参见:
    • getEnableSessionCreation

      public abstract boolean getEnableSessionCreation()
      如果允许从此服务器套接字创建的套接字建立新的SSL会话,则返回true。
      返回:
      true表示可以创建会话;这是默认设置。false表示必须恢复现有会话。
      参见:
    • getSSLParameters

      public SSLParameters getSSLParameters()
      返回新接受连接的SSLParameters。返回的SSLParameters的密码套件和协议始终为非null。
      返回:
      新接受连接的SSLParameters
      自:
      1.7
      参见:
    • setSSLParameters

      public void setSSLParameters(SSLParameters params)
      将SSLParameters应用于新接受的连接。

      这意味着:

      • 如果params.getCipherSuites()非null,则使用该值调用setEnabledCipherSuites()
      • 如果params.getProtocols()非null,则使用该值调用setEnabledProtocols()
      • 如果params.getNeedClientAuth()params.getWantClientAuth()返回true,则分别调用setNeedClientAuth(true)setWantClientAuth(true);否则调用setWantClientAuth(false)
      • 如果params.getServerNames()非null,则套接字将使用该值配置其服务器名称。
      • 如果params.getSNIMatchers()非null,则套接字将使用该值配置其SNI匹配器。
      参数:
      params - 参数
      抛出:
      IllegalArgumentException - 如果调用setEnabledCipherSuites()或setEnabledProtocols()失败
      自:
      1.7
      参见: