全部產品
Search
文件中心

:伺服器端加密

更新時間:Nov 15, 2024

當您在設定了伺服器端加密的儲存空間(Bucket)中上傳檔案(Object)時,OSS對收到的檔案進行加密,再將得到的加密檔案持久化儲存。當您通過GetObject請求下載檔案時,OSS自動將加密檔案解密後返回給使用者,並在回應標頭中返回x-oss-server-side-encryption,用於聲明該檔案進行了伺服器端加密。

說明

關於回應標頭中x-oss-server-side-encryption的更多資訊,請參見回應標頭

使用情境

OSS通過伺服器端加密機制,提供待用資料保護。適合於對於檔案儲存體有高安全性或者合規性要求的應用情境。例如,深度學習樣本檔案的儲存、線上協作類文檔資料的儲存。

注意事項

  • 華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國香港、美國(矽谷)、美國(維吉尼亞)、日本(東京)、韓國(首爾)、新加坡、馬來西亞(吉隆坡)、印尼(雅加達)、菲律賓(馬尼拉)、泰國(曼穀)、德國(法蘭克福)、英國(倫敦)、阿聯酋(杜拜)地區支援開啟伺服器端加密。

  • 在開啟了SSE-KMS加密的Bucket中請求上傳、下載、訪問檔案,需確保對指定的CMK ID擁有使用許可權,且請求類型不是匿名請求,否則請求失敗,並返回This request is forbidden by kms

  • 鏡像回源至Bucket中的檔案預設不加密。

  • 開啟或修改Bucket加密方式不影響Bucket中已有檔案的加密配置。

  • 同一個Object在同一時間內僅可以使用一種伺服器端加密方式。

  • 如果配置了儲存空間加密,仍然可以在上傳或拷貝Object時單獨對Object配置加密方式,且以Object配置的加密方式為準。更多資訊,請參見PutObject

加密方式

OSS針對不同使用情境提供了兩種伺服器端加密方式,您可以根據實際使用情境選用。

加密方式

功能描述

使用情境

注意事項

費用說明

使用KMS託管密鑰進行加解密(SSE-KMS)

使用KMS託管的預設CMK(Customer Master Key)或指定CMK進行加解密操作。資料無需通過網路發送到KMS服務端進行加解密。

因安全合規的要求,需要使用自管理、可指定的密鑰。

  • 用於加密Object的密鑰也會被加密,並寫入Object的中繼資料中。

  • KMS託管密鑰的伺服器端加密方式僅加密Object資料,不加密Object的中繼資料。

在KMS服務側產生少量的KMS密鑰請求費用。費用詳情,請參見KMS計費標準

使用OSS完全託管密鑰進行加解密(SSE-OSS)

使用OSS完全託管的祕密金鑰加密每個Object。為了提升安全性,OSS還會使用主要金鑰對加密金鑰本身進行加密。

僅需要基礎的加密能力,對密鑰無自管理需求。

無。

免費。

操作步驟

使用OSS控制台

方式一:為Bucket開啟伺服器端加密

建立Bucket時開啟伺服器端加密功能

  1. 登入OSS管理主控台

  2. 單擊Bucket列表,然後單擊建立Bucket

  3. 建立Bucket面板,按以下說明填寫各項參數。

    其中,伺服器端加密地區配置參數說明如下:

    參數

    說明

    服務端加密方式

    選擇Object的加密方式。取值範圍如下:

    • :不啟用伺服器端加密。

    • OSS完全託管:使用OSS託管的密鑰進行加密。OSS會為每個Object使用不同的密鑰進行加密,作為額外的保護,OSS會使用主要金鑰對加密金鑰本身進行加密。

    • KMS:使用KMS預設託管的CMK或指定CMK ID進行加解密操作。

      使用KMS加密方式前,需要開通KMS服務。具體操作,請參見開通Key Management Service

    密碼編譯演算法

    僅支援AES256密碼編譯演算法。

    加密金鑰

    僅當加密方式選擇KMS時,需要配置該選項。

    選擇加密金鑰。密鑰格式為<alias>(CMK ID)。其中<alias>為使用者主要金鑰的別名,CMK ID為使用者主要金鑰ID。取值範圍如下:

    • alias/acs/oss(CMK ID):使用預設託管的CMK產生不同的密鑰來加密不同的Object,並且在Object被下載時自動解密。

    • alias/<cmkname>(CMK ID):使用指定的CMK產生不同的密鑰來加密不同的Object,並將加密Object的CMK ID記錄到Object的中繼資料中,具有解密許可權的使用者下載Object時會自動解密。其中<cmkname>為建立密鑰時配置的主要金鑰可選標識。

      使用指定的CMK ID前,您需要在KMS管理主控台建立一個與Bucket處於相同地區的普通密鑰或外部金鑰。具體操作,請參見建立密鑰

    其他參數配置詳情,請參見建立儲存空間

  4. 單擊確定

