OSS オブジェクトはデフォルトで非公開です。第三者に特定のファイルを一時的にダウンロードまたはプレビューする権限を付与するには、署名付き URL を生成します。この方法では、相手側で Alibaba Cloud アカウントやアクセス権限を設定する必要はありません。URL には埋め込み署名が含まれており、生成時に指定した有効期間が過ぎると自動的に無効になります。
仕組み
署名付き URL の生成には、AccessKey を用いた暗号化とクエリパラメーターの連結処理が採用されています。
権限チェック — 呼び出し元は、対象オブジェクトに対して
oss:GetObject権限を保持している必要があります。ローカル署名生成 — AccessKey ID および AccessKey Secret を使用し、OSS がオブジェクトパス、有効期限、関連パラメーターを暗号化して署名(
x-oss-signature)を生成します。パラメーター追加 — 署名に関連するパラメーター(
x-oss-date、x-oss-expires、x-oss-credential、x-oss-signature-version、x-oss-signature)をオブジェクト URL にクエリ文字列として付加します。URL 組み立て — これにより、完全な署名付き URL が完成します。
URL 形式:
https://<BucketName>.<Endpoint>/<ObjectName>?<signature parameters>例:
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-process=image%2Fresize%2Cp_10&x-oss-date=20241115T095058Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************%2F20241115%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=6e7a*********************************署名仕様の詳細については、「署名バージョン 4(推奨)」をご参照ください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
OSS バケット(少なくとも 1 つのオブジェクトを含む)
対象オブジェクトに対する
oss:GetObject権限(オンラインプレビューの場合)バケットにアタッチされたカスタムドメイン名
ダウンロードリンクの取得
OSS のデフォルトエンドポイントを使用して署名付き URL を生成します。第三者はこの URL を使用してファイルを直接ダウンロードできます。
OSS 管理コンソール
OSS 管理コンソールで、対象バケットの[ファイル]一覧に移動し、対象ファイルをクリックした後、右側の詳細パネルで[ファイル URL のコピー]をクリックします。生成される URL のデフォルト有効期間は 32,400 秒(9 時間)です。
SDK
以下のすべての SDK サンプルでは、OSS SDK 2.0 のデフォルト設定である「署名バージョン 4」が使用されます。認証情報は OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数から読み込まれます。
Java
import argparse
import alibabacloud_oss_v2 as oss
parser = argparse.ArgumentParser(description="オブジェクト取得の事前署名サンプル")
parser.add_argument('--region', required=True)
parser.add_argument('--bucket', required=True)
parser.add_argument('--endpoint')
parser.add_argument('--key', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss.Client(cfg)
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket,
key=args.key,
)
)
print(f'メソッド: {pre_result.method},'
f' 有効期限: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' URL: {pre_result.url}')
for key, value in pre_result.signed_headers.items():
print(f'署名済みヘッダーのキー: {key}, 署名済みヘッダーの値: {value}')
if __name__ == "__main__":
main()詳細については、「Java による署名付き URL を使用したファイルのダウンロード」をご参照ください。
Python
import argparse
import alibabacloud_oss_v2 as oss
parser = argparse.ArgumentParser(description="presign get object sample")
parser.add_argument('--region', required=True)
parser.add_argument('--bucket', required=True)
parser.add_argument('--endpoint')
parser.add_argument('--key', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss.Client(cfg)
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket,
key=args.key,
)
)
print(f'method: {pre_result.method},'
f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' url: {pre_result.url}')
for key, value in pre_result.signed_headers.items():
print(f'signed headers key: {key}, signed headers value: {value}')
if __name__ == "__main__":
main()詳細については、「Python による署名付き URL を使用したファイルのダウンロード」をご参照ください。
Go
package main
import (
"context"
"flag"
"log"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string
bucketName string
objectName string
)
func init() {
flag.StringVar(®ion, "region", "", "The region where the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The bucket name.")
flag.StringVar(&objectName, "object", "", "The object name.")
}
func main() {
flag.Parse()
if len(bucketName) == 0 || len(region) == 0 || len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters: region, bucket, and object are required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("failed to presign: %v", err)
}
log.Printf("method: %v", result.Method)
log.Printf("expiration: %v", result.Expiration)
log.Printf("url: %v", result.URL)
}詳細については、「Go による署名付き URL を使用したファイルのダウンロード」をご参照ください。
Node.js
const OSS = require("ali-oss");
async function generateSignatureUrl(fileName) {
const client = await new OSS({
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
region: 'oss-cn-hangzhou',
// ブラウザによるダウンロードリンクのブロックを防ぐため、HTTPS を使用します。
secure: true,
authorizationV4: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {}
}, fileName);
}
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated URL:', url);
}).catch(err => {
console.error('Error:', err);
});詳細については、「Node.js による署名付き URL を使用したファイルのダウンロード」をご参照ください。
PHP
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$optsdesc = [
"region" => ['help' => 'The region where the bucket is located.', 'required' => true],
"endpoint" => ['help' => 'The OSS endpoint.', 'required' => false],
"bucket" => ['help' => 'The bucket name.', 'required' => true],
"key" => ['help' => 'The object name.', 'required' => true],
];
$longopts = array_map(fn($key) => "$key:", array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] && empty($options[$key])) {
echo "Error: --$key is required. " . $value['help'] . PHP_EOL;
exit(1);
}
}
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($options["region"]);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
$request = new Oss\Models\GetObjectRequest(bucket: $options["bucket"], key: $options["key"]);
$result = $client->presign($request);
print('url: ' . $result->url . PHP_EOL);詳細については、「PHP による署名付き URL を使用したファイルのダウンロード」をご参照ください。
ossutil
デフォルト有効期間(15 分)でダウンロードリンクを生成します。
ossutil presign oss://examplebucket/example.txtその他の例については、「presign(署名付き URL の生成)」をご参照ください。
ossbrowser
ossbrowser は、管理コンソールと同様のオブジェクトレベル操作をサポートしています。画面上の指示に従って署名付き URL を生成してください。セットアップ手順については、「共通操作」をご参照ください。
オンラインプレビューリンクの取得
ブラウザ内でインラインプレビューを開く(ダウンロードをトリガーしない)署名付き URL を生成するには、まずバケットにカスタムドメイン名をアタッチする必要があります。URL を生成する際には、このカスタムドメインをエンドポイントとして使用します。
カスタムドメイン名がない場合、ほとんどのブラウザはセキュリティ制限により、OSS のデフォルトドメイン URL をダウンロードとして扱います。
OSS 管理コンソール
OSS 管理コンソールにログインします。OSS コンソール
左側ナビゲーションウィンドウで[バケット]をクリックし、対象のバケットをクリックします。
[オブジェクト管理] > [オブジェクト]を選択し、オブジェクト名をクリックします。
[詳細表示]パネルで、[カスタムドメイン名]フィールドからカスタムドメイン名を選択し、[オブジェクト URL のコピー]をクリックします。

