public abstract class SSLSocket extends Socket
Socket
s,并使用诸如“安全套接字层”(SSL)或IETF“传输层安全”(TLS)协议之类的Socket
来提供安全套接字。
这样的套接字是普通流套接字,但是它们在底层网络传输协议(如TCP)上增加了一层安全保护。 这些保护包括:
这些类型的保护由“密码套件”指定,“密码套件”是由给定SSL连接使用的加密算法的组合。 在协商过程中,两个端点必须对两个环境中可用的密码同意。 如果没有这样的套件,则不能建立SSL连接,不能交换任何数据。
所使用的密码套件是通过称为“握手”的协商过程建立的。 此过程的目标是创建或重新加入“会话”,可以保护多个连接。 握手完成后,您可以使用getSession方法访问会话属性。 这种连接的初始握手可以通过以下三种方式之一启动:
startHandshake
明确地开始握手,或 getSession
尝试设置会话,并进行隐式握手。 如果由于任何原因握手失败, SSLSocket
关闭,不能再进行通信。
有两组密码套件,您需要知道何时管理密码套件:
默认情况下,实现默认情况下,默认情况下仅启用验证服务器并提供机密性的密码套件。 只有双方明确同意未经身份验证和/或非私有(未加密)通信,才能选择这样的密码。
当SSLSocket
首次创建S,没有握手是这样做的应用程序可能首先设置它们的通信首选项:使用哪个密码套件,套接字是否应该在客户端或服务器模式,等等。然而,安全总是被时间规定应用程序数据通过连接发送。
您可以注册接收握手完成的事件通知。 这涉及到使用两个额外的类。 HandshakeCompletedEvent对象传递给HandshakeCompletedListener任何情况下,这是由该API的用户注册。 SSLSocket
由SSLSocketFactory
s创建,或由accept
创建一个SSLServerSocket的SSLServerSocket
。
SSL套接字必须选择在客户端或服务器模式下运行。 这将决定谁开始握手过程,以及每一方应发送哪些消息。 每个连接必须有一个客户端和一个服务器,否则握手将无法正常进行。 一旦初始握手已经开始,即使执行重新协商,套接字也不能在客户端和服务器模式之间切换。
Socket
, SSLServerSocket
, SSLSocketFactory
Modifier | Constructor and Description |
---|---|
protected |
SSLSocket()
仅由子类使用。
|
protected |
SSLSocket(InetAddress address, int port)
仅由子类使用。
|
protected |
SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort)
仅由子类使用。
|
protected |
SSLSocket(String host, int port)
仅由子类使用。
|
protected |
SSLSocket(String host, int port, InetAddress clientAddress, int clientPort)
仅由子类使用。
|
Modifier and Type | Method and Description |
---|---|
abstract void |
addHandshakeCompletedListener(HandshakeCompletedListener listener)
注册事件侦听器以接收SSL握手在此连接上已完成的通知。
|
abstract String[] |
getEnabledCipherSuites()
返回当前启用此SSL连接的SSL密码套件的名称。
|
abstract String[] |
getEnabledProtocols()
返回当前允许在此连接上使用的协议版本的名称。
|
abstract boolean |
getEnableSessionCreation()
如果此套接字可能建立新的SSL会话,则返回true。
|
SSLSession |
getHandshakeSession()
返回
SSLSession 一个SSL / TLS握手期间正在建设。
|
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()
如果套接字将
请求客户端身份验证,则返回true。
|
abstract void |
removeHandshakeCompletedListener(HandshakeCompletedListener listener)
删除以前注册的握手完成侦听器。
|
abstract void |
setEnabledCipherSuites(String[] suites)
设置启用此连接的密码套件。
|
abstract void |
setEnabledProtocols(String[] protocols)
设置允许在此连接上使用的协议版本。
|
abstract void |
setEnableSessionCreation(boolean flag)
控制此套接字是否可以建立新的SSL会话。
|
abstract void |
setNeedClientAuth(boolean need)
配置套接字以
要求客户端认证。
|
void |
setSSLParameters(SSLParameters params)
将SSLParameters应用于此套接字。
|
abstract void |
setUseClientMode(boolean mode)
在握手时,将套接字配置为使用客户端(或服务器)模式。
|
abstract void |
setWantClientAuth(boolean want)
配置套接字以
请求客户端认证。
|
abstract void |
startHandshake()
在此连接上启动SSL握手。
|
bind, close, connect, connect, getChannel, getInetAddress, getInputStream, getKeepAlive, getLocalAddress, getLocalPort, getLocalSocketAddress, getOOBInline, getOutputStream, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoLinger, getSoTimeout, getTcpNoDelay, getTrafficClass, isBound, isClosed, isConnected, isInputShutdown, isOutputShutdown, sendUrgentData, setKeepAlive, setOOBInline, setPerformancePreferences, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSocketImplFactory, setSoLinger, setSoTimeout, setTcpNoDelay, setTrafficClass, shutdownInput, shutdownOutput, toString
protected SSLSocket()
protected SSLSocket(String host, int port) throws IOException, UnknownHostException
如果有一个安全管理器,它的checkConnect
方法被调用主机地址和port
作为其参数。 这可能会导致SecurityException。
host
- 用于连接的主机名称,或环回地址的
null
。
port
- 服务器端口号
IOException
- 如果在创建套接字时发生I / O错误
SecurityException
- 如果安全管理器存在,并且其
checkConnect
方法不允许操作。
UnknownHostException
- 如果主机不知道
IllegalArgumentException
- 如果端口参数超出指定范围的有效端口值,介于0和65535之间(含)。
SecurityManager.checkConnect(java.lang.String, int)
protected SSLSocket(InetAddress address, int port) throws IOException
如果有一个安全管理器,它的checkConnect
方法被调用主机地址和port
作为其参数。 这可能会导致SecurityException。
address
- 服务器的主机
port
- 其港口
IOException
- 如果在创建套接字时发生I / O错误
SecurityException
- 如果安全管理器存在,并且其
checkConnect
方法不允许操作。
IllegalArgumentException
- 如果端口参数超出指定范围的有效端口值(介于0和65535之间),包括0和65535之间。
NullPointerException
- 如果
address
为空。
SecurityManager.checkConnect(java.lang.String, int)
protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException
如果有一个安全管理器,它的checkConnect
方法被调用主机地址和port
作为其参数。 这可能会导致SecurityException。
host
- 用于连接的主机的名称,或者是环回地址的
null
。
port
- 服务器端口号
clientAddress
- 套接字绑定的客户端地址,或
null
的
anyLocal
地址。
clientPort
- 套接字绑定的客户端端口,或系统选择的自由端口的
zero
。
IOException
- 如果在创建套接字时发生I / O错误
SecurityException
- 如果安全管理器存在,并且其
checkConnect
方法不允许操作。
UnknownHostException
- 如果主机不知道
IllegalArgumentException
- 如果端口参数或clientPort参数超出了介于0和65535之间的有效端口值的指定范围(包括0和65535之间)。
SecurityManager.checkConnect(java.lang.String, int)
protected SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException
如果有一个安全管理器,它的checkConnect
方法被调用主机地址和port
作为参数。 这可能会导致SecurityException。
address
- 服务器的主机
port
- 其端口
clientAddress
- 套接字绑定的客户端地址,或
null
为
anyLocal
地址。
clientPort
- 套接字绑定的客户端端口,或系统选择的自由端口的
zero
。
IOException
- 如果在创建套接字时发生I / O错误
SecurityException
- 如果安全管理器存在,并且其
checkConnect
方法不允许操作。
IllegalArgumentException
- 如果端口参数或clientPort参数超出了介于0和65535之间的有效端口值的指定范围(包括0和65535之间)。
NullPointerException
- 如果
address
为空。
SecurityManager.checkConnect(java.lang.String, int)
public abstract String[] getSupportedCipherSuites()
getEnabledCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract String[] getEnabledCipherSuites()
即使已启用套件,也可能永远不会使用。 (例如,对等体不支持它,套件的必需证书(和私钥)不可用,或启用匿名套件,但需要验证。
getSupportedCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract void setEnabledCipherSuites(String[] suites)
suites
参数中的每个密码套件都必须由getSupportedCipherSuites()列出,否则该方法将失败。 成功调用此方法后,只能启用suites
参数中列出的suites
。
有关为什么连接上永远不会使用特定密码套件的更多信息,请参阅getEnabledCipherSuites()
。
suites
- 要启用的所有密码套件的名称
IllegalArgumentException
- 当不支持由参数命名的一个或多个密码时,或当参数为空时。
getSupportedCipherSuites()
,
getEnabledCipherSuites()
public abstract String[] getSupportedProtocols()
public abstract String[] getEnabledProtocols()
setEnabledProtocols(String [])
public abstract void setEnabledProtocols(String[] protocols)
协议必须已被getSupportedProtocols()
列为受支持。 成功调用此方法后,仅启用protocols参数中列出的protocols
使用。
protocols
- 所有要启用的协议的名称。
IllegalArgumentException
- 当一个或多个由参数命名的协议不受支持或协议参数为null时。
getEnabledProtocols()
public abstract SSLSession getSession()
如果需要,此方法将启动初始握手,然后阻止,直到握手建立。
如果在初始握手期间发生错误,则此方法返回一个无效的会话对象,该对象报告“SSL_NULL_WITH_NULL_NULL”的无效密码套件。
SSLSession
public SSLSession getHandshakeSession()
SSLSession
一个SSL / TLS握手期间正在建设。
TLS协议可以协商在使用此类的实例时需要的参数,但SSLSession
已经被完全初始化并通过getSession
。 例如,有效的签名算法列表可能限制在TrustManager决策期间可以使用的证书的类型,或者可以调整最大TLS片段数据包大小以更好地支持网络环境。
此方法提供了早期访问SSLSession
被构造。 取决于握手进度有多远,有些数据可能尚未被使用。 例如,如果远程服务器将发送一个证书链,但链尚未不被处理时, getPeerCertificates
的方法SSLSession
将抛出SSLPeerUnverifiedException。 一旦该链已被处理, getPeerCertificates
将返回正确的值。
与getSession()
不同,该方法不会启动初始握手,并且在握手完成之前不阻止。
SSLSession
目前正在谈判。
UnsupportedOperationException
- 如果底层提供程序不实现该操作。
SSLEngine
, SSLSession
, ExtendedSSLSession
, X509ExtendedKeyManager
, X509ExtendedTrustManager
public abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
listener
- HandShake已完成的事件侦听器
IllegalArgumentException
- 如果参数为空。
startHandshake()
,
removeHandshakeCompletedListener(HandshakeCompletedListener)
public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
listener
- HandShake Completed事件侦听器
IllegalArgumentException
- 如果监听器未注册,或参数为空。
addHandshakeCompletedListener(HandshakeCompletedListener)
public abstract void startHandshake() throws IOException
如果数据已经在连接上发送,则在此握手期间它继续流动。 当握手完成时,会发出一个事件信号。 该方法对于连接上的初始握手是同步的,并且在协商的握手完成时返回。 某些协议可能不支持现有套接字上的多次握手,并可能会导致IOException异常。
IOException
- 网络级错误
addHandshakeCompletedListener(HandshakeCompletedListener)
public abstract void setUseClientMode(boolean mode)
在发生任何握手之前必须调用此方法。 一旦握手已经开始,在该插座的使用寿命内不能重置该模式。
服务器通常认证自己,客户端不需要这样做。
mode
- 如果套接字应在“客户端”模式下开始
mode
,则为true
IllegalArgumentException
- 如果在初始握手开始后尝试模式更改。
getUseClientMode()
public abstract boolean getUseClientMode()
setUseClientMode(boolean)
public abstract void setNeedClientAuth(boolean need)
套接字的客户端验证设置是以下之一:
与setWantClientAuth(boolean)
不同,如果设置此选项,并且客户端选择不提供有关其自身的身份验证信息, 则协商将停止,并且连接将被删除 。
调用此方法将覆盖由此方法或setWantClientAuth(boolean)
进行的任何以前的设置。
need
- 如果需要客户端验证,则设置为true;如果不需要客户端验证,则设置为false。
getNeedClientAuth()
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract boolean getNeedClientAuth()
setNeedClientAuth(boolean)
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract void setWantClientAuth(boolean want)
套接字的客户端验证设置是以下之一:
与setNeedClientAuth(boolean)
不同,如果设置此选项,并且客户端选择不提供有关其自身的身份验证信息, 则协商将继续进行 。
调用此方法将覆盖此方法或setNeedClientAuth(boolean)
所做的任何以前的设置。
want
- 如果客户端认证被请求,设置为true,如果不需要客户端认证,则设置为false。
getWantClientAuth()
,
setNeedClientAuth(boolean)
,
getNeedClientAuth()
,
setUseClientMode(boolean)
public abstract boolean getWantClientAuth()
setNeedClientAuth(boolean)
,
getNeedClientAuth()
,
setWantClientAuth(boolean)
,
setUseClientMode(boolean)
public abstract void setEnableSessionCreation(boolean flag)
flag
- true表示可以创建会话;
这是默认值。
false表示必须恢复现有会话
getEnableSessionCreation()
public abstract boolean getEnableSessionCreation()
setEnableSessionCreation(boolean)
public SSLParameters getSSLParameters()
public void setSSLParameters(SSLParameters params)
意即:
params.getCipherSuites()
为非空值,则使用该值调用setEnabledCipherSuites()
。 params.getProtocols()
不为空,则使用该值调用setEnabledProtocols()
。 params.getNeedClientAuth()
或params.getWantClientAuth()
返回true
, setWantClientAuth(true)
分别调用setNeedClientAuth(true)
和setWantClientAuth(true); 否则setWantClientAuth(false)
。 params.getServerNames()
为非空值,套接字将使用该值配置其服务器名称。 params.getSNIMatchers()
为非空值,则套接字将使用该值配置其SNI匹配器。 params
- 参数
IllegalArgumentException
- 如果setEnabledCipherSuites()或setEnabledProtocols()调用失败