為已建立的Bucket開啟伺服器端加密

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇資料安全 > 伺服器端加密

  4. 伺服器端加密頁面,單擊設定,按以下說明配置各項參數。

    參數

    說明

    服務端加密方式

    選擇Object的加密方式。取值範圍如下:

    • :不啟用伺服器端加密。

    • OSS完全託管:使用OSS託管的密鑰進行加密。OSS會為每個Object使用不同的密鑰進行加密,作為額外的保護,OSS會使用主要金鑰對加密金鑰本身進行加密。

    • KMS:使用KMS預設託管的CMK或指定CMK ID進行加解密操作。

      使用KMS加密方式前,需要開通KMS服務。具體操作,請參見開通Key Management Service

    密碼編譯演算法

    僅支援AES256密碼編譯演算法。

    加密金鑰

    僅當加密方式選擇KMS時,需要配置該選項。

    選擇加密金鑰。密鑰格式為<alias>(CMK ID)。其中<alias>為使用者主要金鑰的別名,CMK ID為使用者主要金鑰ID。取值範圍如下:

    • alias/acs/oss(CMK ID):使用預設託管的CMK產生不同的密鑰來加密不同的Object,並且在Object被下載時自動解密。

    • alias/<cmkname>(CMK ID):使用指定的CMK產生不同的密鑰來加密不同的Object,並將加密Object的CMK ID記錄到Object的中繼資料中,具有解密許可權的使用者下載Object時會自動解密。其中<cmkname>為建立密鑰時配置的主要金鑰可選標識。

      使用指定的CMK ID前,您需要在KMS管理主控台建立一個與Bucket處於相同地區的普通密鑰或外部金鑰。具體操作,請參見建立密鑰

  5. 單擊儲存

方式二:上傳檔案時設定伺服器端加密

具體操作,請參見簡單上傳

使用阿里雲SDK

方式一:為Bucket開啟伺服器端加密

SDK支援為已建立的Bucket開啟伺服器端加密,不支援在建立Bucket時開啟伺服器端加密。以下僅列舉常見SDK為已建立的Bucket開啟伺服器端加密的程式碼範例。關於其他SDK為已建立的Bucket開啟伺服器端加密的程式碼範例,請參見SDK簡介

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

