すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:サーバ側暗号化

最終更新日:Mar 04, 2026

Object Storage Service (OSS) は、保管中のデータを保護するためにサーバ側暗号化をサポートしています。有効にすると、OSS はアップロード時にオブジェクトを暗号化し、ダウンロード時に復号します。ダウンロード応答の x-oss-server-side-encryption ヘッダーで、オブジェクトが暗号化されていることを確認できます。詳細については、「GetObject」をご参照ください。

暗号化方式の選択

OSS は 2 種類のサーバ側暗号化方式を提供します。どちらも AES-256 アルゴリズムをサポートしています。SSE-KMS は、SDK を介して使用する場合、SM4 もサポートします。

ディメンションSSE-KMSSSE-OSS
キー管理Key Management Service (KMS) によって管理されるカスタマーマスターキー (CMK)。デフォルトの CMK を使用するか、独自の CMK を指定しますOSS がすべてのキーを生成・管理します
キーの制御お客様が CMK を制御します。オプションで、独自のキーマテリアルを持ち込むこと (BYOK) も可能です手動でのキー管理は不要です
暗号化の範囲オブジェクトデータのみ。データキーは暗号化され、オブジェクトのメタデータに保存されますオブジェクトデータ。各オブジェクトは、マスターキーで保護された一意のキーで暗号化されます
コストKMS API の料金が発生します。詳細については、「KMS の課金無料
最適なケースセキュリティやコンプライアンス要件で、特定の CMK が必要なワークロード手動でのキー管理なしで暗号化が必要なワークロード

SSE-KMS の仕組み

SSE-KMS はエンベロープ暗号化を使用します。KMS はデータキーを生成してオブジェクトを暗号化し、次に CMK でデータキーを暗号化します。暗号化されたデータキーは、オブジェクトのメタデータに保存されます。

SSE-KMS encryption logic

デフォルトの KMS マネージド CMK

SSE-KMS を初めて使用する際、OSS は KMS にデフォルトの CMK を作成し、それから派生したキーを使用してオブジェクトを暗号化および復号します。

設定方法:

  • バケットレベル: CMK ID を指定せずに、暗号化方式を KMS に設定します。バケットにアップロードされたすべてのオブジェクトが暗号化されます。

  • オブジェクトレベル: アップロードリクエストで、x-oss-server-side-encryption ヘッダーを KMS に設定します。OSS はデフォルトの CMK および AES-256 を使用してオブジェクトを暗号化します。詳細については、「PutObject」をご参照ください。

カスタム CMK (キーの持ち込み)

カスタム CMK を使用すると、暗号鍵を完全に制御できます。CMK ID はオブジェクトのメタデータに記録され、復号権限を持つユーザーのみがオブジェクトをダウンロードできます。

キーマテリアルのソース:

  • Alibaba Cloud KMS: KMS でキーを作成する際に、キーマテリアルのソースとして [Alibaba Cloud KMS] を選択します。

  • 外部キーマテリアル: キーマテリアルのソースとして [外部] を選択し、独自のキーマテリアルをインポートします。詳細については、「キーマテリアルのインポート」をご参照ください。

設定方法:

  • バケットレベル: 暗号化方式を KMS に設定し、CMK ID を指定します。バケットにアップロードされたすべてのオブジェクトは、指定された CMK で暗号化されます。

  • オブジェクトレベル: アップロードリクエストで、x-oss-server-side-encryptionKMS に、x-oss-server-side-encryption-key-id を CMK ID に設定します。 詳細については、「PutObject」をご参照ください。

SSE-OSS の仕組み

SSE-OSS は、各オブジェクトを一意の AES-256 データキーで暗号化します。OSS はこれらのデータキーを生成・管理し、マスターキーで保護します。

設定方法:

  • バケットレベル: 暗号化方式を AES-256 を使用する SSE-OSS に設定します。バケットにアップロードされたすべてのオブジェクトは、デフォルトで暗号化されます。

  • オブジェクトレベル: アップロードリクエストで x-oss-server-side-encryption ヘッダーを AES256 に設定します。詳細については、「PutObject」をご参照ください。

注意事項

  • バケットの暗号化方式を変更しても、既存のオブジェクトには影響しません。既存のオブジェクトを暗号化するには、CopyObject を呼び出して、現在の暗号化方式で上書きします。

  • 1 つのオブジェクトは、一度に 1 つの方式でのみ暗号化できます。

  • オブジェクトレベルの暗号化は、バケットレベルの暗号化よりも優先されます。オブジェクトのアップロードまたはコピー時に暗号化方法を指定すると、その方法がバケットのデフォルト設定をオーバーライドします。詳細については、「PutObject」をご参照ください。

  • ミラーリングベースのオリジンフェッチルールを通じて取得されたオブジェクトは、デフォルトでは暗号化されません。

  • SSE-KMS は、指定された CMK に対する権限を必要とします。匿名リクエストや、適切な KMS 権限のないリクエストは、This request is forbidden by kms というエラーで失敗します。

