全部產品
Search
文件中心

Object Storage Service:在URL中包含V1簽名

更新時間:Jun 19, 2024

除了通過HTTP要求標頭部的Authorization欄位進行簽名授權外,您還可以產生一個包含簽名和其他必要的請求資訊的預簽名URL。通過這種方式,您可以在不透露訪問憑證的情況下,授予第三方在特定有效期間內對OSS資源的存取權限。本文介紹如何使用V1簽名演算法實現在URL中包含簽名。

重要

OSS支援更安全的V4簽名演算法,建議您使用V4簽名。更多資訊,請參見V4簽名

SDK簽名實現

OSS SDK已自動實現V1簽名,您使用OSS SDK時無需關注簽名問題。如果您想瞭解具體語言的簽名實現,請參考OSS SDK的代碼。OSS SDK簽名實現的檔案請參見下表。

SDK

簽名實現

使用樣本

Java

OSSV1Signer.java

Java

PHP

SignerV1.php

PHP

Node.js

signatureUrl.js

Node.js

Browser.js

Browser.js

Python

auth.py

Python

Android

ObjectURLPresigner.java

Android

iOS

OSSClient.m

iOS

Go

v1.go

Go

C++

SignerV1.cc

C++

C

oss_auth.c

C

.Net

OssClient.cs

.NET

Ruby

bucket.rb

Ruby

注意事項

  • 使用在URL中籤名的方式,會將授權的資料在到期時間內暴露在互連網上,請預先評估使用風險。

  • OSS不支援同時在URL和Header中包含簽名。

  • 您可以為PUT操作產生一個預簽名的URL,該URL用於檢查是否上傳了正確的內容。SDK對請求進行預簽名時,將計算請求本文的校正和,並產生包含在預簽名URL中的MD5校正和。使用者必須上傳與SDK產生的MD5校正和相同的內容,否則操作失敗。如果要驗證MD5,只需在請求中增加Content-MD5頭即可。

