OSS 将逐步下线 V1 签名,请尽快升级至更安全的 V4 签名,以确保应用稳定运行。
如何从V1签名升级为V4签名
根据当前使用方式,参考对应的指引完成升级。
工具 | 类型 | 支持V4的版本 | 升级指引 |
OSS SDK | Java | 3.17.4及以上版本 | OSS SDK |
PHP | 2.7.0及以上版本 | ||
JavaScript | 6.20.0及以上版本 | ||
Python V2 | 所有版本 | ||
Python V1 | 2.18.4及以上版本 | ||
.NET | 2.14.0及以上版本 | ||
Go V2 | 所有版本 | ||
Go V1 | 3.0.2及以上版本 | ||
C++ | 1.10.0及以上版本 | ||
C | 3.11.0及以上版本 | ||
iOS | 2.11.1及以上版本 | ||
Android | 2.3及以上版本 | ||
ossutil | ossutil2.0 | 所有版本 | ossutil |
ossutil1.0 | 1.7.12及以上版本 | ||
ossbrowser | ossbrowser2.0 | 所有版本 | ossbrowser |
ossbrowser1.0 | 所有版本不支持 | ||
ossfs | ossfs2.0 | 所有版本 | ossfs |
ossfs1.0 | 1.91.4及以上版本 | ||
API(手动构造签名) | 如何将手动构造的V1签名算法升级为V4,参见API(手动构造签名) | ||
OSS控制台 | OSS自动升级,用户无感 |
OSS SDK
Java
升级OSS Java SDK为3.17.4及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,地域ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
SignVersion.V4
。
代码示例
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
public class OSSClientV4 {
public static void main(String[] args) throws Exception {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填写Endpoint对应的Region信息,例如cn-hangzhou。
String region = "cn-hangzhou";
// 从环境变量中获取访问凭证。运行本代码示例之前,请先配置环境变量。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 创建OSSClient实例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 显式声明使用 V4 签名算法
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
// 关闭OSSClient。
ossClient.shutdown();
}
}
PHP
升级OSS PHP SDK为2.7.0及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,地域ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
OSS_SIGNATURE_VERSION_V4
。
代码示例
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
try {
// 从环境变量中获取访问凭证,并保存在provider中。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
// 填写Endpoint对应的Region信息,例如cn-hangzhou。
"region" => "cn-hangzhou"
);
$ossClient = new OssClient($config);
} catch (OssException $e) {
printf($e->getMessage() . "\n");
return;
}
Node.js
升级OSS Node.js SDK为6.20.0及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的OSS专用地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
oss-cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
authorizationV4
。
代码示例
const OSS = require('ali-oss');
const client = new OSS({
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourRegion',
authorizationV4: true,
// yourBucketName填写Bucket名称。
bucket: 'yourBucketName',
});
Python
Python V2
OSS Python V2所有版本默认支持V4签名。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。
代码示例
import alibabacloud_oss_v2 as oss
def main():
# 从环境变量中加载凭证信息,用于身份验证
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 加载SDK的默认配置,并设置凭证提供者
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 方式一: 只填写Region即可
# 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
cfg.region = 'cn-hangzhou'
# # 方式二: 直接填写Region和Endpoint
# # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
# cfg.region = 'cn-hangzhou'
# # 填写Bucket所在地域对应的公网Endpoint。以华东1(杭州)为例,Endpoint填写为'https://oss-cn-hangzhou.aliyuncs.com',
# # 如需指定为http协议,请在指定域名时填写为'http://oss-cn-hangzhou.aliyuncs.com'
# cfg.endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 使用配置好的信息创建OSS客户端
client = oss.Client(cfg)
# 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
main() # 脚本入口,当文件被直接运行时调用main函数
Python V1
升级OSS Python SDK为2.18.4及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,地域ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
oss2.ProviderAuthV4
。
代码示例
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请先配置环境变量。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'yourEndpoint'
# 填写Endpoint对应的Region信息,例如cn-hangzhou。
region = 'cn-hangzhou'
# 填写Bucket名称。
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
Browser.js
升级OSS Browser.js SDK为6.20.0及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的OSS专用地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
oss-cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
authorizationV4
。
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<!--导入SDK文件-->
<script
type="text/javascript"
src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.20.0.min.js"
></script>
<script type="text/javascript">
const client = new OSS({
// yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
region: 'yourRegion',
authorizationV4: true,
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
accessKeyId: 'yourAccessKeyId',
accessKeySecret: 'yourAccessKeySecret',
// 从STS服务获取的安全令牌(SecurityToken)。
stsToken: 'yourSecurityToken',
// 填写Bucket名称,例如examplebucket。
bucket: "examplebucket",
});
</script>
</body>
</html>
.NET
升级OSS .NET SDK为2.14.0及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
SignVersion.V4
。
代码示例
using Aliyun.OSS;
using Aliyun.OSS.Common;
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");、
// 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。
const string region = "cn-hangzhou";
// 创建ClientConfiguration实例,按照您的需要修改默认参数。
var conf = new ClientConfiguration();
// 设置v4签名。
conf.SignatureVersion = SignatureVersion.V4;
// 创建OssClient实例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
Go
Go V2
OSS Go V2所有版本默认支持V4签名。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。
代码示例
package main
import (
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
// 方式一:只填写Region即可
// 填写Bucket所在地域,以华东1(杭州)为例,Region填写为cn-hangzhou
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion("cn-hangzhou")
// 方式二:直接填写Region和Endpoint
// 填写Bucket所在地域,以华东1(杭州)为例,Region填写为cn-hangzhou
// 填写Bucket所在地域对应的公网Endpoint,以华东1(杭州)为例,Endpoint填写为'https://oss-cn-hangzhou.aliyuncs.com'。如需指定为http协议,请在指定域名时填写为'http://oss-cn-hangzhou.aliyuncs.com'
// cfg := oss.LoadDefaultConfig().
// WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
// WithRegion("cn-hangzhou").
// WithEndpoint("https://oss-cn-hangzhou.aliyuncs.com")
// 创建OSS客户端
client := oss.NewClient(cfg)
// 使用client执行后续操作...
}
Go V1
Go V2所有版本默认支持V4签名,建议将Go SDK V1迁移到Go SDK V2。
升级OSS GO V1 SDK为3.0.2及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
oss.AuthV4
。
代码示例
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError 用于处理不可恢复的错误,并记录错误信息后终止程序。
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient 用于设置并创建OSS客户端实例。
// 参数:
//
// endpoint - Bucket对应的Endpoint。
// region - Endpoint对应的Region信息。
//
// 返回创建的OSS客户端实例。
func setupClient(endpoint, region string) (*oss.Client, error) {
// 从环境变量中获取访问凭证。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// 创建OSSClient实例,并使用V4签名。
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region(region))
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
endpoint := "yourEndpoint"
// yourRegion填写Endpoint对应的Region信息,例如cn-hangzhou。
region := "yourRegion"
// 检查环境变量是否已经设置。
if endpoint == "" || region == "" {
log.Fatal("Please set yourEndpoint and yourRegion.")
}
// 设置并创建OSS客户端实例。
client, err := setupClient(endpoint, region)
if err != nil {
handleError(err)
}
// 输出客户端信息。
log.Printf("Client: %#v\n", client)
}
C++
升级OSS C++ SDK为1.10.0及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
SignatureVersionType::V4
。
代码示例
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS账号信息。*/
/* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。*/
std::string Region = "yourRegion";
/* 初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 释放网络等资源。*/
ShutdownSdk();
return 0;
}
C
升级OSS C SDK为3.11.0及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
signature_version = 4
。
代码示例
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* yourRegion填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*类型的字符串初始化aos_string_t类型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
//需要额外配置以下两个参数
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用CNAME访问OSS服务。0表示不使用。*/
options->config->is_cname = 0;
/* 用于设置网络相关参数,其中这个函数的第二个参数表示ctl的归属,默认为0。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main() {
aos_pool_t *p;
oss_request_options_t *options;
/* 初始化全局变量,在程序生命周期内只需要调用一次。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
return -1;
}
/* 初始化内存池和options。*/
aos_pool_create(&p, NULL);
options = oss_request_options_create(p);
init_options(options);
/* 逻辑代码,此处省略。*/
/* 释放内存池,相当于释放了请求过程中各资源分配的内存。*/
aos_pool_destroy(p);
/* 释放之前分配的全局资源,在程序生命周期内只需要调用一次。*/
aos_http_io_deinitialize();
return 0;
}
iOS
升级OSS iOS SDK为2.11.1及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
OSSSignVersionV4
。
代码示例
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
NSString *endpoint = @"yourEndpoint";
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
NSString *accessKeyId = @"yourAccessKeyId";
NSString *accessKeySecret = @"yourAccessKeySecret";
// 从STS服务获取的安全令牌(SecurityToken)。
NSString *securityToken = @"yourSecurityToken";
NSString *region = @"yourRegion";
id<OSSCredentialProvider> credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:accessKeyId secretKeyId:accessKeySecret securityToken:securityToken];
OSSClientConfiguration *configuration = [OSSClientConfiguration new];
configuration.signVersion = OSSSignVersionV4;
OSSClient *client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider clientConfiguration:configuration];
client.region = region;
Android
升级OSS Android SDK为2.3及以上版本。
相比V1签名,使用V4签名初始化OSS Client时,您需要:
指定Bucket所在地域的地域ID作为发起请求地域的标识,以华东1(杭州)为例,Region ID为
cn-hangzhou
。显式声明使用 V4 签名算法,示例值:
SignVersion.V4
。
代码示例
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 从STS服务获取的安全令牌(SecurityToken)。
String securityToken = "yourSecurityToken";
// yourEndpoint填写Bucket所在地域。以华东1(杭州)为例,region填写为cn-hangzhou。
String region = "yourRegion";
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
ClientConfiguration config = new ClientConfiguration();
config.setSignVersion(SignVersion.V4);
// 创建OSSClient实例。
OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
oss.setRegion(region);
ossutil
ossutil2.0
命令行工具ossutil 2.0所有版本默认支持V4签名。
相比V1签名,使用V4签名时,您需要在配置ossutil时,使用Bucket所在地域的地域ID设置Region
。
示例命令
Please enter Region [cn-hangzhou]:cn-hangzhou
ossutil1.0
ossutil2.0所有版本默认支持V4签名,建议ossutil 1.0迁移至ossutil2.0
命令行工具ossutil 1.0的1.7.12及以上版本支持V4签名。
相比V1签名,使用V4签名时,您需要在命令中:
使用
v4
设置签名版本--sign-version
。使用Bucket所在地域的地域ID设置
--region
。
示例命令
./ossutil64 --sign-version v4 --region cn-hangzhou mb oss://examplebucket
ossbrowser
ossbrowser2.0
图形化管理工具ossbrowser 2.0(预览版)所有版本默认支持V4签名。
ossbrowser1.0
图形化管理工具ossbrowser 1.0所有版本不支持V4签名,您需要使用图形化管理工具ossbrowser 2.0(预览版)。
ossfs
ossfs2.0
ossfs 2.0(预览版)所有版本都支持V4签名,默认V1版本。
升级之前,执行
ossfs --version
命令查看当前版本,并根据实际版本要求完成以下前置操作。重要涉及卸载操作将会中断业务,建议您选择在业务低谷期进行此操作。
卸载已挂载的OSS文件系统。
<mountpoint>
替换为实际目录。sudo umount <mountpoint>
卸载后,请按照示例命令进行升级。
相比V1签名,使用V4签名时,您需要在挂载命令中:
使用Bucket所在地域的地域ID设置
oss_region
选项。
示例命令
ossfs2 mount /tmp/ossfs2-bucket/ -c /etc/ossfs2.conf --oss_region=cn-hongkong
ossfs1.0
ossfs 1.0的1.91.4及以上版本支持V4签名。
升级之前,执行
ossfs --version
命令查看当前版本,并根据实际版本要求完成以下前置操作。重要涉及卸载操作将会中断业务,建议您选择在业务低谷期进行此操作。
符合版本要求升级V4
卸载已挂载的OSS文件系统。
<mountpoint>
替换为实际目录。sudo umount <mountpoint>
卸载后,请按照示例命令进行升级。
不符合版本要求升级V4
卸载已挂载的OSS文件系统。
<mountpoint>
替换为实际目录。sudo umount <mountpoint>
卸载旧版本。
如果是通过包管理工具(如
apt
、yum
等)安装的,请执行以下操作:sudo apt remove ossfs # Ubuntu/Debian系统 sudo yum remove ossfs # CentOS系统/Anolis系统/Alibaba Cloud Linux系统
如果是从源代码编译安装的,进入到安装目录并执行以下操作:
sudo make uninstall
下载安装新版本。
安装新版本后,请按照示例命令进行升级。
相比V1签名,使用V4签名时,您需要在挂载命令中:
设置
sigv4
选项。使用Bucket所在地域的地域ID设置
region
选项。
示例命令
ossfs examplebucket -o sigv4 -o region=cn-hangzhou /tmp/ossfs -o url=http://oss-cn-hangzhou.aliyuncs.com
API(手动构造签名)
建议您优先使用 OSS SDK 发起请求,SDK 会自动计算签名。如无法使用 OSS SDK,需手动构造 V4 签名并确保请求正确。
签名方式 | 说明 | 参考文档 |
在Header中包含签名 | 在OSS中,使用HTTP请求的Authorization Header来携带签名信息是进行身份验证的最常见方法。除了使用POST签名和URL签名之外,所有的OSS操作都需要通过Authorization Header来进行身份验证。 | 在Header中包含V4签名 |
在URL中包含签名 | 通过生成一个包含签名和其他必要请求信息的预签名URL的方式,在不透露访问凭证的情况下,授予第三方在特定有效期内对OSS资源的访问权限。 | 在URL中包含V4签名 |
POST请求签名 | PostObject签名旨在实现通过HTML表单直接上传文件到OSS的一种签名机制。这种机制允许用户在客户端(例如Web浏览器)构造一个HTML表单,表单中包含要上传文件的字段以及其他必要的参数,例如签名、访问密钥、Bucket名称、对象键等。当表单提交时,这些信息会通过HTTP POST请求发送到OSS,OSS会对POST请求进行合法性验证。 | POST请求V4签名 |
V1签名下线时间和影响
公告 | 生效时间 | 变更说明 | 受影响的对象 | 应对措施 |
阿里云对象存储签名版本 V1 下线公告 | 2025年3月1日00:00:00 | 新开通 OSS的用户(阿里云账号UID)将无法使用 V1 签名发起请求 | 2025年3月1日00:00:00之后开通 OSS 的用户 | 如何从V1签名升级为V4签名 |
2025年9月1日00:00:00 | 新增的 Bucket 不再支持使用 V1 签名发起的请求 | 所有用户在2025年9月1日00:00:00之后创建的 Bucket | ||
2025年9月1日00:00:00 | 逐步停止更新与维护V1签名 | 所有用户 |
V1签名和V4签名对比
项目 | V1签名 | V4签名 |
签名算法 | HMAC-SHA1 | HMAC-SHA256 |
预签名URL有效期 | 签名时间可以超过 7天。有效期可以超过7天。 | 签名时间限制为7天内。有效期限制7天内。 |
签名字符串的构建 | 构建的签名字符串包含 HTTP 方法、Content-MD5、Content-Type、日期、规范化的头部和资源路径。 | 构建的签名字符串包含更复杂的结构,包括请求方法、规范化的 URI、规范化的查询参数、规范化的头部、附加的签名头部和负载哈希。 |
规范化头部和查询参数 | 只规范化以 x-oss-开头的头部,只有部分查询参数参与签名。 | 规范化所有以 x-oss-开头的头部以及默认签名头部(如content-type和content-md5),并且支持附加的签名头部。 |
资源路径编码 | 对资源路径中的正斜线(/)进行编码。 | 资源路径中的 |
时间戳和日期格式 | 使用标准的HTTP日期格式(例如:Wed, 21 Oct 2015 07:28:00 GMT)。 | 使用ISO8601格式的UTC时间(例如:20151021T072800Z) |
地域信息 | 签名中不包含区域信息 | 签名规则引入了区域的概念,签名字符串和签名密钥都需要包含RegionId。 |
常见问题
存量的Bucket是否可以继续使用V1签名?
2025年3月1日00:00:00~2025年9月1日00:00:00,2025年3月1日00:00:00之前开通OSS的用户的Bucket可以继续使用V1签名。
2025年9月1日00:00:00之后,2025年3月1日00:00:00之前开通OSS的用户在2025年9月1日00:00:00之前创建的 Bucket 可以继续使用V1签名。
如何快速确认我现在使用的是OSS V1签名还是V4签名?
通过实时日志查询或抓包工具(如Wireshark、Fiddler),查看发送到OSS的HTTP请求头中的Authorization
字段。
V1签名:
Authorization
字段以OSS
开头,格式如下:Authorization: OSS <AccessKeyId>:<Signature>
V4签名:
Authorization
字段以OSS4-HMAC-SHA256
开头,格式如下:Authorization: OSS4-HMAC-SHA256 Credential=<AccessKeyId>/<Date>/<Region>/oss/aliyun_v4_request, AdditionalHeaders=<Headers>, Signature=<Signature>
SignatureDoesNotMatch如何快速检查
如果签名计算错误,系统会返回错误码 SignatureDoesNotMatch
。此时,可以通过对比服务端和客户端生成的签名相关信息快速定位问题。服务端在返回的响应(Response)中会包含以下关键信息:
CanonicalRequest
:服务端生成的规范化请求字符串。StringToSign
:服务端基于规范化请求生成的待签名字符串。Signature
:服务端最终计算出的签名值。
将这些字段与客户端生成的对应字段进行逐一比对,可以快速识别差异并定位错误来源。例如:
如果
CanonicalRequest
不一致,可能是请求参数拼接顺序或格式有误。如果
StringToSign
不一致,可能是日期、地域或云产品信息设置错误。如果
Signature
不一致,可能是派生密钥计算或签名算法实现存在问题。