使用以下格式生成预签名URL:s3.amazonaws.com/bucket.name

时间:2015-04-15 13:54:22

标签: amazon-s3

我正在生成预先签名的网址,但由于* .s3.amazonaws证书,因此对于包含句点和SSL的存储桶名称存在问题,如下所述: http://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html

有没有办法生成以下格式的网址?: http://s3.amazonaws.com/bucket.name/key

我没有在API中看到一个选项。我猜我可以通过重新排列网址来“手动”完成它,但如果没有必要,我宁愿避免黑客攻击。

根据Michael的回答,这里是我现在使用的代码:

public static URL bucketNameAfterS3Url(URL url) {

    int index = url.getHost().indexOf("s3");
    String host = url.getHost().substring(index);
    String bucket = url.getHost().substring(0, index - 1);
    URL toUse;
    try {
        toUse = new URL(url.getProtocol(), host, url.getPort(), '/' + bucket + url.getFile());
    } catch (MalformedURLException e) {
    }
    return toUse;
}

2 个答案:

答案 0 :(得分:6)

S3客户端允许您设置一个选项来配置:

    // Configure the S3 client to generate urls with valid SSL certificates. With this setting we will get urls
    // like https://s3.amazonaws.com/bucket_name/... but if this is not set we will get urls like
    // https://bucket_name.s3.amazonaws.com/ which will cause the browser to complain about invalid SSL
    // certificates.
    s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));

答案 1 :(得分:3)

没有任何官方方法可以做到这一点,但字符串操作并不像看起来那样粗略,因为可能的模式是有限的。存储桶名称不能包含斜杠,找到其他元素非常安全。

一个重要的考虑因素是该地区,以及它如何影响URL的有效组合。

在桶“example-bucket”中考虑“lolcat.jpg”......

https://example-bucket.s3.amazonaws.com/lolcat.jpg
https://s3.amazonaws.com/example-bucket/lolcat.jpg

如果存储桶位于美国标准区域,则这两个网址仅相当于

如果没有,顶部的工作正常,但底部的工作将返回一条错误消息,告诉您使用了错误的端点。

对于其他地区,您必须使用正确的区域端点。如果是us-west-2,那实际上就是:

https://s3-us-west-2.amazonaws.com/example-bucket/lolcat.jpg

因此,您必须先了解存储区的区域,然后才能转换网址中的元素。

如果您使用签名版本4,那么您已经知道该区域,因为需要它才能生成签名。使用签名版本2,您甚至可以在签名URL后重新排列URL 中的存储桶名称的位置,而不会使签名失效,因为该算法的详细信息。