public abstract class PskKeyManager
extends Object
implements KeyManager
java.lang.Object | |
↳ | android.net.PskKeyManager |
提供TLS-PSK密码套件中使用的预共享密钥(PSK)密钥交换的密钥材料。
TLS-PSK是一组TLS / SSL密码套件,它依靠对称预共享密钥(PSK)来保护TLS / SSL连接并相互验证其对等体。 与传统的基于公钥的密码套件相比,这些密码套件在某些情况下可能更自然,这些情况下,通过单独的步骤(例如,配对步骤)引导对等体之间的通信并要求两个对等体彼此进行身份验证。 在这种情况下,可以在自举步骤中交换对称密钥(PSK),无需生成和交换公钥对和X.509证书。
当使用TLS-PSK密码套件时,两个对等端必须使用相同的密钥才能成功完成TLS / SSL握手。 因此,通过成功的握手隐式认证两个同伴。 这样就省去了使用TrustManager
连同此KeyManager
。
同行可能有多个密钥可供选择。 为了帮助选择正确的密钥,在握手期间服务器可以向客户端提供PSK身份提示 ,并且客户端可以向服务器提供PSK身份 。 这两条信息的内容是特定于应用程序级协议的。
注:PSK标识提示和PSK标识都以明文形式传输。 而且,这些数据在对等体被认证之前被接收和处理。 因此,他们不得包含或泄露关键材料或其他敏感信息,并应谨慎对待(例如解析)为不可信数据。
导致同伴在TLS / SSL握手期间选择密钥的高级流程如下所示:
在上面的流程中,任何一方都可以发信号通知他们没有合适的密钥,在这种情况下,握手将立即中止。 这可以使不知道密钥的网络攻击者知道哪些PSK身份提示或PSK身份被支持。 如果这是一个问题,那么在没有密钥可用的情况下应该使用随机生成的密钥。 由于密钥不匹配(与密钥可用的情况相同),这将导致稍后由于密钥不匹配而导致握手中止,从而使攻击者看起来支持所有PSK身份提示和PSK身份。
The maximum supported sizes are as follows:
MAX_KEY_LENGTH_BYTES
),MAX_IDENTITY_LENGTH_BYTES
and MAX_IDENTITY_HINT_LENGTH_BYTES
).getKey
because the default implementation returns no key, which aborts the handshake.
ECDHE_PSK
cipher suites in API Level 21 contains a bug which breaks compatibility with other implementations.
ECDHE_PSK
cipher suites are enabled by default on platforms with API Level 21 when an
SSLContext
is initialized with a
PskKeyManager
. A workaround is to disable
ECDHE_PSK
cipher suites on platforms with API Level 21.
SSLContext
which enables the use of TLS-PSK in
SSLSocket
,
SSLServerSocket
and
SSLEngine
instances obtained from it.
PskKeyManager pskKeyManager = ...;
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(
new KeyManager[] { pskKeyManager },
new TrustManager[0], // No TrustManagers needed for TLS-PSK
null // Use the default source of entropy
);
SSLSocket sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(...);
Constants |
|
---|---|
int |
MAX_IDENTITY_HINT_LENGTH_BYTES PSK身份提示的最大支持长度(以字节为单位)(以已修改的UTF-8表示形式)。 |
int |
MAX_IDENTITY_LENGTH_BYTES PSK标识的最大支持长度(以字节为单位)(以修改的UTF-8表示形式)。 |
int |
MAX_KEY_LENGTH_BYTES PSK的最大支持长度(以字节为单位)。 |
Public constructors |
|
---|---|
PskKeyManager() |
Public methods |
|
---|---|
String |
chooseClientKeyIdentity(String identityHint, SSLEngine engine) 获取PSK标识以向服务器报告,以帮助就所提供的引擎达成PSK协议。 |
String |
chooseClientKeyIdentity(String identityHint, Socket socket) 获取PSK标识以向服务器报告,以帮助就提供的套接字的PSK达成一致。 |
String |
chooseServerKeyIdentityHint(SSLEngine engine) 获取PSK身份提示,向客户报告以帮助就提供的引擎达成PSK协议。 |
String |
chooseServerKeyIdentityHint(Socket socket) 获取PSK身份提示以向客户报告以帮助就所提供的套接字达成一致。 |
SecretKey |
getKey(String identityHint, String identity, Socket socket) 获取PSK以用于提供的套接字。 |
SecretKey |
getKey(String identityHint, String identity, SSLEngine engine) 获取PSK以用于提供的引擎。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int MAX_IDENTITY_HINT_LENGTH_BYTES
PSK身份提示的最大支持长度(以字节为单位)(以已修改的UTF-8表示形式)。
常量值:128(0x00000080)
int MAX_IDENTITY_LENGTH_BYTES
PSK标识的最大支持长度(以字节为单位)(以修改的UTF-8表示形式)。
常量值:128(0x00000080)
int MAX_KEY_LENGTH_BYTES
PSK的最大支持长度(以字节为单位)。
常量值:256(0x00000100)
String chooseClientKeyIdentity (String identityHint, SSLEngine engine)
获取PSK标识以向服务器报告,以帮助就所提供的引擎达成PSK协议。
默认实现返回一个空字符串。
Parameters | |
---|---|
identityHint |
String : identity hint provided by the server or null if none provided. |
engine |
SSLEngine
|
Returns | |
---|---|
String |
PSK identity to provide to the server. null is permitted but will be converted into an empty string. |
String chooseClientKeyIdentity (String identityHint, Socket socket)
获取PSK标识以向服务器报告,以帮助就提供的套接字的PSK达成一致。
默认实现返回一个空字符串。
Parameters | |
---|---|
identityHint |
String : identity hint provided by the server or null if none provided. |
socket |
Socket
|
Returns | |
---|---|
String |
PSK identity to provide to the server. null is permitted but will be converted into an empty string. |
String chooseServerKeyIdentityHint (SSLEngine engine)
获取PSK身份提示,向客户报告以帮助就提供的引擎达成PSK协议。
默认实现返回 null
。
Parameters | |
---|---|
engine |
SSLEngine
|
Returns | |
---|---|
String |
PSK identity hint to be provided to the client or null to provide no hint. |
String chooseServerKeyIdentityHint (Socket socket)
获取PSK身份提示以向客户报告以帮助就所提供的套接字达成一致。
默认实现返回 null
。
Parameters | |
---|---|
socket |
Socket
|
Returns | |
---|---|
String |
PSK identity hint to be provided to the client or null to provide no hint. |
SecretKey getKey (String identityHint, String identity, Socket socket)
获取PSK以用于提供的套接字。
默认实现返回 null
。
Parameters | |
---|---|
identityHint |
String : identity hint provided by the server to help select the key or null if none provided. |
identity |
String : identity provided by the client to help select the key. |
socket |
Socket
|
Returns | |
---|---|
SecretKey |
key or null to signal to peer that no suitable key is available and to abort the handshake. |
SecretKey getKey (String identityHint, String identity, SSLEngine engine)
获取PSK以用于提供的引擎。
默认实现返回 null
。
Parameters | |
---|---|
identityHint |
String : identity hint provided by the server to help select the key or null if none provided. |
identity |
String : identity provided by the client to help select the key. |
engine |
SSLEngine
|
Returns | |
---|---|
SecretKey |
key or null to signal to peer that no suitable key is available and to abort the handshake. |