キーローテーション

サーバー側暗号化は、キー ローテーション サービスを購入している場合、KMS キーのローテーション をサポートします。

キーローテーションまたは暗号鍵の更新後:

  • 新しいキーは、ローテーション後に作成されたオブジェクトにのみ適用されます。既存のオブジェクトは、以前のキーで暗号化されたままです。

  • キーの更新後、古いキーは絶対に削除しないでください。古いキーを削除すると、それらのキーで暗号化されたオブジェクトにアクセスできなくなります。

必要な権限

RAM ユーザーは、各暗号化操作に対して特定の権限を必要とします。権限の付与について詳しくは、「RAM ユーザーにカスタムポリシーをアタッチする」をご参照ください。

操作ごとの権限

操作必要な権限追加の KMS 権限 (特定の CMK を使用する SSE-KMS)
バケットの暗号化設定バケット管理、PutBucketEncryptionGetBucketEncryptionListKeysListAliasesListAliasesByKeyIdDescribeKey
オブジェクトのアップロードオブジェクトのアップロードListKeysListAliasesListAliasesByKeyIdDescribeKeyGenerateDataKeyDecrypt
オブジェクトのダウンロードオブジェクトのアクセスDecrypt

RAM ポリシーの例

以下の例では、RAM ポリシーを通じて KMS 権限を付与します。

バケットの暗号化設定 (特定の CMK を使用する SSE-KMS)

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:List*",
        "kms:DescribeKey"
      ],
      "Resource": [
        "acs:kms:*:141661496593****:*"
      ]
    }
  ]
}

リソース ARN をご自身のアカウント ID に置き換えてください。特定の CMK へのアクセスを制限するには、ワイルドカードを CMK ID に置き換えます。

オブジェクトのアップロード (特定の CMK を使用する SSE-KMS)

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:List*",
        "kms:DescribeKey",
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": [
        "acs:kms:*:141661496593****:*"
      ]
    }
  ]
}

オブジェクトのダウンロード (特定の CMK を使用する SSE-KMS)

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": [
        "acs:kms:*:141661496593****:*"
      ]
    }
  ]
}

サーバ側暗号化の有効化

重要
  • KMS のキーのローテーションサービスを購入している場合、サーバ側暗号化ではKMS キーのローテーションがサポートされます。キーのローテーションを有効にすると、新しいキーはローテーション後に作成されたオブジェクトにのみ適用されます。既存のオブジェクトは、引き続き以前のキーで暗号化されたままです。

  • 暗号鍵を更新した後、新しいキーは更新後に書き込まれたオブジェクトにのみ適用されます。キーの更新後、古いキーは絶対に削除しないでください。古いキーを削除すると、既存のオブジェクトへのアクセスに影響します。

OSS コンソール

バケットの暗号化の有効化

