

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 证书缓存在 AWS SDK for Java 2.x
<a name="credential-caching"></a>

 AWS SDK for Java 2.x 实现凭据缓存以提高性能并减少对凭证源的调用。本节说明凭证缓存的工作原理以及如何为应用程序配置凭证缓存。

## 了解凭证提供程序缓存
<a name="understanding-credential-provider-caching"></a>

适用于 Java 的 SDK 2.x 中的凭证提供程序使用不同的缓存策略：
+ **内部凭证缓存**：许多提供程序会缓存其检索到的凭证。
+ **自动刷新**：具有缓存凭证的提供程序会实施刷新机制。

### 具有内部凭证缓存的提供程序
<a name="providers-with-internal-caching"></a>

即使创建了新实例，以下凭证提供程序也会在内部缓存凭证：
+ **实例配置文件凭证提供程序**：缓存来自 Amazon EC2 元数据服务的凭证。
+ **容器凭证提供程序**：缓存来自容器元数据端点的凭证。
+ **基于 STS 的提供商**：缓存来自 AWS Security Token Service (STS) 的临时证书。
+ **Web 身份令牌提供程序**：缓存从 Web 身份令牌获取的凭证。
+ **进程凭证提供程序**：缓存来自外部进程的凭证。

### 没有内部缓存的提供程序
<a name="providers-without-caching"></a>

以下提供程序不实施内部缓存：
+ **环境变量凭证提供程序**
+ **系统属性凭证提供程序**
+ **静态凭证提供程序**

## 配置凭证缓存
<a name="configuring-credential-caching"></a>

在构建凭证提供程序时，您可以自定义缓存行为：

### 过时时间
<a name="stale-time"></a>

控制凭证何时被视为过时且需要刷新：

```
.staleTime(Duration.ofMinutes(2))  // Consider stale 2 minutes before expiration.
```

### 预取时间
<a name="prefetch-time"></a>

确定在凭证过期之前何时开始刷新：

```
.prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration.
```

### 异步更新
<a name="async-updates"></a>

启用后台凭证刷新：

```
.asyncCredentialUpdateEnabled(true)  // Refresh credentials in background thread.
```

### 会话持续时间
<a name="session-duration"></a>

对于基于 STS 的提供程序，控制临时凭证的有效时长：

```
.refreshRequest(r -> r.durationSeconds(3600))  // 1 hour session.
```

## 缓存凭证配置示例
<a name="example-optimized-sts-config"></a>

举例来说，为凭证提供程序实现配置缓存时，您可能希望让 SDK 使用后台线程在凭证过期之前预取（提前检索）凭证。这样，您就可以避免因检索新凭证而导致调用阻塞。

以下示例创建了一个 `[StsAssumeRoleCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsAssumeRoleCredentialsProvider.html)`，通过在生成器上将 `[asyncCredentialUpdateEnabled](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#asyncCredentialUpdateEnabled(java.lang.Boolean))` 属性设置为 `true`，使用后台线程来预取凭证：

```
StsAssumeRoleCredentialsProvider provider = StsAssumeRoleCredentialsProvider.builder()
    .refreshRequest(r -> r
        .roleArn("arn:aws:iam::111122223333:role/example-role")
        .roleSessionName("example-session")
        .durationSeconds(3600))  // 1 hour session
    .staleTime(Duration.ofMinutes(5))  // Consider stale 5 minutes before expiration
    .prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration
    .asyncCredentialUpdateEnabled(true)  // Refresh in background
    .build();

S3Client s3 = S3Client.builder()
    .credentialsProvider(provider)
    .build();
```

首次在上`s3Client`调用操作时，会向 AWS Security Token Service (STS) 发送一个`[AssumeRoleRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/model/AssumeRoleRequest.html)`。STS 返回有效期为 15 分钟（900 秒）的临时凭证。`s3Client` 实例使用缓存的凭证，直到在 15 分钟到期之前需要刷新凭证为止。默认情况下，SDK 会在当前会话到期前 5 分钟到 1 分钟之间尝试为新会话检索新凭证。预取窗口可使用 `[prefetchTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#prefetchTime(java.time.Duration))` 和 `[staleTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#staleTime(java.time.Duration))` 属性进行配置。

您可以用类似的方式配置以下基于会话的凭证提供程序：
+ `StsWebIdentityTokenFileCredentialsProvider`
+ `StsGetSessionTokenCredentialsProvider`
+ `StsGetFederationTokenCredentialsProvider`
+ `StsAssumeRoleWithWebIdentityCredentialsProvider`
+ `StsAssumeRoleWithSamlCredentialsProvider`
+ `StsAssumeRoleCredentialsProvider`
+ `DefaultCredentialsProvider`（当委托给使用会话的凭证提供程序时）
+ `ProcessCredentialsProvider`
+ `WebIdentityTokenFileCredentialsProvider`
+ `ContainerCredentialsProvider`
+ `InstanceProfileCredentialsProvider`

了解凭据缓存有助于您在使用时优化应用程序的性能和可靠性。 AWS 服务