目的
使用CloudFront签名URL机制来实现,下载文件安全。
前提
已经为CloudFront设置好密钥组,并且启用CloudFront签名URL机制来下载s3文件选项。
Maven
...
<aws.java.sdk1.version>1.12.31</aws.java.sdk1.version>
...
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-cloudfront</artifactId>
<version>${aws.java.sdk1.version}</version>
</dependency>
...
Java
这里使用AWS for Java SDK V1的版本,V2的版本我翻了半天文档都没有找到到CloudFront怎么签名URL的,只有V1版本的Java示例代码。
package util;
import com.amazonaws.services.cloudfront.CloudFrontUrlSigner;
import com.amazonaws.services.cloudfront.util.SignerUtils;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.spec.InvalidKeySpecException;
import java.util.Date;
@Slf4j
public class AWSCloudFrontUtil {
/**
* 签名URL
*
* @param distributionDomain 域名
* @param privateKeyFile 私钥文件
* @param s3ObjectKey s3key
* @param keyPairId 密钥id
* @param dateLessThan 小于日期
* @param dateGreaterThan 大于日期
* @return 签名url
*/
public static String signUrl(String distributionDomain, File privateKeyFile, String s3ObjectKey, String keyPairId, Date dateLessThan, Date dateGreaterThan) {
SignerUtils.Protocol protocol = SignerUtils.Protocol.https;
// 中文URL处理,在s3中空格需要替换成+
s3ObjectKey = s3ObjectKey.replace(" ", "+");
s3ObjectKey = UriUtils.encodePath(s3ObjectKey, StandardCharsets.UTF_8);
String ipRange = "0.0.0.0/0";
try {
return CloudFrontUrlSigner.getSignedURLWithCustomPolicy(
protocol, distributionDomain, privateKeyFile,
s3ObjectKey, keyPairId, dateLessThan,
dateGreaterThan, ipRange);
} catch (InvalidKeySpecException | IOException e) {
log.error("签名url异常:", e);
}
return "";
}
}