我正在生成预先签名的网址,但由于* .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;
}
答案 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 中的存储桶名称的位置,而不会使签名失效,因为该算法的详细信息。