- java.lang.Object
-
- java.net.Socket
-
- javax.net.ssl.SSLSocket
-
- 实现的所有接口
-
Closeable
,AutoCloseable
public abstract class SSLSocket extends Socket
此类扩展Socket
并使用诸如“安全套接字层”(SSL)或IETF“传输层安全性”(TLS)协议之类的协议提供安全套接字。这种套接字是普通的流套接字,但它们在底层网络传输协议(如TCP)上添加了一层安全保护。 这些保护措施包括:
- 诚信保护 。 SSL可防止活动窃听器修改消息。
- 身份验证 在大多数模式下,SSL提供对等身份验证。 服务器通常经过身份验证,客户端可以按服务器的请求进行身份验证。
- 保密(隐私保护) 。 在大多数模式中,SSL会加密客户端和服务器之间发送的数据。 这样可以保护数据的机密性,使被动窃听器不会看到敏感数据,如财务信息或多种个人信息。
这些类型的保护由“密码套件”指定,“密码套件”是给定SSL连接使用的加密算法的组合。 在协商过程中,两个端点必须就两种环境中都可用的密码套件达成一致。 如果没有这样的套件,则不能建立SSL连接,也不能交换数据。
使用的密码套件由称为“握手”的协商过程建立。 此过程的目标是创建或重新加入“会话”,这可能会随着时间的推移保护许多连接。 握手完成后,您可以使用getSession方法访问会话属性。 可以通过以下三种方式之一启动此连接上的初始握手:
- 打电话给
startHandshake
明确地开始握手,或者 - 任何在此套接字上读取或写入应用程序数据的尝试都会导致隐式握手,或者
- 如果当前没有有效会话,则调用
getSession
尝试设置会话,并完成隐式握手。
如果握手因任何原因失败,
SSLSocket
将关闭,无法进行进一步的通信。在管理密码套件时,您需要了解两组密码套件:
- 支持的密码套件:SSL实现支持的所有套件。 使用getSupportedCipherSuites报告此列表。
- 启用密码套件,可能少于全套支持套件。 使用setEnabledCipherSuites方法设置此组,并使用getEnabledCipherSuites方法进行查询。 最初,将在新套接字上启用一组默认密码套件,表示最小建议配置。
实现默认值要求默认情况下仅启用对服务器进行身份验证并提供机密性的密码套件。 只有当双方明确同意未经认证和/或非私人(未加密)的通信时,才会选择这样的密码套件。
首次创建
SSLSocket
,不会进行握手,以便应用程序可以首先设置其通信首选项:要使用的密码套件,套接字应该处于客户端还是服务器模式等等。但是,安全性总是在应用程序数据通过连接发送。您可以注册接收握手完成的事件通知。 这涉及使用另外两个类。 HandshakeCompletedEvent对象被传递给HandshakeCompletedListener实例,这些实例由此API的用户注册。 一个
SSLSocket
被创建SSLSocketFactory
,或通过accept
荷兰国际集团从一个连接SSLServerSocket
。SSL套接字必须选择在客户端或服务器模式下运行。 这将决定谁开始握手过程,以及每一方应发送哪些消息。 每个连接必须有一个客户端和一个服务器,否则握手将无法正常进行。 初始握手开始后,即使执行重新协商,套接字也无法在客户端和服务器模式之间切换。
- API Note:
-
当不再需要连接时,客户端和服务器应用程序应各自关闭其各自连接的两端。
例如,对于
SSLSocket
对象,应用程序可以调用Socket.shutdownOutput()
或OutputStream.close()
以关闭输出strean,并在输入流关闭时调用Socket.shutdownInput()
或InputStream.close()
。 请注意,在某些情况下,关闭输入流可能取决于首先关闭对等方的输出流。 如果连接未按顺序关闭(例如,在收到对等方的写入关闭通知之前调用Socket.shutdownInput()
),则可能会引发异常以指示发生了错误。 一旦SSLSocket
关闭,它就不可重复使用:必须创建一个新的SSLSocket
。 - 从以下版本开始:
- 1.4
- 另请参见:
-
Socket
,SSLServerSocket
,SSLSocketFactory
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
SSLSocket()
仅由子类使用。protected
SSLSocket(String host, int port)
仅由子类使用。protected
SSLSocket(String host, int port, InetAddress clientAddress, int clientPort)
仅由子类使用。protected
SSLSocket(InetAddress address, int port)
仅由子类使用。protected
SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort)
仅由子类使用。
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract void
addHandshakeCompletedListener(HandshakeCompletedListener listener)
注册事件侦听器以接收已在此连接上完成SSL握手的通知。String
getApplicationProtocol()
返回为此连接协商的最新应用程序协议值。abstract String[]
getEnabledCipherSuites()
返回当前启用以在此连接上使用的SSL密码套件的名称。abstract String[]
getEnabledProtocols()
返回当前在此连接上启用的协议版本的名称。abstract boolean
getEnableSessionCreation()
如果此套接字可以建立新的SSL会话,则返回true。String
getHandshakeApplicationProtocol()
返回当前正在进行的SSL / TLS握手协商的应用程序协议值。BiFunction<SSLSocket,List<String>,String>
getHandshakeApplicationProtocolSelector()
检索在SSL / TLS / DTLS握手期间选择应用程序协议值的回调函数。SSLSession
getHandshakeSession()
返回在SSL / TLS握手期间构造的SSLSession
。abstract boolean
getNeedClientAuth()
如果套接字 需要客户端身份验证,则返回true。abstract SSLSession
getSession()
返回此连接正在使用的SSL会话。SSLParameters
getSSLParameters()
返回对此SSLSocket有效的SSLParameters。abstract String[]
getSupportedCipherSuites()
返回可以在此连接上启用的密码套件的名称。abstract String[]
getSupportedProtocols()
返回可以在SSL连接上使用的协议的名称。abstract boolean
getUseClientMode()
如果套接字在握手时设置为使用客户端模式,则返回true。abstract boolean
getWantClientAuth()
如果套接字将 请求客户端身份验证,则返回trueabstract void
removeHandshakeCompletedListener(HandshakeCompletedListener listener)
删除以前注册的握手完成侦听器。abstract void
setEnabledCipherSuites(String[] suites)
设置启用此连接的密码套件。abstract void
setEnabledProtocols(String[] protocols)
设置启用此连接的协议版本。abstract void
setEnableSessionCreation(boolean flag)
控制此套接字是否可以建立新的SSL会话。void
setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket,List<String>,String> selector)
注册一个回调函数,为SSL / TLS / DTLS握手选择应用程序协议值。abstract void
setNeedClientAuth(boolean need)
配置套接字以 要求客户端身份验证。void
setSSLParameters(SSLParameters params)
将SSLParameters应用于此套接字。abstract void
setUseClientMode(boolean mode)
配置套接字在握手时使用客户端(或服务器)模式。abstract void
setWantClientAuth(boolean want)
配置套接字以 请求客户端身份验证。abstract void
startHandshake()
在此连接上启动SSL握手。-
声明方法的类 java.net.Socket
bind, close, connect, connect, getChannel, getInetAddress, getInputStream, getKeepAlive, getLocalAddress, getLocalPort, getLocalSocketAddress, getOOBInline, getOption, getOutputStream, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoLinger, getSoTimeout, getTcpNoDelay, getTrafficClass, isBound, isClosed, isConnected, isInputShutdown, isOutputShutdown, sendUrgentData, setKeepAlive, setOOBInline, setOption, setPerformancePreferences, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSocketImplFactory, setSoLinger, setSoTimeout, setTcpNoDelay, setTrafficClass, shutdownInput, shutdownOutput, supportedOptions, toString
-
-
-
-
构造方法详细信息
-
SSLSocket
protected SSLSocket()
仅由子类使用。 构造一个未初始化的,未连接的TCP套接字。
-
SSLSocket
protected SSLSocket(String host, int port) throws IOException, UnknownHostException
仅由子类使用。 构造与指定端口上的命名主机的TCP连接。 这充当SSL客户端。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
host
- 要连接的主机的名称,或者是环回地址的null
。 -
port
- 服务器端口号 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
UnknownHostException
- 如果主机未知 -
IllegalArgumentException
- 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。 - 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
SSLSocket
protected SSLSocket(InetAddress address, int port) throws IOException
仅由子类使用。 构造与指定地址和端口的服务器的TCP连接。 这充当SSL客户端。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
address
- 服务器的主机 -
port
- 其港口 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
IllegalArgumentException
- 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。 -
NullPointerException
- 如果address
为空。 - 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
SSLSocket
protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException
仅由子类使用。 构造与指定端口上的命名主机的SSL连接,将给定地址和端口的连接的客户端绑定。 这充当SSL客户端。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
host
- 要连接的主机的名称,或者是环回地址的null
。 -
port
- 服务器端口号 -
clientAddress
- 套接字绑定的客户端地址,或null
为anyLocal
地址。 -
clientPort
- 套接字绑定的客户端端口,或zero
用于系统选定的空闲端口。 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
UnknownHostException
- 如果主机未知 -
IllegalArgumentException
- 如果port参数或clientPort参数超出指定的有效端口值范围(介于0和65535之间,包括0和65535)。 - 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
SSLSocket
protected SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException
仅由子类使用。 构造与指定地址和TCP端口的服务器的SSL连接,将给定地址和端口的连接的客户端绑定。 这充当SSL客户端。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
address
- 服务器的主机 -
port
- 其端口 -
clientAddress
- 套接字绑定的客户端地址,或null
为anyLocal
地址。 -
clientPort
- 套接字绑定的客户端端口,或zero
用于系统选定的空闲端口。 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
IllegalArgumentException
- 如果port参数或clientPort参数超出指定的有效端口值范围(介于0和65535之间,包括0和65535)。 -
NullPointerException
- 如果address
为空。 - 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
-
方法详细信息
-
getSupportedCipherSuites
public abstract String[] getSupportedCipherSuites()
返回可以在此连接上启用的密码套件的名称。 通常,默认情况下实际上仅启用其中的一部分,因为此列表可能包括不符合这些默认值的服务质量要求的密码套件。 这种密码套件可能在专门的应用程序中很有用。返回的数组包括Java Cryptography体系结构标准算法名称文档的JSSE Cipher Suite Names部分中标准密码套件名称列表中的密码套件,还可能包括提供程序支持的其他密码套件。
- 结果
- 一组密码套件名称
- 另请参见:
-
getEnabledCipherSuites()
,setEnabledCipherSuites(String [])
-
getEnabledCipherSuites
public abstract String[] getEnabledCipherSuites()
返回当前启用以在此连接上使用的SSL密码套件的名称。 首次创建SSLSocket时,所有启用的密码套件都支持最低服务质量。 因此,在某些环境中,此值可能为空。请注意,即使启用了套件,也可能永远不会使用它。 如果对等方不支持它,或者它的使用受到限制,或者套件的必需证书(和私钥)不可用,或者启用了匿名套件但需要进行身份验证,则会发生这种情况。
返回的数组包括Java Cryptography体系结构标准算法名称文档的JSSE Cipher Suite Names部分中的标准密码套件名称列表中的密码套件,还可能包括提供程序支持的其他密码套件。
- 结果
- 一组密码套件名称
- 另请参见:
-
getSupportedCipherSuites()
,setEnabledCipherSuites(String [])
-
setEnabledCipherSuites
public abstract void setEnabledCipherSuites(String[] suites)
设置启用此连接的密码套件。suites
参数中的每个密码套件必须已由getSupportedCipherSuites()列出,否则该方法将失败。 成功调用此方法后,仅启用suites
参数中列出的套件以供使用。请注意,密码套件名称的标准列表可以在Java Cryptography Architecture标准算法名称文档的JSSE Cipher Suite Names部分中找到。 提供商可能支持此列表中未找到的密码套件名称,或者可能不使用某个密码套件的建议名称。
有关为什么特定密码套件永远不会在连接上使用的详细信息,请参阅
getEnabledCipherSuites()
。- 参数
-
suites
- 要启用的所有密码套件的名称 - 异常
-
IllegalArgumentException
- 当不支持参数指定的一个或多个密码时,或者参数为null时。 - 另请参见:
-
getSupportedCipherSuites()
,getEnabledCipherSuites()
-
getSupportedProtocols
public abstract String[] getSupportedProtocols()
返回可以在SSL连接上使用的协议的名称。- 结果
- 支持的一系列协议
-
getEnabledProtocols
public abstract String[] getEnabledProtocols()
返回当前在此连接上启用的协议版本的名称。请注意,即使启用了协议,也可能永远不会使用它。 如果对等方不支持协议,或者其使用受到限制,或者协议不支持启用的密码套件,则会发生这种情况。
- 结果
- 一系列协议
- 另请参见:
-
setEnabledProtocols(String [])
-
setEnabledProtocols
public abstract void setEnabledProtocols(String[] protocols)
设置启用此连接的协议版本。协议必须已被
getSupportedProtocols()
列为受支持。 成功调用此方法后,仅启用protocols
参数中列出的协议。- 参数
-
protocols
- 要启用的所有协议的名称。 - 异常
-
IllegalArgumentException
- 当不支持参数指定的一个或多个协议或者参数为null时。 - 另请参见:
-
getEnabledProtocols()
-
getSession
public abstract SSLSession getSession()
返回此连接正在使用的SSL会话。 这些可以是长期存在的,并且经常对应于某些用户的整个登录会话。 会话指定特定的密码套件,该会话中的所有连接都在使用该密码套件,以及会话的客户端和服务器的身份。如果需要,此方法将启动初始握手,然后阻塞,直到握手已建立。
如果在初始握手期间发生错误,则此方法返回无效的会话对象,该对象报告无效的密码套件“SSL_NULL_WITH_NULL_NULL”。
- 结果
-
SSLSession
-
getHandshakeSession
public SSLSession getHandshakeSession()
返回在SSL / TLS握手期间构造的SSLSession
。TLS协议可以协商使用此类实例时所需的参数,但在
SSLSession
已完全初始化并通过getSession
提供getSession
。 例如,有效签名算法列表可能会限制在TrustManager决策期间可以使用的证书类型,或者可以调整最大TLS分段数据包大小以更好地支持网络环境。此方法提供对正在构建的
SSLSession
早期访问。 根据握手进展的程度,某些数据可能尚未可用。 例如,如果远程服务器将发送一个证书链,但链尚未没有被处理,则getPeerCertificates
的方法SSLSession
将抛出SSLPeerUnverifiedException。 处理getPeerCertificates
链后,getPeerCertificates
将返回正确的值。与
getSession()
不同,此方法不会启动初始握手,并且在握手完成之前不会阻止。- 结果
-
如果此实例当前没有握手,或者当前握手的进度不足以创建基本SSLSession,则返回null。
否则,此方法返回当前正在协商的
SSLSession
。 - 异常
-
UnsupportedOperationException
- 如果基础提供程序未实现该操作。 - 从以下版本开始:
- 1.7
- 另请参见:
-
SSLEngine
,SSLSession
,ExtendedSSLSession
,X509ExtendedKeyManager
,X509ExtendedTrustManager
-
addHandshakeCompletedListener
public abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
注册事件侦听器以接收已在此连接上完成SSL握手的通知。- 参数
-
listener
- HandShake Completed事件侦听器 - 异常
-
IllegalArgumentException
- 如果参数为null。 - 另请参见:
-
startHandshake()
,removeHandshakeCompletedListener(HandshakeCompletedListener)
-
removeHandshakeCompletedListener
public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
删除以前注册的握手完成侦听器。- 参数
-
listener
- HandShake Completed事件侦听器 - 异常
-
IllegalArgumentException
- 如果未注册侦听器,或参数为null。 - 另请参见:
-
addHandshakeCompletedListener(HandshakeCompletedListener)
-
startHandshake
public abstract void startHandshake() throws IOException
在此连接上启动SSL握手。 常见原因包括需要使用新的加密密钥,更改密码套件或启动新会话。 要强制完成重新认证,在开始此握手之前,当前会话可能会失效。如果已在连接上发送数据,则在此握手期间它将继续流动。 握手完成后,将通过事件发出信号。 此方法对于连接上的初始握手是同步的,并在协商的握手完成时返回。 某些协议可能不支持现有套接字上的多次握手,并且可能抛出IOException。
- 异常
-
IOException
- 网络级别错误 - 另请参见:
-
addHandshakeCompletedListener(HandshakeCompletedListener)
-
setUseClientMode
public abstract void setUseClientMode(boolean mode)
配置套接字在握手时使用客户端(或服务器)模式。必须在进行任何握手之前调用此方法。 一旦握手开始,该插座的使用寿命就无法重置模式。
服务器通常对自己进行身份验证,并且客户端不需要这样做。
- 参数
-
mode
- 如果套接字应在“客户端”模式下开始握手,mode
true - 异常
-
IllegalArgumentException
- 如果在初始握手开始后尝试模式更改。 - 另请参见:
-
getUseClientMode()
-
getUseClientMode
public abstract boolean getUseClientMode()
如果套接字在握手时设置为使用客户端模式,则返回true。- 结果
- 如果套接字应在“客户端”模式下进行握手,则为true
- 另请参见:
-
setUseClientMode(boolean)
-
setNeedClientAuth
public abstract void setNeedClientAuth(boolean need)
配置套接字以要求客户端身份验证。 此选项仅对服务器模式下的套接字有用。套接字的客户端身份验证设置是以下之一:
- 需要客户端验证
- 请求客户端身份验
- 无需客户端身份验证
与
setWantClientAuth(boolean)
不同,如果设置了此选项并且客户端选择不提供有关其自身的身份验证信息, 则协商将停止并且连接将被删除 。调用此方法会覆盖此方法或
setWantClientAuth(boolean)
之前的任何设置。- 参数
-
need
- 如果需要客户端身份验证,则设置为true;如果不需要客户端身份验证,则设置为false。 - 另请参见:
-
getNeedClientAuth()
,setWantClientAuth(boolean)
,getWantClientAuth()
,setUseClientMode(boolean)
-
getNeedClientAuth
public abstract boolean getNeedClientAuth()
如果套接字需要客户端身份验证,则返回true。 此选项仅对服务器模式下的套接字有用。- 结果
- 如果需要客户端身份验证,则为true;如果不需要客户端身份验证,则为false
- 另请参见:
-
setNeedClientAuth(boolean)
,setWantClientAuth(boolean)
,getWantClientAuth()
,setUseClientMode(boolean)
-
setWantClientAuth
public abstract void setWantClientAuth(boolean want)
配置套接字以请求客户端身份验证。 此选项仅对服务器模式下的套接字有用。套接字的客户端身份验证设置是以下之一:
- 需要客户端验证
- 请求客户端身份验
- 无需客户端身份验证
与
setNeedClientAuth(boolean)
不同,如果设置了此选项并且客户端选择不提供有关其自身的身份验证信息, 则协商将继续 。调用此方法会覆盖此方法或
setNeedClientAuth(boolean)
之前的任何设置。- 参数
-
want
- 如果请求客户端身份验证,则设置为true;如果不需要客户端身份验证,则设置为false。 - 另请参见:
-
getWantClientAuth()
,setNeedClientAuth(boolean)
,getNeedClientAuth()
,setUseClientMode(boolean)
-
getWantClientAuth
public abstract boolean getWantClientAuth()
如果套接字将请求客户端身份验证,则返回true 此选项仅对服务器模式下的套接字有用。- 结果
- 如果请求客户端身份验证,则为true;如果不需要客户端身份验证,则为false
- 另请参见:
-
setNeedClientAuth(boolean)
,getNeedClientAuth()
,setWantClientAuth(boolean)
,setUseClientMode(boolean)
-
setEnableSessionCreation
public abstract void setEnableSessionCreation(boolean flag)
控制此套接字是否可以建立新的SSL会话。 如果不允许会话创建,并且没有现有会话要恢复,则不会有成功的握手。- 参数
-
flag
- true表示可以创建会话; 这是默认值。 false表示必须恢复现有会话 - 另请参见:
-
getEnableSessionCreation()
-
getEnableSessionCreation
public abstract boolean getEnableSessionCreation()
如果此套接字可以建立新的SSL会话,则返回true。- 结果
- true表示可以创建会话; 这是默认值。 false表示必须恢复现有会话
- 另请参见:
-
setEnableSessionCreation(boolean)
-
getSSLParameters
public SSLParameters getSSLParameters()
返回对此SSLSocket有效的SSLParameters。 返回的SSLParameters的密码套件和协议始终为非null。- 结果
- SSLParameters对此SSLSocket有效。
- 从以下版本开始:
- 1.6
-
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.6
- 如果
-
getApplicationProtocol
public String getApplicationProtocol()
返回为此连接协商的最新应用程序协议值。如果基础SSL / TLS / DTLS实现支持,应用程序名称协商机制(如RFC 7301 ,应用程序层协议协商(ALPN))可以在对等方之间协商应用程序级别的值。
- 实现要求:
-
此类中的实现抛出
UnsupportedOperationException
并且不执行任何其他操作。 - 结果
-
如果尚未确定应用程序协议是否可用于此连接,则
String
如果不使用应用程序协议值,String
空String
如果成功协商了值,String
非空应用程序协议String
。 - 异常
-
UnsupportedOperationException
- 如果基础提供程序未实现该操作。 - 从以下版本开始:
- 9
-
getHandshakeApplicationProtocol
public String getHandshakeApplicationProtocol()
返回当前正在进行的SSL / TLS握手协商的应用程序协议值。与
getHandshakeSession()
一样,连接可能正在握手中。 应用程序协议可能已经或可能尚未提供。- 实现要求:
-
此类中的实现抛出
UnsupportedOperationException
并且不执行任何其他操作。 - 结果
-
如果尚未确定应用程序协议是否可用于此握手,
String
如果不使用应用程序协议值,String
空String
如果成功协商了值,String
非空应用程序协议String
。 - 异常
-
UnsupportedOperationException
- 如果基础提供程序未实现该操作。 - 从以下版本开始:
- 9
-
setHandshakeApplicationProtocolSelector
public void setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket,List<String>,String> selector)
注册一个回调函数,为SSL / TLS / DTLS握手选择应用程序协议值。 该函数将覆盖使用SSLParameters.setApplicationProtocols
提供的任何值,并且它支持以下类型参数:-
SSLSocket
-
The function's first argument allows the current
SSLSocket
to be inspected, including the handshake session and configuration settings. -
List<String>
- The function's second argument lists the application protocol names advertised by the TLS peer.
-
String
-
The function's result is an application protocol name, or null to indicate that none of the advertised names are acceptable. If the return value is an empty
String
then application protocol indications will not be used. If the return value is null (no value chosen) or is a value that was not advertised by the peer, the underlying protocol will determine what action to take. (For example, ALPN will send a "no_application_protocol" alert and terminate the connection.)
serverSocket.setHandshakeApplicationProtocolSelector( (serverSocket, clientProtocols) -> { SSLSession session = serverSocket.getHandshakeSession(); return chooseApplicationProtocol( serverSocket, clientProtocols, session.getProtocol(), session.getCipherSuite()); });
- API Note:
-
在TLS握手开始之前,应由TLS服务器应用程序调用此方法。
此外,应使用与回调函数选择的应用程序协议兼容的参数配置此
SSLSocket
。 例如,启用较差的密码套件选择可能导致没有合适的应用程序协议。 见SSLParameters
。 - 实现要求:
-
此类中的实现抛出
UnsupportedOperationException
并且不执行任何其他操作。 - 参数
-
selector
- 回调函数,或取消注册为null。 - 异常
-
UnsupportedOperationException
- 如果基础提供程序未实现该操作。 - 从以下版本开始:
- 9
-
-
getHandshakeApplicationProtocolSelector
public BiFunction<SSLSocket,List<String>,String> getHandshakeApplicationProtocolSelector()
检索在SSL / TLS / DTLS握手期间选择应用程序协议值的回调函数。 有关函数的类型参数,请参见setHandshakeApplicationProtocolSelector
。- 实现要求:
-
此类中的实现抛出
UnsupportedOperationException
并且不执行任何其他操作。 - 结果
- 回调函数,如果没有设置则返回null。
- 异常
-
UnsupportedOperationException
- 如果基础提供程序未实现该操作。 - 从以下版本开始:
- 9
-
-