How to generate Signature in AWS from Java

前端 未结 6 649
被撕碎了的回忆
被撕碎了的回忆 2020-12-24 10:19

When I invoke API endpoints from REST client, I got error by concerning with Signature.

Request:

Host: https://xxx.execute-ap

6条回答
  •  难免孤独
    2020-12-24 10:50

    This is possible using 100% java libraries without additional dependencies, just use the query parameters generated here:

    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SignatureException;
    import java.util.Formatter;
    
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import java.util.Base64;
    
    ...
    
    private static final String ACCESS_KEY = "...";
    private static final String SECRET_KEY = "...";
    private static final int expiresTime = 1 * 24 * 60 * 60;
    private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    
    public void sign(String protocol, String bucketName, String contentPath) throws Exception {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR_OF_DAY, 24);
    
        String host = bucketName + ".s3-us-west-2.amazonaws.com";
        long expireTime = cal.getTimeInMillis() / 1000;
    
        String signString = "GET\n" +
            "\n" +
            "\n" +
            expireTime + "\n" +
            "/" + bucketName + contentPath;
    
        SecretKeySpec signingKey = new SecretKeySpec(SECRET_KEY.getBytes(), HMAC_SHA1_ALGORITHM);
        Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
        mac.init(signingKey);
        String signature = URLEncoder.encode(new String(Base64.getEncoder().encode(mac.doFinal(signString.getBytes()))));
    
        System.out.println(signature);
        String fullPayload = "?AWSAccessKeyId=" + ACCESS_KEY +
            "&Expires=" + expireTime + 
            "&Signature=" + signature;
    
        System.out.println(protocol + "://" + host + contentPath + fullPayload);
    }
    
    ...
    

提交回复
热议问题