

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 從外部程序載入登入資料 AWS SDK for Java 2.x
<a name="credentials-process"></a>

**警告**  
以下說明從外部程序取得臨時登入資料的方法。這可能很危險，因此請謹慎處理。如果可能，我們建議您使用其他登入資料提供者。如果使用此選項，我們建議您使用作業系統的安全最佳實務，確保`config`檔案盡可能鎖定。  
請確定您的自訂登入資料工具不會將任何秘密資訊寫入 `StdErr`。SDKs AWS CLI 可以擷取並記錄這類資訊，並可能將其公開給未經授權的使用者。

使用適用於 Java 的 SDK 2.x，您可以從自訂使用案例的外部程序取得臨時登入資料。有兩種方式可設定此功能。

## 使用 `credential_process`設定
<a name="credentials-credential_process"></a>

如果您有提供臨時登入資料的方法，您可以透過在 `config` 檔案中新增 `credential_process`設定做為設定檔定義的一部分來進行整合。您指定的值必須使用命令檔案的完整路徑。如果檔案路徑包含任何空格，您必須用引號括住它。

SDK 會完全依照指定方式呼叫命令，然後從 讀取 JSON 資料`stdout`。

下列範例顯示將此設定用於不含空格的檔案路徑和含空格的檔案路徑。

------
#### [ Linux/macOS ]

**檔案路徑中沒有空格**  

```
[profile process-credential-profile]
credential_process = /path/to/credential/file/credential_file.sh --custom-command custom_parameter
```

**檔案路徑中的空格**  

```
[profile process-credential-profile]
credential_process = "/path/with/space to/credential/file/credential_file.sh" --custom-command custom_parameter
```

------
#### [ Windows ]

**檔案路徑中沒有空格**  

```
[profile process-credential-profile]
credential_process = C:\Path\To\credentials.cmd --custom_command custom_parameter
```

**檔案路徑中的空格**  

```
[profile process-credential-profile]
credential_process = "C:\Path\With Space To\credentials.cmd" --custom_command custom_parameter
```

------

下列程式碼片段示範如何建置服務用戶端，該用戶端使用在名為 的設定檔中定義的暫時登入資料`process-credential-profile`。

```
Region region = Region.US_WEST_2;
S3Client s3Client = S3Client.builder()
      .region(region)
      .credentialsProvider(ProfileCredentialsProvider.create("process-credential-profile"))
      .build();
```

如需使用外部程序做為暫時登入資料來源的詳細資訊，請參閱《 AWS SDKs和工具參考指南》中的[程序登入資料一節](https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html)。

## 使用 `ProcessCredentialsProvider`
<a name="credentials-procredprovider"></a>

除了使用 `config` 檔案中的設定之外，您也可以使用 SDK 的 `[ProcessCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProcessCredentialsProvider.html)` 使用 Java 載入臨時登入資料。

下列範例示範如何使用 指定外部程序，`ProcessCredentialsProvider`以及設定使用臨時憑證的服務用戶端的各種版本。

------
#### [ Linux/macOS ]

**檔案路徑中沒有空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path/to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**檔案路徑中的空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path\\ with\\ spaces\\ to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------
#### [ Windows ]

**檔案路徑中沒有空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("C:\\Path\\To\\credentials.exe optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**檔案路徑中的空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("\"C:\\Path\\With Spaces To\\credentials.exe\" optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------

## 使用 IAM Roles Anywhere 進行身分驗證
<a name="credentials-iam-roles-anywhere"></a>

[IAM Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html) 是 AWS 服務 ，可讓您取得在 外部執行之工作負載的臨時 AWS 登入資料 AWS。它可讓您從內部部署或其他雲端環境安全地存取 AWS 資源。

您必須先收集必要資訊並下載[登入資料協助程式工具](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html)，才能向 IAM Roles Anywhere 驗證請求。遵循 IAM Roles Anywhere 使用者指南中的[入門](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html)說明，即可建立必要的成品。

適用於 Java 的 SDK 沒有專用登入資料提供者可從 IAM Roles Anywhere 擷取臨時登入資料，但您可以使用登入資料協助程式工具以及其中一個選項，[從外部程序擷取登入](#credentials-process)資料。

### 在設定檔中使用 `credential_process`設定
<a name="credentials-iam-roles-anywhere-config"></a>

共用組態檔案中的下列程式碼片段顯示使用 `credential_process`設定的名為 AWS `roles_anywhere`的設定檔：

```
[profile roles_anywhere]
credential_process = ./aws_signing_helper credential-process \
  --certificate /path/to/certificate \
  --private-key /path/to/private-key \
  --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
  --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
  --role-arn arn:aws:iam::account:role/role-name-with-path
```

組裝所有成品之後，您需要將紅色顯示的文字取代為您的值。設定中的第一個元素 是登入資料協助程式工具的可執行檔`aws_signing_helper`，而 `credential-process`是 命令。

當您設定服務用戶端使用`roles_anywhere`設定檔時，如下列程式碼所示，開發套件會快取暫時登入資料，並在過期之前重新整理它們：

```
S3Client s3Client = S3Client.builder()
    .credentialsProvider(ProfileCredentialsProvider.builder()
        .profileName("roles_anywhere").build())
    .build();
```

### 設定 `ProcessCredentialsProvider`
<a name="credentials-iam-roles-anywhere-process"></a>

如下所示，您可以搭配 使用僅限程式碼的方法，`ProcessCredentialsProvider`而不是使用設定檔設定：

```
ProcessCredentialsProvider processCredentialsProvider = ProcessCredentialsProvider.builder()
    .command("""
            ./aws_signing_helper credential-process \
            --certificate /path/to/certificate \
            --private-key /path/to/private-key \
            --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
            --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
            --role-arn arn:aws:iam::account:role/role-name-with-path
        """).build();

S3Client s3Client = S3Client.builder()
    .credentialsProvider(processCredentialsProvider)
    .build();
```

在您組合所有成品之後，請將紅色顯示的文字取代為您的值。