說明 關於回應標頭中x-oss-server-side-encryption的更多資訊,請參見GetObject。
使用情境
OSS通過服務端加密機制,提供待用資料保護。適合於對檔案儲存體有高安全性或者合規性要求的應用情境。例如,深度學習樣本檔案的儲存、線上協作類文檔資料的儲存。
加密方式
OSS針對不同使用情境提供了兩種服務端加密方式,您可以根據實際使用情境選用。
加密方式 | 功能描述 | 使用情境 | 注意事項 | 費用說明 |
使用KMS託管密鑰進行加解密(SSE-KMS) | 使用KMS託管的預設CMK(Customer Master Key)或指定CMK進行加解密操作。資料無需通過網路發送到KMS服務端進行加解密。 | 因安全合規的要求,需要使用自管理、可指定的密鑰。 | | 在KMS服務側產生少量的KMS密鑰請求費用。費用詳情,請參見KMS計費標準。 |
使用OSS完全託管密鑰進行加解密(SSE-OSS) | 使用OSS完全託管的祕密金鑰加密每個Object。為了提升安全性,OSS還會使用主要金鑰對加密金鑰本身進行加密。 | 僅需要基礎的加密能力,對密鑰無自管理需求。 | 無。 | 免費。 |
注意事項
在開啟了SSE-KMS加密的Bucket中請求上傳、下載、訪問檔案,需確保對指定的CMK ID擁有使用許可權,且請求類型不是匿名請求,否則請求失敗,並返回This request is forbidden by kms。
鏡像回源至Bucket中的檔案預設不加密。
開啟或修改Bucket加密方式不影響Bucket中已有檔案的加密配置。
同一個Object在同一時間內僅可以使用一種服務端加密方式。
如果配置了儲存空間加密,仍然可以在上傳或拷貝Object時單獨對Object配置加密方式,且以Object配置的加密方式為準。更多資訊,請參見PutObject。
許可權說明
RAM使用者在不同情境中使用服務端加解密的許可權說明如下:
設定Bucket加密方式
具有對目標Bucket的系統管理權限。
具有PutBucketEncryption和GetBucketEncryption許可權。
如果設定加密方式為SSE-KMS,且指定了CMK ID,還需要ListKeys、Listalias、ListAliasesByKeyId以及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,還需要ListKeys、ListAliases、ListAliasesByKeyId、DescribeKey、GenerateDataKey以及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。
]
}
]
}
操作方式
使用OSS控制台
方式一:為Bucket開啟服務端加密
建立Bucket時開啟服務端加密功能
登入OSS管理主控台。
單擊Bucket列表,然後單擊建立Bucket。
在建立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):選擇該選項後,OSS會使用預設的服務祕密金鑰加密Bucket內的資料,並在下載Bucket內的Object時自動進行解密處理。 alias/<cmkname>(CMK ID):選擇該選項後,OSS會使用指定的服務祕密金鑰加密Bucket內的資料,並將加密Object的CMK ID記錄到Object的中繼資料中,具有解密許可權的使用者下載Object時會自動解密。其中<cmkname>為建立密鑰時配置的主要金鑰可選標識。 使用指定的CMK ID前,您需要在KMS管理主控台建立一個與Bucket處於相同地區的普通密鑰或外部金鑰。具體操作,請參見建立密鑰。
|
其他參數配置詳情,請參見建立儲存空間。
單擊確定。
為已建立的Bucket開啟服務端加密
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標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。取值範圍如下: OSS預設為您建立服務密鑰:選擇該選項後,OSS會產生一個預設的服務密鑰用於該Bucket的資料加密,並在下載Bucket內的Object時自動進行解密處理。OSS預設建立的服務密鑰格式為alias/acs/oss (CMK ID),您可以通過KMS管理主控台查看這一服務密鑰。
說明 通過KMS管理主控台查看這一服務密鑰前,您需要向目標Bucket上傳至少一個檔案,確保相應的加密金鑰被實際建立並關聯到您的OSS服務。 alias/<cmkname>(CMK ID):選擇該選項後,OSS會使用指定的服務祕密金鑰加密Bucket內的資料,並將加密Object的CMK ID記錄到Object的中繼資料中,具有解密許可權的使用者下載Object時會自動解密。其中<cmkname>為建立密鑰時配置的主要金鑰可選標識。 使用指定的CMK ID前,您需要在KMS管理主控台建立一個與Bucket處於相同地區的普通密鑰或外部金鑰。具體操作,請參見建立密鑰。
|
單擊儲存。
使用阿里雲SDK
方式一:為Bucket開啟服務端加密
SDK支援為已建立的Bucket開啟服務端加密,不支援在建立Bucket時開啟服務端加密。以下僅列舉常見SDK為已建立的Bucket開啟服務端加密的程式碼範例。關於其他SDK為已建立的Bucket開啟服務端加密的程式碼範例,請參見SDK簡介。
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 {
// 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執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
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
// 引入自動負載檔案 載入依賴庫
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// 定義命令列參數描述
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located', 'required' => True], // 地區是必填項 儲存空間所在的地區
"endpoint" => ['help' => 'The domain names that other services can use to access OSS', 'required' => False], // 終端節點是可選項 其他服務可以用來訪問OSS的網域名稱
"bucket" => ['help' => 'The name of the bucket', '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"]; // 儲存空間名稱
// 使用環境變數載入憑證資訊 AccessKeyId 和 AccessKeySecret
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// 使用SDK的預設配置
$cfg = Oss\Config::loadDefault();
// 設定憑證提供者
$cfg->setCredentialsProvider($credentialsProvider);
// 設定地區
$cfg->setRegion($region);
// 如果提供了終端節點 則設定終端節點
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
// 建立OSS用戶端執行個體
$client = new Oss\Client($cfg);
// 建立設定儲存空間加密配置的請求對象 使用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 // 請求的唯一標識
);
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();
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";
// 填寫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);
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.*;
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 {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫Endpoint對應的Region資訊,例如cn-hangzhou。
String region = "cn-hangzhou";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數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執行個體。
// 當OSSClient執行個體不再使用時,調用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();
// 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開啟服務端加密,ossutil的安裝請參見安裝ossutil。
以下樣本展示了如何為已建立的儲存空間examplebucket 設定服務端加密方式為AES256。
ossutil api put-bucket-encryption --bucket examplebucket --server-side-encryption-rule "{\"ApplyServerSideEncryptionByDefault\":{\"SSEAlgorithm\":\"AES256\"}}"
如果您想瞭解該命令的更多資訊,請參見put-bucket-encryption。
方式二:上傳檔案時設定服務端加密
ossutil支援在上傳檔案時指定檔案的服務端加密方式,ossutil的安裝請參見安裝ossutil。以下樣本展示了如何在上傳檔案時設定服務端加密方式為AES256。
ossutil cp examplefile.txt oss://examplebucket --metadata=x-oss-server-side-encryption:AES256
如果您想瞭解該命令的更多資訊,請參見cp(上傳檔案)。
使用KMS託管密鑰進行加解密
使用KMS託管的使用者主要金鑰CMK產生加密金鑰加密資料,通過信封加密機制,可進一步防止未經授權的資料訪問。藉助KMS,您可以專註於資料加解密、電子簽名驗簽等業務功能,無需花費大量成本來保障密鑰的保密性、完整性和可用性。
使用SSE-KMS加密方式時,可使用如下密鑰:
使用OSS預設託管的KMS密鑰
OSS使用預設託管的KMS CMK產生不同的密鑰來加密不同的Object,並且在Object被下載時自動解密。首次使用時,OSS會在KMS平台建立一個OSS託管的CMK。
配置方式如下:
使用內建密鑰BYOK(Bring Your Own Key)
您在KMS控制台使用BYOK材料產生CMK後,OSS可使用指定的KMS CMK產生不同的密鑰來加密不同的Object,並將加密Object的CMK ID記錄到Object的中繼資料中,只有具有解密許可權的使用者下載Object時才會自動解密。
配置方式如下:
配置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位進階加密標準)演算法。
配置方式如下:
相關API
以上操作方式底層基於API實現,如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketEncryption。
常見問題
配置Bucket加密方式後,OSS會對歷史檔案進行加密嗎?
OSS只對服務端加密配置生效後上傳的Object進行加密,不會加密歷史檔案。如果您需要加密歷史檔案,可通過CopyObject覆寫歷史檔案。