バケット作成時
  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[バケット] をクリックします。バケットページで、[バケットの作成] をクリックします。

  3. [バケットの作成] パネルで、暗号化パラメーターを設定します。その他のパラメーターの詳細については、「バケットの作成」をご参照ください。

    パラメーター説明
    [暗号化方式]暗号化方法を選択します。有効な値は以下のとおりです。[なし](サーバ側暗号化が無効になっています)、[OSS 管理](OSS 管理のキーでバケット内のオブジェクトを暗号化します。各オブジェクトは異なるキーで暗号化され、マスターキーがこれらのキーを保護します)、[KMS](デフォルトの KMS 管理 CMK または特定の CMK でオブジェクトを暗号化および復号化します。KMS を使用するには、まず KMS を有効化する必要があります。詳細については、「KMS の有効化」をご参照ください)。
    暗号化アルゴリズムAES-256 のみがサポートされています。
    CMKKMS」が「暗号化方法」で選択されている場合にのみ利用可能です。CMK のフォーマットは、<alias>(CMK ID) です。有効な値:「alias/acs/oss(CMK ID)」(デフォルトの CMK によりオブジェクトが暗号化され、ダウンロード時に自動的に復号されます)、および「Alias/<cmkname>(CMK ID)」(カスタム CMK によりオブジェクトが暗号化されます。CMK ID はオブジェクトのメタデータに記録されます。復号権限を持つユーザーに対しては、オブジェクトが自動的に復号されます。CMK ID を指定する前に、バケットと同じリージョンで通常キーまたは外部キーを作成します。詳細については、「CMK の作成」をご参照ください。
  4. [作成] をクリックします。確認ダイアログで、[確認] をクリックします。

既存のバケットの場合
  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[バケット] をクリックします。バケットページで、対象のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、[コンテンツセキュリティ] > [サーバ側暗号化] を選択します。

  4. [サーバー側の暗号化] ページで、[設定] をクリックしてパラメーターを設定します。

    パラメーター説明
    [暗号化方式]暗号化方式を選択します。有効な値: [なし] (サーバ側暗号化は無効になります)、[OSS-Managed] (OSS で管理されるキーがバケット内のオブジェクトを暗号化します。各オブジェクトは異なるキーで暗号化され、マスターキーがそれらのキーを保護します)、[KMS] (デフォルトの KMS で管理される CMK または特定の CMK がオブジェクトを暗号化および復号化します。KMS を使用するには、まず KMS を有効化する必要があります。詳細については、「KMS の有効化」をご参照ください。)。
    暗号化アルゴリズムAES-256 のみがサポートされています。
    CMK[KMS][暗号化方式] を選択した場合にのみ利用可能です。CMK のフォーマットは <alias>(CMK ID) です。有効な値: [OSS がデフォルトでキーを自動作成] (デフォルトの CMK がオブジェクトを暗号化し、ダウンロード時に自動的に復号します。CMK のフォーマットは alias/acs/oss(CMK ID) です。KMS コンソールで CMK を表示します。
    説明

    KMS コンソールで CMK を表示する前に、CMK が作成および適用されるように、バケットに少なくとも 1 つのオブジェクトをアップロードしてください)、 alias/\<cmkname\>(CMK ID) (カスタム CMK はバケット内のオブジェクトを暗号化します。CMK ID はオブジェクトのメタデータに記録されます。復号権限を持つユーザーの場合、オブジェクトは自動的に復号されます。CMK ID を指定する前に、バケットと同じリージョンに通常キーまたは外部キーを作成する必要があります。詳細については、「CMK の作成」をご参照ください。)

  5. [保存] をクリックします。

オブジェクトアップロード時の暗号化の有効化

詳細については、「シンプルアップロード」をご参照ください。

OSS SDK

バケットの暗号化の有効化

OSS SDK は、既存のバケットに対してのみサーバ側暗号化を有効化することをサポートしています。その他のプログラミング言語については、「概要」をご参照ください。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // リージョンに対応するエンドポイントを指定します。この例では、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)
        .build();

        try {
            // バケットの暗号化アルゴリズムを SM4 に設定します。AES-256 を使用する場合は、SSEAlgorithm.SM4 を SSEAlgorithm.AES256 に置き換えます。
            ServerSideEncryptionByDefault applyServerSideEncryptionByDefault = new ServerSideEncryptionByDefault(SSEAlgorithm.SM4);
            ServerSideEncryptionConfiguration sseConfig = new ServerSideEncryptionConfiguration();
            sseConfig.setApplyServerSideEncryptionByDefault(applyServerSideEncryptionByDefault);
            SetBucketEncryptionRequest request = new SetBucketEncryptionRequest(bucketName, sseConfig);
            ossClient.setBucketEncryption(request);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

PHP

<?php

// 依存ライブラリをロードするために autoload ファイルをインクルードします。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドラインパラメーターの説明を指定します。
$optsdesc = [
    "region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'バケット名', 'required' => True], // (必須) バケット名を指定します。
];

// コマンドラインパラメーターを解析するために長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
    return "$key:"; // 各パラメーターの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));

// コマンドラインパラメーターを解析します。
$options = getopt("", $longopts);

// 必須パラメーターが設定されているか確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 必須パラメーターが設定されていないことを指定します。
        exit(1);
    }
}

// コマンドラインパラメーターの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケット名。

// 環境変数を使用して AccessKey ID と AccessKey Secret をロードします。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();

// 認証情報プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);

// リージョンを指定します。
$cfg->setRegion($region);

// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// PutBucketEncryptionRequest オブジェクトを作成し、Key Management Service (KMS) 暗号化方式を使用し、暗号化アルゴリズムを SM4 に設定します。
$request = new Oss\Models\PutBucketEncryptionRequest(
    bucket: $bucket,
    serverSideEncryptionRule: new Oss\Models\ServerSideEncryptionRule(
        applyServerSideEncryptionByDefault: new Oss\Models\ApplyServerSideEncryptionByDefault(
            sseAlgorithm: 'KMS', //KMS 暗号化方式を使用します。
            kmsDataEncryption: 'SM4' // 暗号化アルゴリズムを SM4 に設定します。
    ))
);

