Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';由于授权,无法访问S3预签名URL_Java_Amazon S3_Authorization_Aws Java Sdk - Fatal编程技术网

Java Can';由于授权,无法访问S3预签名URL

Java Can';由于授权,无法访问S3预签名URL,java,amazon-s3,authorization,aws-java-sdk,Java,Amazon S3,Authorization,Aws Java Sdk,使用Java8和aws java sdk 1.10.43,我试图获得一个S3文件的预签名URL。我确实返回了一个链接,但浏览该链接会导致以下错误: 不支持您提供的授权机制。请使用 AWS4-HMAC-SHA256 为了强调,我希望生成一个可以通过电子邮件发送并在浏览器中打开的URL,而不是使用Java代码读取该URL 我正在使用下面的代码,我相信我会发现我需要以某种方式设置SetSealGorithm以使用“v4”,但是我没有使它工作。我错过了什么?我应该配置什么(注意:我故意避免配置文件,我希

使用Java8和aws java sdk 1.10.43,我试图获得一个S3文件的预签名URL。我确实返回了一个链接,但浏览该链接会导致以下错误:

不支持您提供的授权机制。请使用 AWS4-HMAC-SHA256

为了强调,我希望生成一个可以通过电子邮件发送并在浏览器中打开的URL,而不是使用Java代码读取该URL

我正在使用下面的代码,我相信我会发现我需要以某种方式设置SetSealGorithm以使用“v4”,但是我没有使它工作。我错过了什么?我应该配置什么(注意:我故意避免配置文件,我希望代码设置环境变量的所有属性)

dateexpiration=;
GeneratePressigneDurlRequest GeneratePressigneDurlRequest=新的GeneratePressigneDurlRequest(bucketName,targetPath);
generatePressigneDurlRequest.setMethod(HttpMethod.GET);
GeneratePressigneDurlRequest.setExpiration(到期);
AmazonS3 s3client=新的AmazonS3客户端(S3凭据);
URL s=s3client.generatePressignedUrl(generatePressignedUrlRequest);
桶位于eu-central-1


谢谢你

通过一些帮助,我找到了答案,这是两个缺失部分的组合(其中一个在评论中提到):

  • 需要设置此选项:

    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
    
  • 必须设置“端点”(上传或下载不需要该端点):

  • 还可以选择添加以下内容:

    s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
    

    在那里提出的解决方案没有帮助——将仍然生成的属性设置为相同的结果。clerify:我可以生成一个似乎是预先签名的URL,但是在浏览器中粘贴该URL会导致错误消息。我并没有试图使用Java代码读取内容,但我希望生成一个要粘贴到浏览器中的URL(例如,通过电子邮件发送)。生成预签名URL时不会与实际的S3服务交互,因此,您的代码“工作”到这一点是有意义的,并且在使用URL时会发生错误。您正在生成的签名URL是否包含
    签名=
    ?。。。或者是
    x-amz-signature=
    ?signature=。下面是我收到的URL示例:https://?AWSAccessKeyId=&Expires=1451297351&Signature=1KD1QFN2GFMJ%2Fa2Wp2ZORVte0Y%3d这绝对是签名版本2 URL,因此您的代码没有启用链接问题中所示的V4签名,一种可能的解释是,您的SDK版本太旧,无法支持它。设置SDK属性或端点对我有帮助。我通过在s3client中添加config属性解决了这个问题。例如:new AmazonS3Client(new ClientConfiguration().with SignerOverride(“AWSS3V4SignerType”))这可以工作…我只执行了
    2
    点。端点的值是多少@蒂拉特
    s3Client.setEndpoint(endpoint);
    
    s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));