文档中心 API签名指南 AWS签名算法说明 AWS签名demo JAVA

JAVA

最近更新时间:2026-02-04 19:02:18

配置 pom.xml

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>auth</artifactId>
        <version>2.40.12</version>
    </dependency>

    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>apache-client</artifactId>
        <version>2.40.12</version>
    </dependency>

    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>regions</artifactId>
        <version>2.40.12</version>
    </dependency>
</dependencies>

调用IAM服务示例 GET

package demo;

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.signer.Aws4Signer;
import software.amazon.awssdk.auth.signer.params.Aws4SignerParams;
import software.amazon.awssdk.http.*;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.regions.Region;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class KsyunIamAws4Demo {

    // ====== 替换为你的 AK / SK ======
    private static final String AK = "YourAccessKey";
    private static final String SK = "YourSecretKey";

    // ====== 金山云 IAM 固定参数 ======
    private static final String SERVICE  = "iam"; // 调用的服务
    private static final String REGION   = "cn-beijing-6"; // 机房
    private static final String ENDPOINT = "https://iam.api.ksyun.com"; // 服务地址

    public static void main(String[] args) throws Exception {

        // 1. 构造查询参数(IAM API 规范)
        Map<String, String> params = new HashMap<>();
        params.put("Action", "ListUsers");
        params.put("Version", "2015-11-01");
        params.put("Marker", "1");
        params.put("MaxItems", "100");

        URI uri = URI.create(ENDPOINT);

        // 2. 构建 HTTP GET 请求(QueryString)
        SdkHttpFullRequest.Builder requestBuilder = SdkHttpFullRequest.builder()
                .uri(uri)
                .method(SdkHttpMethod.GET)
                .putHeader("Host", uri.getHost())
                .putHeader("Accept", "application/json");

        // ⚠️ Query 参数必须 URL Encode
        params.forEach((k, v) ->
                requestBuilder.putRawQueryParameter(
                        URLEncoder.encode(k, StandardCharsets.UTF_8),
                        URLEncoder.encode(v, StandardCharsets.UTF_8)
                )
        );

        SdkHttpFullRequest unsignedRequest = requestBuilder.build();

        // 3. 使用 AWS4Signer 签名
        Aws4Signer signer = Aws4Signer.create();

        Aws4SignerParams signerParams = Aws4SignerParams.builder()
                .awsCredentials(AwsBasicCredentials.create(AK, SK))
                .signingName(SERVICE)
                .signingRegion(Region.of(REGION))
                .build();

        SdkHttpFullRequest signedRequest =
                signer.sign(unsignedRequest, signerParams);

        // 4. 发送 HTTP 请求
        try (SdkHttpClient httpClient = ApacheHttpClient.builder().build()) {

            HttpExecuteRequest executeRequest = HttpExecuteRequest.builder()
                    .request(signedRequest)
                    .build();

            HttpExecuteResponse response =
                    httpClient.prepareRequest(executeRequest).call();

            System.out.println("HTTP Status: "
                    + response.httpResponse().statusCode());

            if (response.responseBody().isPresent()) {
                String body = new BufferedReader(
                        new InputStreamReader(response.responseBody().get()))
                        .lines()
                        .collect(Collectors.joining("\n"));

                System.out.println("Response Body:");
                System.out.println(body);
            }
        }
    }
}

调用IAM服务示例 POST-x-www-form-urlencoded