// putBucketEncryption メソッドを使用して、バケットのサーバ側暗号化設定を構成します。
$result = $client->putBucketEncryption($request);

// 返された結果を表示します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // 返された HTTP ステータスコード。
    'request id:' . $result->requestId // リクエストのリクエスト ID。リクエストの一意の識別子です。
);

Node.js

const OSS = require("ali-oss");

const client = new OSS({
  // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
  region: 'yourregion',
  // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // バケット名を指定します。
  bucket: 'yourbucketname'
});

async function putBucketEncryption() {
  try {
    // バケットの暗号化方式を設定します。

    const result = await client.putBucketEncryption("bucket-name", {
      SSEAlgorithm: "AES256", // この例では、AES-256 暗号化アルゴリズムを使用します。KMS を使用して暗号化するには、KMSMasterKeyID を指定する必要があります。
      // KMSMasterKeyID: "yourKMSMasterKeyId". CMK ID を指定します。このパラメーターは、SSEAlgorithm が KMS に設定され、特定の CMK が暗号化に使用される場合に利用可能で必須です。それ以外の場合は、このパラメーターを空のままにします。
    });
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

putBucketEncryption();

C#

using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。例:examplebucket。
var bucketName = "examplebucket";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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);
try
{
    // バケットのサーバ側暗号化を設定します。
    var request = new SetBucketEncryptionRequest(bucketName, "KMS", null);
    client.SetBucketEncryption(request);
    Console.WriteLine("Set bucket:{0} Encryption succeeded ", bucketName);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}

Go

package main

import (
	"log"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error creating credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。実際のエンドポイントを指定してください。
	// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。実際のリージョンを指定してください。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名アルゴリズムのバージョンを指定します。
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error creating OSS client: %v", err)
	}

	// 暗号化ルールを初期化します。この例では、AES-256 暗号化アルゴリズムを使用します。
	config := oss.ServerEncryptionRule{
		SSEDefault: oss.SSEDefaultRule{
			SSEAlgorithm: "AES256",
		},
	}

	// OSS バケットの暗号化ルールを設定します。
	err = client.SetBucketEncryption("yourBucketName", config)
	if err != nil {
		log.Fatalf("Error setting bucket encryption: %v", err)
	}

	log.Println("Bucket encryption set successfully")
}

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS へのアクセスに使用するアカウントに関する情報を初期化します。*/

    /* バケットが配置されているリージョンのエンドポイントを指定します。バケットが配置されているリージョンのエンドポイントを指定します。*/
    std::string Endpoint = "yourEndpoint";
    /* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。*/
    std::string Region = "yourRegion";
    /* バケット名を指定します。例:examplebucket。*/
    std::string BucketName = "examplebucket";

    /* ネットワークリソースなどのリソースを初期化します。*/
    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);

    SetBucketEncryptionRequest setrequest(BucketName);
    setrequest.setSSEAlgorithm(SSEAlgorithm::KMS);
    /* KMS に基づいてサーバ側暗号化を設定します。*/
    auto outcome = client.SetBucketEncryption(setrequest);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。*/
        std::cout << "SetBucketEncryption fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースなどのリソースを解放します。*/
    ShutdownSdk();
    return 0;
}

オブジェクトアップロード時の暗号化の有効化

以下の例では、オブジェクトのアップロード時にサーバ側暗号化を設定します。他のプログラミング言語については、「概要」をご参照ください。

Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.File;

public class Put {
    public static void main(String[] args) throws Exception {
        // バケットのリージョンに基づいてエンドポイントを指定します。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // バケットのリージョン ID を指定します。
        String region = "cn-hangzhou";
        // アクセス認証情報を取得します。環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例:exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // ローカルファイルのパスを指定します。例:D:\\localpath\\examplefile.txt。
        // ローカルファイルのパスを指定しない場合、デモプロジェクトが属するローカルパスのファイルがアップロードされます。
        String filePath= "D:\\localpath\\examplefile.txt";

        // OSS クライアントインスタンスを作成します。
        // クライアントインスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // 署名アルゴリズム V4 を使用します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // ObjectMetadata オブジェクトを作成し、サーバー暗号化方式を AES256 に設定します。
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, "AES256");

            // PutObjectRequest オブジェクトを作成します。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            putObjectRequest.setMetadata(metadata);

