OSS对象存储JavaV4签名

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 本文介绍了如何使用阿里云OSS-SDK生成V4版本的签名URL和Header签名。通过设置时间、访问密钥等参数,代码示例展示了如何创建带有V4签名的请求,适用于安全访问对象存储服务。相关文档链接提供了更多详细信息。

生成V4版本的签名URL,集成OSS-SDK

package com.example.oss;

import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.DefaultCredentials;
import com.aliyun.oss.common.auth.RequestPresigner;
import com.aliyun.oss.common.comm.RequestMessage;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.signer.OSSSignerParams;
import com.aliyun.oss.internal.signer.OSSV4Signer;

import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class OSSSignURLV4D2 {
    public static void main(String[] args) throws URISyntaxException {

        //设置时间
        LocalDateTime currentTime = LocalDateTime.now();
        // 设置未来时间为当前时间加上2小时
        LocalDateTime futureTime = currentTime.plus(2, ChronoUnit.HOURS);
        // 截至到秒单位
        LocalDateTime futureTimeTruncated = futureTime.truncatedTo(ChronoUnit.SECONDS);
        // 转换为Date类型
        Date futureDate = Date.from(futureTimeTruncated.atZone(ZoneId.systemDefault()).toInstant());


        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String accessKeyId = "";
        String accessKeySecret = "";
        String bucketName = "bucketname";
        String objectName = "1122.png";
        String resourcePath = "/bucketname/1122.png";
        String url = "https://"+bucketName+".oss-cn-beijing.aliyuncs.com/";

        Credentials credentials = new DefaultCredentials(accessKeyId,accessKeySecret);

        Set<String> additionalHeaderNames = new HashSet<>();
        additionalHeaderNames.add("host");

        OSSSignerParams ossSignerParams = new OSSSignerParams(resourcePath,credentials);
        ossSignerParams.setProduct("oss");
        ossSignerParams.setRegion("cn-beijing");
        ossSignerParams.setExpiration(futureDate);
        ossSignerParams.setAdditionalHeaderNames(additionalHeaderNames);

        RequestPresigner requestPresigner = OSSV4Signer.createRequestPresigner(SignVersion.V4,ossSignerParams);
        RequestMessage requestMessage = new RequestMessage(bucketName, objectName);
        requestMessage.setMethod(HttpMethod.GET);
        //URI enp =new URI(endpoint);
        //requestMessage.setEndpoint(enp);
        //requestMessage.setResourcePath(resourcePath);

        requestPresigner.presign(requestMessage);


        for (String value : requestMessage.getParameters().values()) {
            System.out.println(value);
        }
        String version = requestMessage.getParameters().get("x-oss-signature-version");
        String credential = requestMessage.getParameters().get("x-oss-credential");
        String date = requestMessage.getParameters().get("x-oss-date");
        String expires = requestMessage.getParameters().get("x-oss-expires");
        String additional = requestMessage.getParameters().get("x-oss-additional-headers");
        String signature = requestMessage.getParameters().get("x-oss-signature");

        StringBuilder ossurl = new StringBuilder();

        if (additional== null) {
            ossurl.append(url+objectName).append("?");
            ossurl.append("x-oss-signature-version=").append(version).append("&");
            ossurl.append("x-oss-credential=").append(credential).append("&");
            ossurl.append("x-oss-date=").append(date).append("&");
            ossurl.append("x-oss-expires=").append(expires).append("&");
            ossurl.append("x-oss-signature=").append(signature);
        }else {
            ossurl.append(url + objectName).append("?");
            ossurl.append("x-oss-signature-version=").append(version).append("&");
            ossurl.append("x-oss-credential=").append(credential).append("&");
            ossurl.append("x-oss-date=").append(date).append("&");
            ossurl.append("x-oss-expires=").append(expires).append("&");
            ossurl.append("x-oss-additional-headers=").append(additional).append("&");
            ossurl.append("x-oss-signature=").append(signature);
        }

        System.out.println("URL:"+ossurl.toString());

//https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?
// x-oss-signature-version=OSS4-HMAC-SHA256&
// x-oss-credential=<AccessKeyId>/20231203/cn-hangzhou/oss/aliyun_v4_request&
// x-oss-date=20231203T121212Z&
// x-oss-expires=86400&
// x-oss-additional-headers=host&
// x-oss-signature=<signature-to-be-calculated>

    }
}