ossbrowser
カスタムドメイン名を使用して ossbrowser にログインし、オブジェクトの詳細から URL を生成します。ダウンロード手順については、「グラフィカル管理ツール ossbrowser 1.0」をご参照ください。
SDK(カスタムドメイン名を使用)
OSS クライアントを作成する際に、カスタムドメイン名をエンドポイントとして渡し、CNAME サポートを有効化します。
Java
// カスタムドメイン名をエンドポイントとして指定します。
String endpoint = "https://static.example.com"; // 実際のカスタムドメイン名に置き換えてください。
String region = "cn-hangzhou";
String bucketName = "examplebucket";
String objectName = "exampleobject.txt";
EnvironmentVariableCredentialsProvider credentialsProvider =
CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSupportCname(true); // CNAME を有効化
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
GeneratePresignedUrlRequest request =
new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
request.setExpiration(expiration);
URL signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("Preview URL: " + signedUrl);
} finally {
if (ossClient != null) ossClient.shutdown();
}Python
cfg = oss.config.load_default()
cfg.credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg.region = args.region
cfg.endpoint = "http://static.example.com" # 実際のカスタムドメイン名に置き換えてください。
cfg.use_cname = True # CNAME を有効化
client = oss.Client(cfg)
pre_result = client.presign(
oss.GetObjectRequest(bucket=args.bucket, key=args.key)
)
print(f'url: {pre_result.url}')Go
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region).
WithEndpoint("http://static.example.com"). // 実際のカスタムドメイン名に置き換えてください。
WithUseCName(true) // CNAME を有効化
client := oss.NewClient(cfg)
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute),
)Node.js
const client = await new OSS({
endpoint: 'http://static.example.com', // 実際のカスタムドメイン名に置き換えてください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
region: 'oss-cn-hangzhou',
authorizationV4: true,
cname: true // CNAME を有効化
});PHP
$cfg->setEndpoint("http://static.example.com"); // 実際のカスタムドメイン名に置き換えてください。
$cfg->setUseCname(true); // CNAME を有効化ossutil(カスタムドメイン名あり)
ossutil presign oss://examplebucket/exampleobject.txt \
--endpoint "http://static.example.com" \
--addressing-style "cname"毎回エンドポイントを指定せずに済むよう、カスタムドメイン名をossutil 設定ファイルに追加してください。
ファイルが依然としてブラウザでプレビューされない場合
以下の点を確認してください。
[Content-Type] の不一致 — ファイルの
Content-Typeが実際のタイプと一致していない場合、ブラウザはレンダリングではなくダウンロードを実行します。Content-Type(MIME)の設定方法でマッピングを確認し、必要に応じてメタデータを更新してください。詳細については、「オブジェクトのメタデータの管理」をご参照ください。[Content-Disposition] が [attachment] に設定されている — この設定により、URL に関係なくダウンロードが強制されます。オブジェクトのメタデータで
inlineに変更してください。「オブジェクトのメタデータの管理」をご参照ください。CDN キャッシュの古さ — CDN 加速を利用しており、オブジェクトのメタデータを変更した場合は、CDN キャッシュをリフレッシュして新しい構成を有効化してください。
ファイルの強制ダウンロード
署名付き URL がブラウザでプレビューとして開かれるが、代わりにダウンロードさせたい場合は、以下のいずれかの方法を使用します。方法 1 は方法 2 より優先されます。
方法 1:単一の URL に対してダウンロードを強制
URL を生成する際に、response-content-disposition パラメーターを attachment に設定します。この設定は、当該 URL のみに適用されます。
Java
// URL を生成する前に、GeneratePresignedUrlRequest に追加します。
request.getResponseHeaders().setContentDisposition("attachment");Python
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket,
key=args.key,
response_content_disposition="attachment",
)
)Go
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment"),
})方法 2:すべてのアクセスに対してダウンロードを強制(メタデータ経由)
オブジェクトのメタデータ内の Content-Disposition フィールドを attachment に変更します。この設定は、使用される URL に関係なく、ファイルへのすべてのアクセスに適用されます。
OSS 管理コンソールで対象ファイルを見つけ、ファイル詳細パネルの[ファイルメタデータの設定] をクリックし、Content-Disposition を attachment に設定して、[OK] をクリックします。
また、SDK または ossutil を使用してこのフィールドを更新することも可能です。「ファイルのメタデータの管理」をご参照ください。
ブラウザの保存ダイアログで表示されるファイル名をカスタマイズするには、「ダウンロードファイル名のカスタマイズ」をご参照ください。
特定バージョンのオブジェクトへのリンクの取得
バージョン管理が有効化されたバケット内の特定のオブジェクトバージョンに対して署名付き URL を生成します。
OSS 管理コンソール
OSS 管理コンソールにログインします。OSS 管理コンソール
対象バケットの[ファイル]タブに移動します。右上隅の[履歴バージョン]を[表示]に切り替えます。