            // オブジェクトをアップロードします。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
PHP
<?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;


// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケット名を指定します。例:examplebucket。
$bucket= "examplebucket";
// オブジェクトの完全なパスを指定します。例:exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。
$object = "exampledir/exampleobject.txt";
// ローカルファイルの完全なパスを指定します。例:D:\\localpath\\examplefile.txt。ローカルファイルのパスが指定されていない場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
$filePath = "D:\\localpath\\examplefile.txt";

try{
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

    $options[OssClient::OSS_HEADERS] = array(
         // サーバ側暗号化方式を AES-256 に設定します。
        "x-oss-server-side-encryption"=>"AES256",
    );
    // uploadFile メソッドを使用してローカルファイルをアップロードし、UploadOptions オブジェクトを渡します。
    $ossClient->uploadFile($bucket, $object, $filePath, $options);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . "OK" . "\n");
Node.js
const OSS = require("ali-oss");
const path = require("path");

const client = new OSS({
  // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
  region: "oss-cn-hangzhou",
  // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // バケット名を指定します。
  bucket: "examplebucket",
});

const headers = {
  // サーバ側暗号化方式を AES-256 に設定します。
  "x-oss-server-side-encryption": "AES256",
};

async function put() {
  try {
    const result = await client.put(
      // オブジェクトの完全なパスを指定します。例:exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。
      "exampledir/exampleobject.txt",
      // ローカルファイルの完全なパスを指定します。例:D:\\localpath\\examplefile.txt。ローカルファイルのパスが指定されていない場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
      path.normalize("D:\\examplefile.jpg"),
      { headers }
    );
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();
Python
# -*- coding: utf-8 -*-
import oss2
import os
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

# バケット名を指定します。
bucket_name = 'examplebucket0703'
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# ファイルはバイナリモードで開く必要があります。
# ローカルファイルの完全なパスを指定します。ローカルファイルのパスが指定されていない場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
local_file_path = 'D:\\examplefile.jpg'
with open(local_file_path, 'rb') as fileobj:
    # seek メソッドを使用して、ファイルの 1,000 バイト目からデータを読み取ります。データは、ローカルファイルの 1000 バイト目から最後のバイトまでアップロードされます。
    fileobj.seek(1000, os.SEEK_SET)
    # tell メソッドを使用して、現在の位置を取得します。
    current = fileobj.tell()

    # サーバ側暗号化方式を AES-256 に設定します。
    headers = {
        'x-oss-server-side-encryption': 'AES256',
    }

    # オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。
    object_key = 'exampledir/object1.jpg'
    bucket.put_object(object_key, fileobj, headers=headers)
Go
package main

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)

func main() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// OSSClient インスタンスを作成します。
	// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。実際のエンドポイントを指定してください。
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// バケット名を指定します。例:examplebucket。
	bucket, err := client.Bucket("examplebucket")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
    // オブジェクトの完全なパスを指定します。例:exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。
    // ローカルファイルの完全なパスを指定します。例:D:\\localpath\\examplefile.txt。ローカルファイルのパスが指定されていない場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
    // サーバ側暗号化方式を AES-256 に設定します。
	err = bucket.PutObjectFromFile("D:\\localpath\\examplefile.txt", "D:\\examplefile.jpg", oss.ServerSideEncryption("AES256"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

ossutil

バケットの暗号化の有効化

ossutil では、バケットのサーバ側暗号化を有効にできます。インストール手順については、「ossutil のインストール」をご参照ください。

次の例では、examplebucket という名前のバケットに AES-256 暗号化を設定します。

ossutil api put-bucket-encryption --bucket examplebucket --server-side-encryption-rule "{\"ApplyServerSideEncryptionByDefault\":{\"SSEAlgorithm\":\"AES256\"}}"

詳細については、「put-bucket-encryption」をご参照ください。

オブジェクトアップロード時の暗号化の有効化

ossutil を使用すると、オブジェクトをアップロードするときにサーバ側暗号化を設定できます。インストール手順については、「ossutil のインストール」をご参照ください。

次の例では、AES-256 暗号化を使用してファイルをアップロードします。

ossutil cp examplefile.txt oss://examplebucket --metadata=x-oss-server-side-encryption:AES256

詳細については、「cp」をご参照ください。

OSS API

アプリケーションにサーバ側暗号化を直接統合するには、RESTful API を呼び出します。コードに署名計算を含めてください。詳細については、「PutBucketEncryption」をご参照ください。

よくある質問

バケットのサーバ側暗号化を有効にした後、OSS は既存のオブジェクトを暗号化しますか?

いいえ。OSS は、サーバ側暗号化が有効になった後にアップロードされたオブジェクトのみを暗号化します。既存のオブジェクトを暗号化するには、CopyObject を呼び出して、現在の暗号化方式で上書きします。