生成V4版本的Header签名,集成OSS-SDK

package com.example.oss;

import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.DefaultCredentials;
import com.aliyun.oss.common.auth.RequestSigner;
import com.aliyun.oss.common.comm.RequestMessage;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.internal.signer.OSSSignerParams;
import com.aliyun.oss.internal.signer.OSSV4Signer;

import java.net.URI;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class OSSSignHeaderV4D3 {
    public static void main(String[] args) throws URISyntaxException {

        //设置时间
        LocalDateTime currentTime = LocalDateTime.now();
        // 设置未来时间为当前时间加上2小时
        LocalDateTime futureTime = currentTime.plus(2, ChronoUnit.HOURS);
        // 截至到秒单位
        LocalDateTime futureTimeTruncated = futureTime.truncatedTo(ChronoUnit.SECONDS);
        // 转换为Date类型
        Date futureDate = Date.from(futureTimeTruncated.atZone(ZoneId.systemDefault()).toInstant());


        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String accessKeyId = "";
        String accessKeySecret = "";
        String bucketName = "bucketname";
        String objectName = "1122.png";
        String resourcePath = "/bucketname/1122.png";
        String url = "https://"+bucketName+".oss-cn-beijing.aliyuncs.com/";

        Credentials credentials = new DefaultCredentials(accessKeyId,accessKeySecret);

        Set<String> additionalHeaderNames = new HashSet<>();
        additionalHeaderNames.add("host");

        OSSSignerParams ossSignerParams = new OSSSignerParams(resourcePath,credentials);
        ossSignerParams.setProduct("oss");
        ossSignerParams.setRegion("cn-beijing");
        ossSignerParams.setExpiration(futureDate);
        ossSignerParams.setAdditionalHeaderNames(additionalHeaderNames);

        RequestSigner requestSigner = OSSV4Signer.createRequestSigner(SignVersion.V4, ossSignerParams);
        RequestMessage requestMessage = new RequestMessage(bucketName, objectName);
        
      requestMessage.setMethod(HttpMethod.GET);
        URI enp =new URI(endpoint);
        //requestMessage.setEndpoint(enp);
        //requestMessage.setResourcePath(resourcePath);

        requestSigner.sign(requestMessage);

        System.out.println("Authorization:"+requestMessage.getHeaders().get(OSSHeaders.AUTHORIZATION));
        System.out.println("x-oss-date:"+requestMessage.getHeaders().get(OSSHeaders.OSS_DATE));

        System.out.println("URL:"+url+objectName);


    }
}


阿里云官网的提供的V4签名示例


在Header中包含V4签名

https://help.aliyun.com/zh/oss/developer-reference/recommend-to-use-signature-version-4

在URL中包含V4签名

https://help.aliyun.com/zh/oss/developer-reference/add-signatures-to-urls

POST V4签名

https://help.aliyun.com/zh/oss/developer-reference/signature-version-4-recommend

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
3月前
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
3月前
|
存储 人工智能 安全
OSS 深度解析:Data + AI 时代的对象存储
在 Data + AI 时代,随着大数据分析和 AI/ML 工作负载的进一步融合,对象存储 OSS 作为面向 AI 时代的数据基础设施,迎来了新的挑战与创新机遇。本话题我们将会介绍对象存储的能力创新,深度解读对象存储在实现稳定、安全、高性能和低成本背后的技术进展,并展望未来 AI 驱动趋势下的技术发展方向。
652 1
|
6月前
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之多个业务流程上传同名资源到同一个OSS(对象存储服务)URL,会产生什么问题
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
存储 弹性计算 对象存储
预留空间是什么?阿里云OSS对象存储预留空间说明
阿里云OSS预留空间是预付费存储产品,提供折扣价以锁定特定容量,适用于抵扣有地域属性的Bucket标准存储费用及ECS快照费。通过购买预留空间,如500GB通用预留+100GB标准-本地冗余存储包,用户可优化成本。
271 4
|
6月前
|
运维 Serverless 数据处理
函数计算产品使用问题之在对象存储服务(OSS)上创建ZIP包解压触发器后,触发器未按预期执行,一般是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之如何将冷存到OSS(Object Storage Service)的数据恢复
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
7月前
|
文字识别 算法 安全
视觉智能开放平台产品使用合集之如何将返回的图片链接转存到OSS(对象存储服务)
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
6月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
5月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决