public class Demo {
    public static void main(String[] args) throws Throwable {
        // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
        String region = "cn-hangzhou";

        // 建立OSSClient執行個體。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // 以設定Bucket加密方式為SM4為例。如果是AES256加密,請替換為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
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;
use OSS\Model\ServerSideEncryptionConfig;

// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);

try {
    // 將Bucket預設的伺服器端加密方式設定為OSS完全託管加密(SSE-OSS)。
    $config = new ServerSideEncryptionConfig("AES256");
    $ossClient->putBucketEncryption($bucket, $config);

    // 將Bucket預設的伺服器端加密方式設定為KMS,且不指定CMK ID。
    $config = new ServerSideEncryptionConfig("KMS");
    $ossClient->putBucketEncryption($bucket, $config);

    // 將Bucket預設的伺服器端加密方式設定為KMS,且指定了CMK ID。
    $config = new ServerSideEncryptionConfig("KMS", "your kms id");
    $ossClient->putBucketEncryption($bucket, $config);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n"); 
const OSS = require("ali-oss");

const client = new OSS({
  // yourregion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為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,
  // yourbucketname填寫儲存空間名稱。
  bucket: 'yourbucketname'
});

async function putBucketEncryption() {
  try {
    // 配置Bucket加密方式。    

    const result = await client.putBucketEncryption("bucket-name", {
      SSEAlgorithm: "AES256", // 此處以設定AES256加密為例。若使用KMS加密,需添加KMSMasterKeyID屬性。
      // KMSMasterKeyID:“yourKMSMasterKeyId”,設定KMS密鑰ID,加密方式為KMS可設定此項。當SSEAlgorithm值為KMS,且使用指定的祕密金鑰加密時,需輸入密鑰ID。其他情況下,必須為空白。
    });
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

putBucketEncryption();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import ServerSideEncryptionRule
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"

# examplebucket填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# 建立Bucket加密配置,以AES256加密為例。
rule = ServerSideEncryptionRule()
rule.sse_algorithm = oss2.SERVER_SIDE_ENCRYPTION_AES256
# 設定KMS密鑰ID,加密方式為KMS可設定此項。如需使用指定的祕密金鑰加密,需輸入指定的CMK ID;若使用OSS託管的CMK進行加密,此項為空白。使用AES256進行加密時,此項必須為空白。
rule.kms_master_keyid = ""

# 設定Bucket加密。
result = bucket.put_bucket_encryption(rule)

# 查看HTTP返回碼。
print('http response code:', result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為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");
// 填寫Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 建立OSSClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // 配置Bucket加密。
    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);
}
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執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
	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)
	}

	// 初始化一個加密規則,加密方式以AES256為例。
	config := oss.ServerEncryptionRule{
		SSEDefault: oss.SSEDefaultRule{
			SSEAlgorithm: "AES256",
		},
	}

	// 設定Bucket的加密規則。
	err = client.SetBucketEncryption("yourBucketName", config)
	if err != nil {
		log.Fatalf("Error setting bucket encryption: %v", err)
	}

	log.Println("Bucket encryption set successfully")
}
#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";
    /* 填寫Bucket名稱,例如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;
}

方式二:上傳檔案時設定伺服器端加密

以下僅列舉常見SDK上傳檔案時設定伺服器端加密的程式碼範例。關於其他SDK上傳檔案時設定伺服器端加密的程式碼範例,請參見SDK簡介

Java

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
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 {
        // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
        String filePath= "D:\\localpath\\examplefile.txt";
        // 建立OSSClient執行個體。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        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();
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫Bucket名稱,例如examplebucket。
$bucket= "examplebucket";
// 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
$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(
         // 設定伺服器端加密方式為AES256。
        "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({
  // yourregion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為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名稱。
  bucket: "examplebucket",
});

const headers = {
  // 設定伺服器端加密方式為AES256。
  "x-oss-server-side-encryption": "AES256",
};

async function put() {
  try {。
    const result = await client.put(
      // 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
      "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())

# yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

# 填寫Bucket名稱。
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方法用於指定從第1000個位元組位置開始讀寫。上傳時會從您指定的第1000個位元組位置開始上傳,直到檔案結束。
    fileobj.seek(1000, os.SEEK_SET)
    # Tell方法用於返回當前位置。
    current = fileobj.tell()

    # 設定伺服器端加密方式為AES256。
    headers = {
        'x-oss-server-side-encryption': 'AES256',
    }

    # 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
    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執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	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)
	}
  // 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
  // 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
  // 設定伺服器端加密方式為AES256。
	err = bucket.PutObjectFromFile("D:\\localpath\\examplefile.txt", "D:\\examplefile.jpg", oss.ServerSideEncryption("AES256"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

使用命令列工具ossutil

方式一:為Bucket開啟伺服器端加密

ossutil支援為已建立的Bucket開啟伺服器端加密,不支援在建立Bucket時開啟伺服器端加密。

為已建立的Bucket開啟伺服器端加密的具體操作,請參見bucket-encryption(伺服器端加密)

方式二:上傳檔案時設定伺服器端加密

ossutil支援在上傳檔案時指定檔案的伺服器端加密方式。具體操作,請參見上傳並指定加密方式

使用REST API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。

  • REST API支援為已建立的Bucket開啟伺服器端加密,不支援在建立Bucket時開啟伺服器端加密。

    為已建立的Bucket開啟伺服器端加密的更多資訊,請參見PutBucketEncryption

  • REST API支援在上傳檔案時指定檔案的伺服器端加密方式。更多資訊,請參見PutObject

使用KMS託管密鑰進行加解密

使用KMS託管的使用者主要金鑰CMK產生加密金鑰加密資料,通過信封加密機制,可進一步防止未經授權的資料訪問。藉助KMS,您可以專註於資料加解密、電子簽名驗簽等業務功能,無需花費大量成本來保障密鑰的保密性、完整性和可用性。

SSE-KMS加密方式的邏輯示意圖如下。

使用SSE-KMS加密方式時,可使用如下密鑰:

  • 使用OSS預設託管的KMS密鑰

    OSS使用預設託管的KMS CMK產生不同的密鑰來加密不同的Object,並且在Object被下載時自動解密。首次使用時,OSS會在KMS平台建立一個OSS託管的CMK。

    配置方式如下:

    • 配置Bucket加密方式

      配置Bucket加密方式為KMS,但不指定具體的CMK ID。此後,所有上傳至此Bucket的Object都會被加密。

    • 為目標Object配置加密方式

      上傳Object或修改Object的meta資訊時,在請求中攜帶x-oss-server-side-encryption參數,並設定參數值為KMS。此時,OSS將使用預設託管的KMS CMK,並通過AES256密碼編譯演算法加密Object。更多資訊,請參見PutObject

  • 使用內建密鑰BYOK(Bring Your Own Key)

    您在KMS控制台使用BYOK材料產生CMK後,OSS可使用指定的KMS CMK產生不同的密鑰來加密不同的Object,並將加密Object的CMK ID記錄到Object的中繼資料中,只有具有解密許可權的使用者下載Object時才會自動解密。

    BYOK材料來源有兩種:

    • 由阿里雲提供的BYOK材料:在KMS平台建立密鑰時,選擇密鑰材料來源為阿里雲KMS

    • 使用使用者自有的BYOK材料:在KMS平台建立密鑰時,選擇密鑰材料來源為外部,並按照要求匯入外部金鑰材料。關於匯入外部金鑰的具體操作,請參見匯入密鑰材料

    配置方式如下:

    • 配置Bucket加密方式

      配置Bucket加密方式為KMS,並指定具體的CMK ID。此後,所有上傳至此Bucket的Object都會被加密。

    • 為目標Object配置加密方式

      上傳Object或修改Object的meta資訊時,在請求中攜帶x-oss-server-side-encryption參數,並設定參數值為KMS;攜帶x-oss-server-side-encryption-key-id參數,並設定參數值為指定CMK ID。此時,OSS將使用指定的KMS CMK,並通過AES256密碼編譯演算法加密Object。更多資訊,請參見PutObject

使用OSS完全託管密鑰進行加解密

OSS負責產生和管理資料加密金鑰,並採用高強度、多因素的安全措施進行保護。資料加密的演算法採用行業標準的AES256(即256位進階加密標準)演算法。

配置方式如下:

  • 配置Bucket加密方式

    配置Bucket加密方式為OSS完全託管,並指定密碼編譯演算法為AES256。此後,所有上傳至此Bucket的Object都會預設被加密。

  • 為目標Object配置加密方式

    上傳Object或修改Object的meta資訊時,在請求中攜帶x-oss-server-side-encryption參數,並設定參數值為AES256。此時,OSS將使用OSS完全託管的祕密金鑰加密Object。更多資訊,請參見PutObject

許可權說明

RAM使用者在不同情境中使用服務端加解密的許可權說明如下:

說明

關於為RAM使用者授權的具體操作,請參見為RAM使用者授權自訂的權限原則

  • 設定Bucket加密方式

    • 具有對目標Bucket的系統管理權限。

    • 具有PutBucketEncryptionGetBucketEncryption許可權。

    • 如果設定加密方式為SSE-KMS,且指定了CMK ID,還需要ListKeysListaliasListAliasesByKeyId以及DescribeKey許可權。此情境下的RAM Policy授權策略如下:

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:List*",
              "kms:DescribeKey"    
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*" //表示允許調用該阿里雲帳號ID下所有的KMS密鑰,如果僅允許使用某個CMK,此處可輸入對應的CMK ID。
            ]
          }
        ]
      }
  • 上傳檔案至設定了加密方式的Bucket

    • 具有目標Bucket的上傳檔案許可權。

    • 如果設定加密方式為KMS,並指定了CMK ID,還需要ListKeysListAliasesListAliasesByKeyIdDescribeKeyGenerateDataKey以及Decrypt許可權。此情境下的RAM Policy授權策略如下:

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:List*",
              "kms:DescribeKey",
              "kms:GenerateDataKey",
              "kms:Decrypt"
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*"//表示允許調用該阿里雲帳號ID下所有的KMS密鑰,如果僅允許使用某個CMK,此處可輸入對應的CMK ID。
            ]
          }
        ]
      }
  • 從設定了加密方式的Bucket中下載檔案

    • 具有目標Bucket的檔案存取權限。

    • 如果設定加密方式為KMS,並指定了CMK ID,還需要Decrypt許可權。此情境下的RAM Policy授權策略如下:

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:Decrypt"
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*"//表示具有該阿里雲帳號ID下所有KMS的解密許可權。若要針對某個KMS密鑰進行解密,此處可輸入對應的CMK ID。
            ]
          }
        ]
      }

常見問題

配置Bucket加密方式後,OSS會對歷史檔案進行加密嗎?

OSS只對伺服器端加密配置生效後上傳的Object進行加密,不會加密歷史檔案。如果您需要加密歷史檔案,可通過CopyObject覆寫歷史檔案。