対象バージョンのファイル名をクリックし、詳細ページから URL を[コピー]します。

SDK
署名要求にバージョン ID を追加します。
Java
String versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****";
Map<String, String> queryParam = new HashMap<>();
queryParam.put("versionId", versionId);
request.setQueryParameter(queryParam);Python
pre_result = client.presign(
oss.GetObjectRequest(
bucket=bucket_name,
key=object_name,
version_id='CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****',
)
)Go
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
VersionId: oss.Ptr("CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****"),
},
oss.PresignExpires(10*time.Minute),
)Node.js
const signedUrl = await client.signatureUrlV4('GET', 3600, {
queries: {
"versionId": 'CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****'
}
}, objectName);PHP
$versionId = "yourVersionId";
$request = new Oss\Models\GetObjectRequest(bucket: $bucket, key: $key, versionId: $versionId);ossutil
ossutil presign oss://examplebucket/example.txt --version-id 123複数のリンクを一括生成
ossutil を使用して、1 つのコマンドで複数のオブジェクトに対する署名付き URL を一括生成します。
# フォルダ内のすべてのオブジェクト(デフォルト有効期間:15 分)
ossutil presign oss://examplebucket/folder/ -r
# フォルダ内の .txt ファイルのみ
ossutil presign oss://examplebucket/folder/ -r --include "*.txt"
# バケット内のすべてのオブジェクト
ossutil presign oss://examplebucket/ -rその他のオプションについては、「presign(署名付き URL の生成)」をご参照ください。
OSS 管理コンソール(現在のディレクトリのみ)
コンソールでは、現在のディレクトリ内のオブジェクトの URL のみをエクスポートします。サブディレクトリは対象外です。
オブジェクトを選択し、[URL リストのエクスポート] をクリックします。

