OSS对象存储JavaV4签名

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储OSS,敏感数据保护2.0 200GB 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月前
|
存储 Cloud Native 容灾
阿里云对象存储(OSS):企业数字化转型的核心存储引擎
阿里云对象存储(OSS)是全球领先的云原生存储服务,提供无限扩展的存储容量、高达12个9的数据持久性以及企业级安全防护。它支持智能分层存储降低成本,通过CDN加速实现高性能访问,并深度集成阿里云生态,适用于海量静态资源分发、大数据分析、备份容灾等场景。OSS以全生命周期管理与开发者友好工具助力企业高效、安全地释放数据价值,推动数字化转型。
1181 15
|
3月前
|
存储 弹性计算 数据管理
阿里云OSS对象存储收费标准价格表:流量包+存储包2025最新整理
阿里云OSS对象存储2025收费标准及请求费用等,提供按量付费与包年包月两种模式。标准型本地冗余存储按量价为0.09元/GB/月,包年包月如500GB仅118.99元/年。流量费仅收公网出方向,闲时0.25元/GB、忙时0.5元/GB。更多详情见官网。
1494 2
|
5月前
|
存储 前端开发 开发工具
利用阿里云OSS(对象存储服务)快速搭建私人网盘
本文介绍了如何使用阿里云OSS搭建个人网盘的详细步骤。首先,注册阿里云账号并开通OSS服务,创建Bucket;接着,配置AccessKey和跨域访问(CORS)规则。然后,选择开源项目(如FileBrowser)或自定义前端,结合OSS SDK实现文件上传下载功能。最后,部署到服务器并绑定域名,确保安全与性能优化,如权限控制、数据备份及CDN加速。
1094 7
|
5月前
|
Java 对象存储
OSS对象存储Header方式JavaV4签名
本文介绍了如何使用Java代码生成阿里云OSS的V4签名授权。通过设置时间、访问密钥等参数,创建签名请求并输出授权信息。包含两张示意图展示流程和关键步骤。
180 1
|
存储 人工智能 安全
OSS 深度解析:Data + AI 时代的对象存储
在 Data + AI 时代,随着大数据分析和 AI/ML 工作负载的进一步融合,对象存储 OSS 作为面向 AI 时代的数据基础设施,迎来了新的挑战与创新机遇。本话题我们将会介绍对象存储的能力创新,深度解读对象存储在实现稳定、安全、高性能和低成本背后的技术进展,并展望未来 AI 驱动趋势下的技术发展方向。
1406 0
|
弹性计算 对象存储
【答疑】对象存储OSS常见问题解答(咨询类1)
1. OSS最大支持多大的文件? 解答:非multipart方式上传,最大支持5GB的文件; multipart方式上传,最大支持48.8TB。 通过控制台上传、简单上传、表单上传、追加上传的文件大小不能超过5GB, 要上传大小超过5GB的文件必须使用断点续传方式。
4494 0
|
Web App开发 Java 开发工具
【答疑】对象存储OSS常见问题解答(SDK类2)
1.客户在使用OSS java SDK 上传时发现卡死。解答:原因是连接池中连接泄漏,可能是使用ossObject后没有关闭。云栖社区里有一篇文章详细介绍了这个问题: https://yq.aliyun.
2243 0
|
Web App开发 存储 对象存储
【答疑】对象存储OSS常见问题解答(咨询类3)
OSS支不支持HTTPS?解答:支持 使用HTTPS的最佳实践: https://yq.aliyun.com/articles/686003?spm=a2c4e.11163080.searchblog.97.34e42ec1yNirpJ 如果使用OSS又用了CDN加速, 第一次CDN没命中的时候, 是怎样收费的?解答:如果访问CDN没有命中的话,CDN会去OSS回源,这时是不消耗下行流量包的,只消耗回源流量包。
1815 0
|
Web App开发 Linux 对象存储
【答疑】对象存储OSS常见问题解答(工具类1)
1. OSS控制台不支持上传文件夹,是否有其它方式可以支持? 解答:OSS提供了ossutil工具,支持文件夹上传。 使用cp命令进行上传/下载/拷贝文件时: 使用-r选项来拷贝文件夹 详见官网说明:https://help.aliyun.com/document_detail/50561.html Github:http://github.com/aliyun/ossutil 2. OSS的URL,怎么将失效时间设置得久一点? 解答:请使用ossutil工具。
4361 0
|
5月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问