Most visited

Recently visited

Added in API level 21

PskKeyManager

public abstract class PskKeyManager
extends Object implements KeyManager

java.lang.Object
   ↳ android.net.PskKeyManager


提供TLS-PSK密码套件中使用的预共享密钥(PSK)密钥交换的密钥材料。

Overview of TLS-PSK

TLS-PSK是一组TLS / SSL密码套件,它依靠对称预共享密钥(PSK)来保护TLS / SSL连接并相互验证其对等体。 与传统的基于公钥的密码套件相比,这些密码套件在某些情况下可能更自然,这些情况下,通过单独的步骤(例如,配对步骤)引导对等体之间的通信并要求两个对等体彼此进行身份验证。 在这种情况下,可以在自举步骤中交换对称密钥(PSK),无需生成和交换公钥对和X.509证书。

当使用TLS-PSK密码套件时,两个对等端必须使用相同的密钥才能成功完成TLS / SSL握手。 因此,通过成功的握手隐式认证两个同伴。 这样就省去了使用TrustManager连同此KeyManager

Supporting multiple keys

同行可能有多个密钥可供选择。 为了帮助选择正确的密钥,在握手期间服务器可以向客户端提供PSK身份提示 ,并且客户端可以向服务器提供PSK身份 这两条信息的内容是特定于应用程序级协议的。

注:PSK标识提示和PSK标识都以明文形式传输。 而且,这些数据在对等体被认证之前被接收和处理。 因此,他们不得包含或泄露关键材料或其他敏感信息,并应谨慎对待(例如解析)为不可信数据。

导致同伴在TLS / SSL握手期间选择密钥的高级流程如下所示:

  1. Server receives a handshake request from client.
  2. Server replies, optionally providing a PSK identity hint to client.
  3. Client chooses the key.
  4. Client provides a PSK identity of the chosen key to server.
  5. Server chooses the key.

在上面的流程中,任何一方都可以发信号通知他们没有合适的密钥,在这种情况下,握手将立即中止。 这可以使不知道密钥的网络攻击者知道哪些PSK身份提示或PSK身份被支持。 如果这是一个问题,那么在没有密钥可用的情况下应该使用随机生成的密钥。 由于密钥不匹配(与密钥可用的情况相同),这将导致稍后由于密钥不匹配而导致握手中止,从而使攻击者看起来支持所有PSK身份提示和PSK身份。

Maximum sizes

The maximum supported sizes are as follows:

Subclassing

Subclasses should normally provide their own implementation of getKey because the default implementation returns no key, which aborts the handshake.

Known issues

The implementation of 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.

Example

The following example illustrates how to create an 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(...);
 

Summary

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

Constants

MAX_IDENTITY_HINT_LENGTH_BYTES

Added in API level 21
int MAX_IDENTITY_HINT_LENGTH_BYTES

PSK身份提示的最大支持长度(以字节为单位)(以已修改的UTF-8表示形式)。

常量值:128(0x00000080)

MAX_IDENTITY_LENGTH_BYTES

Added in API level 21
int MAX_IDENTITY_LENGTH_BYTES

PSK标识的最大支持长度(以字节为单位)(以修改的UTF-8表示形式)。

常量值:128(0x00000080)

MAX_KEY_LENGTH_BYTES

Added in API level 21
int MAX_KEY_LENGTH_BYTES

PSK的最大支持长度(以字节为单位)。

常量值:256(0x00000100)

Public constructors

PskKeyManager

Added in API level 21
PskKeyManager ()

Public methods

chooseClientKeyIdentity

Added in API level 21
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.

chooseClientKeyIdentity

Added in API level 21
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.

chooseServerKeyIdentityHint

Added in API level 21
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.

chooseServerKeyIdentityHint

Added in API level 21
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.

getKey

Added in API level 21
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.

getKey

Added in API level 21
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.

Hooray!