構成パネルで、必要に応じてパラメーターを調整します。
パラメーター 説明 [HTTPS の使用] デフォルトで HTTPS が使用されます。HTTP を使用する場合は無効化します。 [有効期間] 非公開オブジェクトの場合、URL の有効期間を設定します(60~32,400 秒)。 カスタムドメイン名 プレビュー対応の URL を生成するために、バケットにアタッチされたカスタムドメイン名を使用します。 高速化エンドポイント クロスリージョンまたはクロスボーダーのアクセスに転送アクセラレーションエンドポイントを使用します。 [OK] をクリックして URL リストファイルをダウンロードします。
SDK(リスト+署名パターン)
GetBucket(ListObjects) 操作を使用してオブジェクト名を取得し、それぞれに対して署名付き URL を生成します。
ダウンロードファイル名のカスタマイズ
ユーザーがファイルをダウンロードする際に、ブラウザの保存ダイアログに表示されるファイル名を制御します。
方法 1:単一のリクエストに対して設定
URL 内の filename パラメーターを response-content-disposition に追加します。方法 1 は方法 2 をオーバーライドします。
Java
String filename = "test.txt";
request.getResponseHeaders().setContentDisposition(
"attachment;filename=" + URLEncoder.encode(filename, "UTF-8")
);Python
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket,
key=args.key,
response_content_disposition="attachment;filename=test.txt",
)
)Go
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment;filename=test.txt"),
})方法 2:すべてのアクセスに対してデフォルトファイル名を設定(メタデータ経由)
オブジェクトのメタデータ内の Content-Disposition フィールドを attachment; filename="yourFileName" に変更します。この設定は、すべてのアクセスに適用されます。「ファイルのメタデータの管理」をご参照ください。
有効期間の設定
有効期間は生成時に設定され、その後変更することはできません。署名付き URL は、有効期限が切れるまで何度でもアクセスできます。
署名付き URL は、設定された有効時間または基盤となる認証情報の有効期限のうち、どちらか早い方が到来すると無効になります。Security Token Service(STS)の一時トークンを使用して URL を生成した場合、トークンの有効期限が切れた時点で URL は無効となり、たとえ長い有効期間を設定していても機能しません。STS トークンの最大有効期間は 43,200 秒(12 時間)です。
ツール別の有効期間制限
最大有効期間は、署名バージョンおよび使用するツールによって異なります。署名バージョン 4 を推奨します。これは最大 7 日間をサポートし、バージョン 1 よりも高いセキュリティを提供します。
| ツール | 最大有効期間 | 備考 |
|---|---|---|
| OSS SDK 2.0 | V4:604,800 秒(7 日間);V1:無制限(タイムスタンプベース) | デフォルトは V4。V4 の制限を超えるとエラーが返されます。 |
| OSS SDK 1.0 | V4:604,800 秒(7 日間);V1:無制限(タイムスタンプベース) | デフォルトは V1。V4 の制限を超えていてもエラーは返されません。 |
| ossutil 2.0 | V4:604,800 秒(7 日間);V1:無制限(タイムスタンプベース) | デフォルトは V4。V4 の制限を超えるとエラーが返されます。 |
| ossutil 1.0 | V4:604,800 秒(7 日間);V1:無制限(タイムスタンプベース) | デフォルトは V1。V4 の制限を超えていてもエラーは返されません。 |
| コンソール | 32,400 秒(9 時間) | 固定最大値。 |
| ossbrowser 2.0 | 32,400 秒(9 時間) | V4 のみ対応。 |
| ossbrowser 1.0 | 32,400 秒(9 時間) | V1 のみ対応。 |
署名バージョンの比較:
V4(推奨): 有効期限 = 署名時の協定世界時(UTC)+有効期間。最大 604,800 秒(7 日間)。セキュリティが高い。
V1(非推奨): UNIX タイムスタンプを使用して有効期限を表します。理論上の上限は長いものの、セキュリティが低く、メンテナンスされていません。
V1 と V4 の違いについては、「V1 署名から V4 署名へのアップグレードガイド」をご参照ください。
OSS 管理コンソール
OSS 管理コンソールで、対象バケットの[ファイル]一覧に移動し、対象ファイルをクリックした後、詳細パネルの[有効期限]フィールドでリンクの有効期間を設定します。
SDK
コード内の有効期限パラメーターを変更します。権限付与手順については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
以下の例では、有効期間を 1 時間に設定しています。
Java
// 有効期間:1 時間
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);Python
pre_result = client.presign(
oss.GetObjectRequest(bucket=args.bucket, key=args.key)
)Go
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute), // 有効期間を設定
)Node.js
// 2 番目のパラメーターで有効期間(秒単位)を設定します。例:3600 = 1 時間。
return await client.signatureUrlV4('GET', 3600, {headers: {}}, fileName);PHP
「PHP による署名付き URL を使用したオブジェクトのダウンロード」をご参照ください。
ossutil
# 明示的な有効期間(1 時間)を設定
ossutil presign oss://examplebucket/example.txt --expires-duration 1hossbrowser
ossbrowser は、管理コンソールと同様のオブジェクトレベル操作をサポートしています。「共通操作」をご参照ください。
長期有効リンクの取得
署名付き URL は必ず有効期限があります。有効期限のないアクセスを提供するには、以下のいずれかの方法を使用します。
オブジェクト ACL を [公開読み取り] に設定(非推奨) — URL は永続的に有効であり、署名を必要としません。ただし、URL を知っている誰でもオブジェクトにアクセスできるため、OSS のソースが公開され、トラフィックの悪用リスクが生じます。この方法を使用する場合は、ホットリンク保護(Referer アローリスト) を有効化してリスクを軽減します(完全な防止ではありません)。詳細については、「オブジェクト ACL」をご参照ください。
CDN を使用したプライベートバケットの back-to-origin(推奨) — オブジェクトを OSS で非公開のままにし、CDN 加速ドメイン名経由で配信します。CDN のプライベート OSS バケット back-to-origin を有効化すると、バケット内のすべてのリソースが CDN ドメイン経由でアクセス可能になります。OSS は直接公開されず、CDN が加速およびアクセス制御を提供します。CDN のReferer ホットリンク保護 およびURL 署名 を有効化することで、リンクの悪用を防止できます。
長期有効 URL の構築
ドメイン名とオブジェクトパスから URL を直接構築します(署名は不要)。
| ドメインタイプ | URL 形式 | 例 |
|---|---|---|
| OSS デフォルトドメイン名(パブリックネットワーク) | https://<BucketName>.<Endpoint>/<ObjectName> | https://examplebucket.oss-cn-hangzhou.aliyuncs.com/example/example.jpg |
| OSS デフォルトドメイン名(内部ネットワーク:同一リージョンの ECS インスタンス向け) | https://<BucketName>.<InternalEndpoint>/<ObjectName> | https://examplebucket.oss-cn-hangzhou-internal.aliyuncs.com/example/example.jpg |
| カスタムドメイン名 | https://<YourDomainName>/<ObjectName> | https://example.com/example.jpg |
| CDN 加速ドメイン名 | https://<CDN domain name>/<ObjectName> | http://aliyundoc.com/image_01.jpg |
ここで:
<BucketName>— バケット名<ObjectName>— 完全なオブジェクトパス(例:folder/example.jpg)<Endpoint>— リージョンのエンドポイント<InternalEndpoint>— リージョンの内部ネットワークエンドポイント(例:oss-cn-hangzhou-internal.aliyuncs.com)<YourDomainName>— カスタムドメイン名<CDN domain name>— CDN 加速ドメイン名
HTTPS の構成
URL のプロトコルはエンドポイントによって決まります。
OSS デフォルトエンドポイント — HTTPS はデフォルトでサポートされており、特別な構成は不要です。
カスタムドメイン名 — HTTPS を有効化する前に、証明書のホスティング を完了してください。
プロトコルを制御するには:
コンソール — URL を生成する際の詳細パネルでプロトコルを選択します。デフォルトは HTTPS です。
ossutil / SDK — 使用するエンドポイントに従ってプロトコルが決定されます。HTTPS リンクを生成するには、エンドポイント URL に
https://を指定します。
.txt ファイルのプレビューにおける文字化けの修正
.txt ファイルをプレビューした際に中国語文字が文字化けする場合、ファイルに正しいエンコーディング宣言が欠落しています。オブジェクトのメタデータで .txt の Content-Type を text/plain;charset=utf-8 に設定することで、ブラウザでの UTF-8 レンダリングを強制できます。
OSS 管理コンソールにログインします。
[バケット一覧] をクリックし、対象のバケット名をクリックします。
左側ナビゲーションウィンドウで、[ファイル] > [ファイル一覧] を選択します。
対象オブジェクトの右側にある [ファイルメタデータの設定] を選択します。
[HTTP 標準プロパティ] 領域で、[Content-Type] を
text/plain;charset=utf-8に設定します。[OK] をクリックします。
アクセス元によるアクセス制限
Referer ホットリンク保護 を使用して、特定のウェブサイトからのみ OSS リソースへのアクセスを許可できます。それ以外のソースからのリクエストは拒否されます。たとえば、アローリストを構成して https://example.com のみを許可できます。
STS を使用した広範なアクセスの付与
署名付き URL は GetObject(ダウンロード)のみをサポートします。第三者にオブジェクト一覧表示、アップロード、コピーなどの追加操作を許可するには、Security Token Service(STS)の一時アクセス認証情報を使用します。詳細については、「STS 一時アクセス認証情報による OSS へのアクセス」をご参照ください。
画像処理
画像のサイズ変更、ウォーターマークの追加などを行うために、署名付き URL に画像処理パラメーターを含めることができます。「画像処理」をご参照ください。
セキュリティに関するベストプラクティス
署名付き URL を共有する際の露出を最小限に抑えるため、以下の推奨事項に従ってください。
常に HTTPS を使用してください。 HTTP 経由で署名付き URL が傍受された場合、攻撃者は URL の有効期限が切れるまでファイルをダウンロードできます。URL を生成する際には、エンドポイントに
https://を指定してください。ユースケースを満たす最短の有効期間を設定してください。 1 時間有効な URL は、7 日間有効な URL よりもリスクが低いです。
署名バージョン 4 を使用してください。 バージョン 4 はバージョン 1 よりも高いセキュリティを提供し、OSS SDK 2.0 および ossutil 2.0 のデフォルトです。
長期間有効な STS トークンで URL を生成しないでください。 STS トークンから生成された URL が漏洩した場合、トークンの有効期限が切れるまで URL は有効のままです。STS トークンの有効期間は、ユースケースに応じて可能な限り短くしてください。
Referer ホットリンク保護を有効化してください。 URL を使用できるドメインを制限できます。「アクセス元によるアクセス制限」をご参照ください。
機密性の高いファイルには公開読み取り ACL を使用しないでください。 公開読み取りでは署名要件が完全に撤廃されます。永続的なアクセスには、CDN を使用したプライベート back-to-origin を代わりに使用してください。「長期有効リンクの取得」をご参照ください。
よくある質問
設定した有効期間より前に URL が無効になるのはなぜですか?
署名付き URL は、設定された有効時間または基盤となる認証情報の有効期限のうち、どちらか早い方が到来すると無効になります。STS トークンを使用して URL を生成した場合、トークンの有効期限が切れた時点で URL は無効となり、たとえ長い有効期間を設定していても機能しません。STS トークンの最大有効期間は 43,200 秒(12 時間)です。使用した認証情報の種類を確認し、認証情報自体の有効期限が切れていないことを確認してください。
URL にアクセスした際に 403 エラーが発生するのはなぜですか?
URL を生成する際に、呼び出し元は oss:GetObject 権限を保持している必要があります。以下の点を確認してください。
URL を生成した RAM ユーザーまたはロールが、特定のオブジェクトに対して
oss:GetObject権限を保持していること。バケットまたはオブジェクトポリシーで、明示的にアクセスが拒否されていないこと。
詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
署名不一致エラーが発生するのはなぜですか?
主な原因は以下のとおりです。
URL を生成したマシンのシステム時計が同期していない。NTP サーバーと同期させてください。わずかな時刻のずれでも署名が無効になります。
クライアントと OSS の間にプロキシがあり、ヘッダーまたはクエリパラメーターが変更され、署名が改ざんされている。
ファイルがプレビューではなくダウンロードされるのはなぜですか?
ブラウザの動作(プレビュー vs. ダウンロード)は、Content-Disposition および Content-Type ヘッダーによって決まります。
Content-Dispositionがattachmentに設定されている場合、ブラウザは常にファイルをダウンロードします。オブジェクトのメタデータでinlineに変更してください。Content-Typeがファイルタイプと一致していない場合、ブラウザはプレビュー可能と認識できないことがあります。Content-Typeを正しい MIME タイプに更新してください。プレビューを有効にするには、OSS のデフォルトエンドポイントではなくカスタムドメイン名を使用する必要があります。ほとんどのブラウザは、OSS のデフォルトエンドポイントからのインラインレンダリングをブロックするためです。