package demo;

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.signer.Aws4Signer;
import software.amazon.awssdk.auth.signer.params.Aws4SignerParams;
import software.amazon.awssdk.http.*;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.regions.Region;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class KsyunIamAws4PostDemo {

    // ====== 替换为你的 AK / SK ======
    private static final String AK = "YourAccessKey";
    private static final String SK = "YourSecretKey";

    // ====== 金山云 IAM 固定参数 ======
    private static final String SERVICE  = "iam"; // 调用的服务
    private static final String REGION   = "cn-beijing-6"; // 机房
    private static final String ENDPOINT = "https://iam.api.ksyun.com"; // 服务地址

    public static void main(String[] args) throws Exception {

        // 1. POST 参数(IAM 要求)
        Map<String, String> params = new HashMap<>();
        params.put("Action", "CreateUser");
        params.put("Version", "2015-11-01");
        params.put("UserName", "test-user-001");

        // 2. 构建 x-www-form-urlencoded Body(⚠️必须 encode)
        String body = params.entrySet().stream()
                .map(e -> encode(e.getKey()) + "=" + encode(e.getValue()))
                .collect(Collectors.joining("&"));

        byte[] bodyBytes = body.getBytes(StandardCharsets.UTF_8);

        URI uri = URI.create(ENDPOINT);

        // 3. 构建 HTTP POST 请求
        SdkHttpFullRequest unsignedRequest = SdkHttpFullRequest.builder()
                .uri(uri)
                .method(SdkHttpMethod.POST)
                .putHeader("Host", uri.getHost())
                .putHeader("Content-Type", "application/x-www-form-urlencoded")
                .putHeader("Accept", "application/json")
                .contentStreamProvider(() -> new java.io.ByteArrayInputStream(bodyBytes))
                .build();

        // 4. AWS4 签名
        Aws4Signer signer = Aws4Signer.create();
        Aws4SignerParams signerParams = Aws4SignerParams.builder()
                .awsCredentials(AwsBasicCredentials.create(AK, SK))
                .signingName(SERVICE)
                .signingRegion(Region.of(REGION))
                .build();

        SdkHttpFullRequest signedRequest =
                signer.sign(unsignedRequest, signerParams);

        // 5. 发送请求
        try (SdkHttpClient httpClient = ApacheHttpClient.builder().build()) {

            HttpExecuteRequest executeRequest = HttpExecuteRequest.builder()
                    .request(signedRequest)
                    .build();

            HttpExecuteResponse response =
                    httpClient.prepareRequest(executeRequest).call();

            System.out.println("HTTP Status: "
                    + response.httpResponse().statusCode());

            if (response.responseBody().isPresent()) {
                String responseBody = new BufferedReader(
                        new InputStreamReader(response.responseBody().get()))
                        .lines()
                        .collect(Collectors.joining("\n"));

                System.out.println("Response Body:");
                System.out.println(responseBody);
            }
        }
    }

    private static String encode(String s) {
        return URLEncoder.encode(s, StandardCharsets.UTF_8);
    }
}

调用IAM服务示例 POST-JSON

package demo;

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.signer.Aws4Signer;
import software.amazon.awssdk.auth.signer.params.Aws4SignerParams;
import software.amazon.awssdk.http.*;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.regions.Region;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;

public class Aws4PostJsonBodyDemo {

    // ====== 替换为你的 AK / SK ======
    private static final String AK = "YourAccessKey";
    private static final String SK = "YourSecretKey";

    // ====== 金山云 IAM 固定参数 ======
    private static final String SERVICE  = "iam"; // 调用的服务
    private static final String REGION   = "cn-beijing-6"; // 机房
    private static final String ENDPOINT = "https://iam.api.ksyun.com"; // 服务地址

    public static void main(String[] args) throws Exception {

        // 1. JSON Body(示例)
        String jsonBody = """
        {
          "Action": "ListUsers",
          "Version": "2015-11-01"
        }
        """;

        byte[] bodyBytes = jsonBody.getBytes(StandardCharsets.UTF_8);

        URI uri = URI.create(ENDPOINT);

        // 2. 构建 POST + JSON Body 请求
        SdkHttpFullRequest unsignedRequest = SdkHttpFullRequest.builder()
                .uri(uri)
                .method(SdkHttpMethod.POST)
                .putHeader("Host", uri.getHost())
                .putHeader("Content-Type", "application/json")
                .putHeader("Accept", "application/json")
                .contentStreamProvider(() ->
                        new java.io.ByteArrayInputStream(bodyBytes))
                .build();

        // 3. AWS4 签名
        Aws4Signer signer = Aws4Signer.create();

        Aws4SignerParams signerParams = Aws4SignerParams.builder()
                .awsCredentials(AwsBasicCredentials.create(AK, SK))
                .signingName(SERVICE)
                .signingRegion(Region.of(REGION))
                .build();

        SdkHttpFullRequest signedRequest =
                signer.sign(unsignedRequest, signerParams);

        // 4. 发送请求
        try (SdkHttpClient httpClient = ApacheHttpClient.builder().build()) {

            HttpExecuteRequest executeRequest = HttpExecuteRequest.builder()
                    .request(signedRequest)
                    .build();

            HttpExecuteResponse response =
                    httpClient.prepareRequest(executeRequest).call();

            System.out.println("HTTP Status: "
                    + response.httpResponse().statusCode());

            if (response.responseBody().isPresent()) {
                String body = new BufferedReader(
                        new InputStreamReader(response.responseBody().get()))
                        .lines()
                        .collect(Collectors.joining("\n"));

                System.out.println("Response Body:");
                System.out.println(body);
            }
        }
    }
}

上一篇:Python
下一篇:公共错误码
以上内容是否对您有帮助?
有帮助
没帮助