OSS 將逐步下線 V1 簽名,請儘快升級至更安全的 V4 簽名,以確保應用穩定運行。
如何從V1簽名升級為V4簽名
根據當前使用方式,參考對應的指引完成升級。
工具 | 類型 | 支援V4的版本 | 升級指引 |
OSS SDK | Java | ||
Python V2 | |||
Python V1 | |||
Go V2 | |||
Go V1 | |||
PHP V2 | |||
PHP V1 | |||
C# V2 | |||
C# V1 | |||
JavaScript | |||
C++ | |||
C | |||
Swift | |||
Objective-C | |||
Android | |||
ossutil | ossutil2.0 | ||
ossutil1.0 | |||
ossfs | ossfs2.0 | ||
ossfs1.0 | |||
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資訊,以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請先配置環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 建立OSSClient執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
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方法以釋放資源。
ossClient.shutdown();
}
}Python
Python SDK V2
OSS Python SDK 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 SDK V1
升級OSS Python SDK V1為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) Go
Go SDK V2
OSS Go SDK 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 SDK V1
Go V2所有版本預設支援V4簽名,建議將Go SDK V1遷移到Go SDK V2。
升級OSS GO SDK V1為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)
}
PHP
PHP SDK V2
OSS PHP SDK V2所有版本預設支援V4簽名。
相比V1簽名,使用V4簽名初始化OSS Client時,您需要:
指定Bucket所在地區的地區ID作為發起請求地區的標識,以華東1(杭州)為例,Region ID為
cn-hangzhou。
<?php
// 引入自動負載檔案,確保依賴庫能夠正確載入
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// 使用EnvironmentVariableCredentialsProvider從環境變數中讀取Access Key ID和Access Key Secret
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
# 載入SDK的預設配置,並設定憑證提供者
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider(credentialsProvider: $credentialsProvider); // 設定憑證提供者
// 方式一: 只填寫Region即可
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou
$cfg->setRegion(region: "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->setRegion(region: 'cn-hangzhou')->setEndpoint(endpoint: 'https://oss-cn-hangzhou.aliyuncs.com');
// 建立OSS用戶端執行個體
$client = new Oss\Client($cfg);
// 使用建立好的client執行後續操作...PHP SDK V1
升級OSS PHP SDK V1為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;
}C#
C# SDK V2
OSS C# SDK V2所有版本預設支援V4簽名。
相比V1簽名,使用V4簽名初始化OSS Client時,您需要:
指定Bucket所在地區的地區ID作為發起請求地區的標識,以華東1(杭州)為例,Region ID為
cn-hangzhou。
using OSS = AlibabaCloud.OSS.V2; // 為阿里雲OSS SDK建立別名,簡化後續使用
var region = "cn-hangzhou"; // 必須項,設定Bucket所在的地區(Region)。以華東1(杭州)為例,Region填寫為cn-hangzhou
var endpoint = null as string; // 可選項,指定訪問OSS服務的網域名稱。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com
// 載入OSS SDK的預設配置,此配置會自動從環境變數中讀取憑證資訊(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 顯式設定使用環境變數擷取憑證,用於身分識別驗證(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 設定配置的Bucket地區
cfg.Region = region;
// 若已指定了endpoint,則覆蓋預設的endpoint
if(endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置資訊建立OSS用戶端執行個體
using var client = new OSS.Client(cfg);
// 使用建立好的client執行後續操作...C# SDK V1
升級OSS C# SDK V1為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);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: 'oss-cn-hangzhou',
// 使用V4簽名演算法
authorizationV4: true,
// yourBucketName填寫Bucket名稱。
bucket: 'yourBucketName',
// yourEndpoint填寫Bucket所在地區對應的公網Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
});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>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;
}Swift
OSS Swift SDK所有版本預設支援V4簽名。
相比V1簽名,使用V4簽名初始化OSS Client時,您需要:
指定Bucket所在地區的地區ID作為發起請求地區的標識,以華東1(杭州)為例,Region ID為
cn-hangzhou。
import AlibabaCloudOSS
import Foundation
@main
struct Main {
static func main() async {
// 填寫Bucket所在地區(樣本:華東1為cn-hangzhou)
let region = "cn-hangzhou"
// 可選項,指定訪問OSS服務的網域名稱。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com
let endpoint: String? = nil
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
let credentialsProvider = EnvironmentCredentialsProvider()
// 配置OSS用戶端參數
let config = Configuration.default()
.withRegion(region) // 設定Bucket所在地區
.withCredentialsProvider(credentialsProvider) // 設定訪問憑證
// 設定自訂Endpoint
if let endpoint = endpoint {
config.withEndpoint(endpoint)
}
// 建立OSS用戶端執行個體
let client = Client(config)
}
}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-hangzhouossutil1.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://examplebucketossfs
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-hongkongossfs1.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來進行身分識別驗證。 | |
在URL中包含簽名 | 通過產生一個包含簽名和其他必要請求資訊的預簽名URL的方式,在不透露訪問憑證的情況下,授予第三方在特定有效期間內對OSS資源的存取權限。 | |
POST請求籤名 | PostObject簽名旨在實現通過HTML表單直接上傳檔案到OSS的一種簽名機制。這種機制允許使用者在用戶端(例如Web瀏覽器)構造一個HTML表單,表單中包含要上傳檔案的欄位以及其他必要的參數,例如簽名、存取金鑰、Bucket名稱、對象鍵等。當表單提交時,這些資訊會通過HTTP POST請求發送到OSS,OSS會對POST請求進行合法性驗證。 |
V1簽名下線時間和影響
根據阿里雲Object Storage Service簽名版本 V1 下線公告,阿里雲Object Storage Service的 V1 簽名將於 2025 年 3 月 1 日起逐步不再對新客戶(新的 uid )開放使用,將於 2025 年 9 月 1 日起逐步停止更新與維護且不再對新增的 Bucket 開放使用。
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。 |
常見問題
如何快速確認我現在使用的是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不一致,可能是衍生金鑰計算或簽名演算法實現存在問題。