簽名實現

  • 簽名樣本

    https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2p***********&Expires=1141889120&Signature=****Pxyb****mGa%****272YEAiv****

    如果需要使用STS使用者構造URL簽名,則必須攜帶security-token

    https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2p***********&Expires=1141889120&Signature=****Pxyb****mGa%****272YEAiv****&security-token=CAIS****q6Ft5B2yfSjIr****Oz31blR9oWmWBf****DR/xm3Imc****IHxMdHJsCeAcs/Q0lGFR5/sflqJIR****EvCUcZr8szfWcsZos2****u5Jko1be0ewHKeQKZsebWZ+LmNpy/Ht6md1HDkAJq3LL+bk/Mdle5MJqP+/kFC9MMRVuAcCZhDtVbLRcYgq18D3bKMuu3ORPHm3fZCFES2jBxkmRi86+ysIP+phPVlw/90fRH5dazcJW0Zsx0OJo6Wcq+3+FqM6DQlTNM6hwNtoUO1fYUommb54nDXwQIvUjfbtC5qIM/cFVLAYEhAL****TGkvl1h/fejYyfyW****kFCHiPF****JCUSbr4a4sjF6zyPnPWycyCLYXleLzhxPWd/2kagAGaXG69BqwYNvrKKI3W8****bNc1wQDMXQfiHpFCRG6lYhh3****pwH90A3sTlxzRGvi8+****JwrluOHWs+Fj6S6s0cOhKvKRWYE8UuWeXIvv4l6DAGwH****LjLC11f5prUJ****b+3hwuBod32Jx+us/1p996Glao725orcb****

    您可以在簽名URL中添加想要授權的IP地址、IP位址區段或VPC ID,避免未授權的終端訪問OSS資源。

    https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?&OSSAccessKeyId=44CF****************&Expires=1475462111&Signature=77Dv****************&x-oss-ac-subnet-mask=32
  • 參數說明

    名稱

    類型

    是否必選

    描述

    OSSAccessKeyId

    字串

    指定URL簽名中使用的AccessKey ID。

    Expires

    數字

    Unix時間戳記(自UTC時間1970年01月01號開始的秒數),用於標識該URL的逾時時間,單位為秒。如果OSS接收到該URL請求的時間晚於簽名中包含的Expires參數時,則返回請求逾時的錯誤碼。例如,目前時間是1141889060,開發人員希望建立一個60秒後自動失效的URL,則可以設定Expires時間為1141889120。

    說明

    出於安全考慮,OSS控制台中預設URL的有效時間為3600秒,最大值為32400秒。關於修改URL逾時時間的具體操作,請參見使用檔案URL

    Signature

    字串

    簽名資訊。格式如下:

    Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
              VERB + "\n" 
              + CONTENT-MD5 + "\n" 
              + CONTENT-TYPE + "\n" 
              + EXPIRES + "\n" 
              + CanonicalizedOSSHeaders
              + CanonicalizedResource)))
    • 所有OSS支援的請求和各種Header參數,在URL中進行簽名的演算法和在Header中包含簽名的演算法類似。

    • 產生URL中的簽名字串時,除了將Date參數替換為Expires參數外,仍然包含CONTENT-TYPECONTENT-MD5CanonicalizedOSSHeaders簽名版本1中定義的Header(請求中雖然仍有Date請求Header,但無需將Date加入簽名字串中)。

    • 在URL中包含簽名時必須對URL進行編碼。如果在URL中多次傳入Signature、Expires或OSSAccessKeyId,則以第一次傳入的值為準。

    • 使用URL簽名時,OSS會先驗證請求時間是否晚於Expires時間,然後再驗證簽名。

    security-token

    字串

    安全性權杖。只有當使用STS使用者構造URL簽名時,才需要設定此參數。

    說明

    關於搭建STS服務的具體操作,請參見使用STS臨時訪問憑證訪問OSS。您可以通過調用STS服務的AssumeRole介面或者使用各語言STS SDK來擷取臨時訪問憑證。臨時訪問憑證包括臨時存取金鑰(AccessKey ID和AccessKey Secret)和安全性權杖(SecurityToken)。

    x-oss-ac-source-ip

    字串

    指定IP地址或者IP位址區段。

    重要
    • 該參數只需要在產生signature時使用,不需要在URL中攜帶該參數。

    • 如果在產生簽名時添加了IP地址或IP位址區段,則需要傳遞參數x-oss-ac-subnet-mask,用於標記子網路遮罩。

    x-oss-ac-subnet-mask

    數字

    子網路遮罩中1的個數。如果請求中攜帶該參數,OSS會將實際請求IP地址與子網路遮罩進行求與,然後用於計算簽名是否正確。如果該參數被惡意篡改,將導致簽名無法校正通過。

    x-oss-ac-vpc-id

    字串

    指定VPC ID。指定該參數後,OSS會判斷是否為對應VPC ID來源的請求。如果請求是從該VPC ID發起且該參數已賦值,則同時校正VPC ID和來源IP地址或IP位址區段。

    x-oss-ac-forward-allow

    布爾型

    指定是否允許轉寄請求。OSS如果檢測到該欄位並且請求中帶有X-Forwarded-For(可能為多個IP地址),則將X-Forwarded-For的值用於計算簽名校正。

    取值如下:

    • true:表示允許轉寄請求。

      重要

      設定為true存在要求標頭被篡改劫持的風險。

    • false(預設值):不允許轉寄請求。

  • 產生簽名的Python範例程式碼(只涉及必選參數)

    import base64
    import hmac
    import hashlib
    import urllib
    h = hmac.new("accesskey",
                 "GET\n\n\n1141889120\n/examplebucket/oss-api.pdf",
                 hashlib.sha1)
    urllib.quote(base64.encodestring(h.digest()).strip())

錯誤碼

錯誤碼

返回訊息

描述

AccessDenied

403 Forbidden

在URL中添加簽名時,Signature、Expires和OSSAccessKeyId順序可以調換,但不能缺少Signature、Expires或OSSAccessKeyId中的一個或者多個。

AccessDenied

403 Forbidden

訪問的目前時間晚於請求中設定的Expires時間或時間格式錯誤。

InvalidArgument

400 Bad Request

URL中包含Signature、Expires、OSSAccessKeyId中的一個或者多個,並且Header中也包含簽名訊息。