1. 程式人生 > >使用Amazon CloudFront簽名URL+S3實現私有內容釋出

使用Amazon CloudFront簽名URL+S3實現私有內容釋出

前言

Amazon CloudFront 是一個全球性內容分發網路 (CDN),可實現網站、API、視訊內容或其他 Web 資產的快速分發。使用者可以使用CloudFront來加速分發儲存在Amazon S3儲存桶上的各種內容,比如文件、圖片、媒體檔案和軟體安裝包等。很多AWS客戶在使用CloudFront+S3通過網際網路向自己的終端使用者提供內容下載的時候,也希望能夠限制到只允許合法的使用者下載,比如那些已經通過了身份認證或已經付費的使用者,避免開放下載可能造成的資料安全和流量成本等問題。進一步,這些AWS客戶還希望能夠限制其終端使用者可以執行下載操作的日期時間段,發起下載請求的來源IP地址範圍等等。使用CloudFront的簽名URL功能就可以幫助AWS客戶實現其私有內容的安全釋出。

CloudFront簽名URL功能簡介

CloudFront的簽名URL功能通過在普通的Http或Https請求中新增經過哈西和簽名認證的策略內容,來保護私有內容不受非法訪問。當收到來自客戶端比如瀏覽器、移動App或桌面應用對特定資源的訪問請求後,CloudFront會首先利用儲存的金鑰解密請求中包含的簽名部分內容,檢查是否完整和正確。然後CloudFront繼續分析解密出的許可權策略內容,並根據許可權策略定義的限制條件來決定是否向客戶端提供請求資源。

AWS客戶可以開發Web服務或工具軟體來向自己的終端使用者提供簽名URL,就可以讓這些終端使用者在受限的條件下安全地訪問通過CloudFront釋出的內容,比如儲存在S3中的圖片。

AWS客戶除了可以在簽名URL的許可權策略定義中直接限制資源請求客戶端可以訪問的資源種類、請求發生時間、來源IP地址範圍以外,結合CloudFront既有功能還可以進一步限制其發出請求的協議型別(Http或Https)、訪問域名型別(CloudFront自動分配域名或客戶自有域名)。

整體技術方案

需求

在正式開始建立CloudFront私有內容釋出之前,我們首先要明確在建立過程中的一些主要的選項。對於這些選項的不同設定會影響最終所建立的私有內容釋出的效果。好在通過CloudFront釋出私有內容的主要步驟基本類似,通過了解一個典型的CloudFront私有內容釋出的完整過程就可以快速理解和掌握其他方式的釋出過程。下面的表格列出了幾個主要可選項和我們本次演示所做的選擇。

選項 值域 本次選擇
源站型別

S3儲存桶,

普通Web伺服器

S3儲存桶
客戶端到CloudFront的協議型別

Http,

Https

Https
CloudFront到源站的協議型別

Http,

Https

Https
CloudFront釋出點的型別

Web釋出點,

RTMP釋出點

Web釋出點
CloudFront釋出點的域名型別

CloudFront自動分配的域名,

客戶自有域名

客戶自有域名
簽名型別

簽名URL,

簽名Cookie

簽名URL
許可權策略型別

Canned Policy,

Custom Policy

Custom Policy

架構

一般地,一個完整的高效能私有內容釋出平臺主要包括四部分:內容源站,加速CDN,身份認證和許可權管理,資源請求客戶端。基於上面的需求分析,我們可以明確本次介紹中的四部分組成:

  • 內容源站:S3儲存桶
  • 加速CDN:CloudFront
  • 身份認證和許可權管理:簽名URL生成器

說明:這次功能演示並沒有包括使用者身份認證部分。這部分功能讀者可以基於基本的簽名URL生成器功能基礎上繼續新增。比如開發一個Web服務,在終端使用者請求某個資源的時候先校驗其身份,要求其先輸入正確的使用者名稱和密碼,然後再為請求的具體資源自動產生簽名URL並返回請求客戶端。

  • 資源請求客戶端:使用者瀏覽器,移動APP或桌面客戶端應用


演示

當我們完成本次CloudFront簽名URL+S3實現私有內容釋出的相關設定和開發後,具體的演示過程如下:

1)   向S3儲存桶上傳需要釋出的內容,比如圖片檔案或視訊檔案。

2)  利用簽名URL生成器為上傳的資源產生簽名URL

3)  在測試機的瀏覽器中輸入簽名URL併發送請求給CloudFront

4)  CloudFront驗證簽名URL

5)  如果被請求資源已經在CloudFront當前邊緣節點的快取中,直接返回被請求資源。

6)  如果被請求資源還不在CloudFront當前邊緣節點的快取中:

a) CloudFront從S3儲存桶取回被請求資源

b)  CloudFront將被請求資源返回瀏覽器

c)  CloudFront在當前邊緣節點快取該資源

使用CloudFront簽名URL+S3實現私有內容釋出的完整步驟

完整的步驟將分為以下幾個主要部分分別執行:

(一) 建立CloudFront金鑰對

(二) 建立S3儲存桶

(三) 上傳SSL安全證書

(四) 建立CloudFront Web釋出點

(五) 更新 CloudFront Web 釋出點,啟用簽名URL功能

(六) 開發簽名URL生成器

(七) 驗證測試

(一)建立CloudFront金鑰對

1.  使用AWS 根賬號登入Global AWS Web控制檯

2.  訪問“服務”→“安全、身份與合規”→“IAM”

3.  檢視“安全狀態”,點開“刪除您的根訪問金鑰”,執行“管理安全證書”

4.  訪問“CloudFront金鑰對”,執行“建立新的金鑰對”。

5.  下載建立的CloudFront金鑰對對應的私鑰檔案,記錄下金鑰對的訪問鍵值比如“BPMAJW4W4KMUGDSHRGWD”,這些內容在後面步驟開發簽名URL生成器的時候都要用到。

f45c89a82b15:cert weimen$ ls *.pem

pk-APKAJW4W4KMUGDXXXXXX.pem

說明:產生和驗證CloudFront簽名URL需要用到信任的AWS賬號所建立的CloudFront金鑰對。這個信任的AWS賬號既可以是建立CloudFront釋出點的IAM使用者所屬的AWS賬號(Self),也可以是其他任何信任的AWS賬號。

請注意:普通IAM賬號無法建立CloudFront金鑰對,必須是用根賬號。

(二)建立S3儲存桶

1.  使用具有完整S3操作許可權的IAM使用者登入Global AWS Web控制檯

2.  訪問“服務”→“儲存”→“S3”,執行“建立儲存桶”。

3.  在對話方塊中輸入儲存桶名稱比如“cdntest0001”,選擇區域,執行“建立”。

4.  記錄下建立的儲存桶名稱,在後面步驟建立CloudFront Web釋出點的時候會用到。

5.  傳測試圖片檔案比如“earth.jpg”到新建立的S3儲存桶中

6.  選中新建儲存桶比如“cdntest0001”,點選“屬性”標籤,點開“許可權”,可以看到這時候儲存桶策略為空,ACL設定只允許建立者訪問。

(三)上傳SSL安全證書

2.  查詢或新建一個IAM使用者和對應API訪問金鑰(Access Key),需要保證該IAM使用者擁有IAM SSL安全證書管理許可權。

a)  關於如何建立IAM使用者,請參見:

b)  關於如何為IAM使用者建立API訪問金鑰,請參見:

c)  關於如何為IAM使用者設定許可權策略,請參見:

3.  執行“aws configure”,設定IAM使用者API訪問金鑰和預設區域名,預設區域可以為任一海外區域。

f45c89a82b15:cert weimen$ aws configure

AWS Access Key ID [****************6ZXA]: 

AWS Secret Access Key [****************NOLI]: 

Default region name [us-east-1]: 

Default output format [json]: 

4.  如果還沒有CA簽發的SSL安全證書,請提前完成申請,具體申請過程請參考相關CA的業務介紹說明。

5.  使用相關工具檢視CA簽發的安全證書內容,確認該證書包含正確域名資訊。

6.  列表CA提供的證書相關檔案,確認安全證書檔案、私鑰檔案和證書鏈檔案都存在。

f45c89a82b15:cert weimen$ ls -l

total 24

[email protected] 1 weimen  ANT\Domain Users  2065  1  4 21:54 mw.homyusc.com.crt

[email protected] 1 weimen  ANT\Domain Users  1700  1  4 21:54 mw.homyusc.com.key

[email protected] 1 weimen  ANT\Domain Users  3449  1  4 21:54 root_bundle.crt

7.  確認上面的檔案內容都是X.509 PEM格式。如果不是,請使用對應工具先轉化檔案格式。下面的例子介紹瞭如何使用openssl將一個非PEM格式的.crt檔案轉化為PEM格式。

openssl x509 -in mycert.crt -out mycert.pem -outform PEM

8.  檢查證書相關檔案內容,確保格式正確

a)  安全證書檔案mw.homyusc.com.crt

-----BEGIN CERTIFICATE-----

MIIFxzCCBK+gAwIBAgIQMwrcYbUzB6y7QHQiyYQuwTANBgkqhkiG9w0BAQsFADCB

hTELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu

......

SkHCiJ3TLFqNNL7D/Lou5XuUVx9OdPneDrG3qXA2KDkFFSNIbI3TJKJ0icKOJyYj

hk6nE3hxn8S8PXJ670YaPozQRhT2ZW4hF10vpzZ5PY1cMZ+TCaKyTrlY0g==

-----END CERTIFICATE-----

b)  私鑰檔案mw.homyusc.com.key

-----BEGIN RSA PRIVATE KEY-----

MIIEowIBAAKCAQEApeF7s/+BxjqPxri2DOhDla2XECfiJe02qG5TOLagm5e8niww

17ZmE6Ay5qR45Z8Tszkk1x3PPi0mSdkLeo24Nn9B1pwDpIIZZS3S5Pyiojz4Vu4J

......

ShsRa1MdKkWqHtWpu9HDPQwKqHhF6Z9d8MV+xGw7aieq63LfGGq0EmlMBWHRBpIQ

wV6SRCOf2YY1gHuftjmURyvNnoqntZtFfN2HHcO8QmfpRW2zpizZ

-----END RSA PRIVATE KEY-----

c)  證書鏈檔案root_bundle.crt

-----BEGIN CERTIFICATE-----

MIIEzjCCA7agAwIBAgIQJt3SK0bJxE1aaU05gH5yrTANBgkqhkiG9w0BAQsFADB+

MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B

......

y+WutpPhI5+bP0b37o6hAFtmwx5oI4YPXXe6U635UvtwFcV16895rUl88nZirkQv

xV9RNCVBahIKX46uEMRDiTX97P8x5uweh+k6fClQRUGjFA==

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

MIIEtDCCA5ygAwIBAgIRAJOShUABZXFflH8oj+/JmygwDQYJKoZIhvcNAQELBQAw

PjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5vLjESMBAG

A1UEAxMJQ2VydHVtIENBMB4XDTA4MTAyMjEyMDczN1oXDTI3MDYxMDEwNDYzOVow

......

QVkppV4ig8OLWfqaova9ML9yHRyZhpzyhTwd9yaWLy75ArG1qVDoOPqbCl60BMDO

TjksygtbYvBNWFA0meaaLNKQ1wmB1sCqXs7+0vehukvZ1oaOGR+mBkdCcuBWCgAc

eLmNzJkEN0k=

-----END CERTIFICATE-----

9.  上傳SSL安全證書到AWS IAM服務

命令格式:aws iam upload-server-certificate –server-certificate-name [自定義的已上傳證書名] –certificate-body [PEM格式證書檔案] –private-key [PEM格式私鑰檔案] –certificate-chain [PEM格式證書鏈檔案] –path [訪問路徑

f45c89a82b15:cert weimen$ aws iam upload-server-certificate --server-certificate-name MyTestCert

--certificate-body file://mw.homyusc.com.crt--private-key file://mw.homyusc.com.key

--certificate-chain file://root_bundle.crt --path /cloudfront/test/

{

    "ServerCertificateMetadata": {

        "ServerCertificateId": "ASCAIZCBMIGVKID653NV2",

        "ServerCertificateName": "MyTestCert",

        "Expiration": "2018-01-04T03:30:35Z",

        "Path": "/cloudfront/test/",

        "Arn": "arn:aws:iam::591809XXXXXX:server-certificate/cloudfront/test/MyTestCert",

        "UploadDate": "2017-01-15T02:13:07.848Z"

    }

}

請注意

  • 證書檔案前面的“file://”不能省
  • –certificate-chain 不能省,如果沒有值,就表示是用根證書。
  • –path訪問路徑必須是以“/cloudfront/”開頭,以“/”結尾。

(四)建立CloudFront WEB釋出點

1.  使用具有完整S3和CloudFront操作許可權的IAM使用者登入Global AWS Web控制檯

2.  訪問“服務”→“網路和內容分發”→“CloudFront”,執行“Create Distribution”。

3.  選擇建立Web釋出點

4.  請按照如下表格內容選擇或輸入內容:

欄位名 輸入值 說明
Origin Domain Name 剛剛建立的儲存桶名,比如“cdntest0001” 通過下拉列表可選擇
Restrict Bucket Access Yes 限制只能夠通過CloudFront訪問S3儲存桶內容
Origin Access Identity Create a New Identity 如果您之前已經有建立的OAI,可以選擇“Use an Existing Identity”,並選中該OAI,否則就讓系統幫您建立一個。
Grant Read Permissions on Bucket Yes, Update Bucket Policy 自動更新S3儲存桶策略, 新增CloudFront OAI使用者對儲存桶的讀取許可權。
Viewer Protocol Policy HTTPS Only 客戶端只能夠使用Https協議訪問釋出點
Alternate Domain Names 輸入您的自有域名,比如“mw.homyusc.com” 該域名需要與上傳的SSL安全證書中包含的域名資訊一致。
SSL Certificate Custom SSL Certificate (example.com): 使用自己上傳的SSL安全證書而不是預設的CloudFront安全證書。
Custom SSL Certificate (example.com): 選擇之前上傳到IAM服務的自有SSL安全證書
Custom SSL Client Support Only Clients that Support Server Name Indication (SNI) 部分不支援SNI的瀏覽器客戶端將不能訪問釋出資源
Logging On
Bucket for Logs 選擇S3儲存桶 存放日誌檔案的S3儲存桶
Log Prefix 輸入CloudFront日誌檔名字首,比如“MyLog” 便於區分CloudFront日誌檔案和其他型別檔案

5.  其餘設定都保留預設值

6.  執行“Create Distribution”,記錄下建立的Web釋出點域名,形如“dz60cvvsxhzn8.cloudfront.net”。

7.  訪問“服務”→“儲存”→“S3”,檢視之前建立的儲存桶已經發生了許可權改變:

a)  儲存桶ACL增加了“awsdatafeeds”賬號的讀寫許可權,目的是實現cloudfront日誌檔案上傳。

b)  儲存桶策略增加了CloudFront OAI使用者賬號的只讀許可權,實現CloudFront訪問S3儲存桶內容。

8.  剛剛建立完成的Web釋出點將處於“In Progress”(正在部署)狀態。

9.  請耐心等待Web釋出點最終變為“Deployed”(完成部署)狀態。

10.  請訪問您的自有域名的管理服務,建立或修改cname記錄將自有域名比如“mw.homyusc.com”指向新建立的Web釋出點CloudFront域名比如“dz60cvvsxhzn8.cloudfront.net”。

11.  檢查自有域名的cname記錄設定有效

f45c89a82b15:cert weimen$ dig mw.homyusc.com

; <<>> DiG 9.8.3-P1 <<>> mw.homyusc.com

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13861

;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:

;mw.homyusc.com.                                             IN            A

;; ANSWER SECTION:

mw.homyusc.com.                              19           IN            CNAME dz60cvvsxhzn8.cloudfront.net.

dz60cvvsxhzn8.cloudfront.net. 60 IN              A             52.84.26.216

12.  在測試電腦的瀏覽器中輸入未簽名的訪問URL,使用https協議和自有域名,格式形如“https://mw.homyusc.com/earth.jpg” 。

a)  瀏覽器就可以顯示來自S3儲存桶中的圖片

b)  瀏覽器中可以檢視到之前上傳的SSL安全證書

說明:在這個階段我們暫時還沒有啟用簽名URL功能,只是設定了“自有域名”和S3儲存桶“來源訪問限制”功能。如果能夠通過Https協議正常顯示S3中的圖片檔案,說明前面的步驟設定正確無誤。

(五)更新CloudFront WEB釋出點,啟用簽名URL功能

1.  使用具有完整CloudFront操作許可權的IAM使用者登入Global AWS Web控制檯

2.  訪問訪問“服務”→“網路和內容分發”→“CloudFront”

3.  選中之前建立的Web釋出點,執行“Distribution Settings”

4.  選中“Behavior”標籤,編輯“Default (*)”。

5.  設定“Restrict Viewer Access (Use Signed URLs or Signed Cookies)”為“Yes”

6.  設定“Trusted Signers”為“Self”

說明:表示使用當前登入的IAM使用者所對應的AWS 賬號來簽名URL請求,“Trusted Signers”設定需要對應之前在建立的CloudFront金鑰對時使用的AWS根賬號。

13.  執行“Yes,Edit”按鈕提交更新

14.  剛剛更新完成的Web釋出點將處於“In Progress”(正在部署)狀態。

15.  請耐心等待Web釋出點最終變為“Deployed”(完成部署)狀態。

(六)開發簽名URL生成器

CloudFront支援使用各種開發語言和工具產生簽名URL。在這篇部落格裡,我提供了一個使用JAVA語言開發簽名URL生成器的完整例子。整個專案包括原始碼和依賴的庫檔案都打包成了完整的Eclipse專案檔案,使用者只需要下載後執行Eclipse的專案匯入操作就可以進行程式碼研究和測試。

JAVA版的簽名URL生成器主要依賴了一個第三方開源專案jets3t的相關庫檔案。jets3t專案開發了一套完整的JAVA工具來訪問Amazon S3、Amazon CloudFront和 Google Storage Service。 關於jets3專案的詳情請參考其官網連結。

下面的步驟詳細介紹瞭如何使用jets3t相關工具類來開發CloudFront簽名URL生成器:

1.  使用openssl轉換下載的PEM格式CloudFront金鑰對對應私鑰檔案成為DER格式

f45c89a82b15:cert weimen$ openssl pkcs8 -topk8 -nocrypt -in pk-APKAJW4W4KMUGDXXXXXX.pem -inform PEM -out cdnPK.der -outform DER

2.  下面的程式碼片段展示了簽名URL生成器的實現細節:

a)  讀取DER格式的CloudFront 金鑰對的私鑰檔案

b)  構造被簽名URL

c)  構造定製訪問許可權策略

d)  執行簽名

e)  輸出簽名後的URL

public static void main(String[] args) throws Exception

{

    //1.載入Hash和簽名演算法類

    Security.addProvider(

    new org.bouncycastle.jce.provider.BouncyCastleProvider());

    // ================================================================

    // ================2.簽名相關引數====================================

    // ================================================================

    //2.1.CloudFront為釋出點分配的域名或者使用者自己的域名

    String param_DistributionDomain = "自己的域名或cloudfront釋出點的域名";

    //String param_DistributionDomain = "mw.homyusc.com";

    //2.2.轉化成"*.der"格式的私鑰檔案

    String param_PrivateKeyFilePath = "本地儲存的*.der格式的cloudfront金鑰對私鑰檔案的帶路徑檔名";

    //String param_PrivateKeyFilePath = "/Users/weimen/signedurl/cert/cdnPK.der";

    //2.3.S3儲存桶中檔案的訪問Key值

    String param_S3ObjectKey = "需要被訪問的S3儲存桶內檔案訪問key值";

    //String param_S3ObjectKey = "earth.jpg";

    //2.4.CloudFront金鑰對對應的訪問KEY值

    String param_KeyPairId = "使用根賬號建立的CloudFront金鑰對Key值";

    //String param_KeyPairId = "APKAJW4W4KMUGDXXXXXX";

    //2.5.待簽名的URL

    //具體協議(http/https)需要和CloudFront釋出點設定對應

    String param_UrlToBeSigned = "http://或者https://"

                          + param_DistributionDomain

                          + "/"

                          + param_S3ObjectKey;

    /*

    String param_UrlToBeSigned = "https://"

                          + param_DistributionDomain

                          + "/"

                          + param_S3ObjectKey;

    */

    //3.載入私鑰檔案內容

    byte[] derPrivateKey =

        ServiceUtils.readInputStreamToBytes(

            new FileInputStream(param_PrivateKeyFilePath));

    // ================================================================

    // ================4.定製策略相關引數================================

    // ================================================================

    //4.1.許可權策略生效的路徑,可以使用"*"和"?"來實現批量匹配,

    //具體協議(http/https)需要和CloudFront釋出點設定對應

    String param_PolicyResourcePath = "http://或者https://"

                              + param_DistributionDomain

                              + "/"

                              + param_S3ObjectKey;

    /*

    String param_PolicyResourcePath = "https://"

                                + param_DistributionDomain

                                + "/"

                                + param_S3ObjectKey;

    */

    //4.2.簽名URL失效時間   

    Date param_DateLessThan = ServiceUtils.parseIso8601Date("UTC格式的簽名URL失效時間");

    //Date param_DateLessThan = ServiceUtils.parseIso8601Date("2017-06-30T22:20:00.000Z");

    //4.3.請求客戶端的Ip地址範圍CIDR設定(可選引數)    

    String param_limitToIpAddressCIDR = "CIDR格式的請求源IP地址範圍";

    //String param_limitToIpAddressCIDR = "0.0.0.0/0";

    //4.4.簽名URL生效時間(可選引數,不輸入立即生效)

    Date param_DateGreaterThan = ServiceUtils.parseIso8601Date("UTC格式的簽名URL生效時間");

    //Date param_DateGreaterThan = ServiceUtils.parseIso8601Date("2017-01-01T06:31:56.000Z");

    //5.根據輸入引數建立定製策略

    String policy =

        CloudFrontService.buildPolicyForSignedUrl(

            param_PolicyResourcePath,

            param_DateLessThan,

            param_limitToIpAddressCIDR,

            param_DateGreaterThan   

    );

    System.out.println("[INFO]實際構造的的定製策略內容是【" + policy + "】");

    //6.執行實際簽名操作(雜湊+簽名+Base64編碼)

    String signedUrl =

    CloudFrontService.signUrl(

           param_UrlToBeSigned,

           param_KeyPairId,   

           derPrivateKey,

           policy

    );

    System.out.println("[INFO]輸出的簽名URL內容【" + signedUrl + "】");

}

3.  讀者通過研究上面的程式碼和註釋就可以快速理解簽名URL產生的大致流程,然後根據實際需要替換程式碼中的“簽名相關引數”和“定製策略相關引數”(藍色字型部分),就可以快速開發出屬於自己的簽名URL生成器。如果需要完整的程式碼例子,請直接下載對應的Eclipse專案檔案。

4.  例子程式碼產生的簽名URL內容類似下面的例子:

https://mw.homyusc.com/earth.jpg?Policy=eyJTdGF0ZW1lbnQiOiBbey

JSZXNvdXJjZSI6Imh0dHBzOi8vbXcuaG9teXVzYy5jb20vZWFydGguanBnIiwiQ29uZGl0aW9uIjp7

IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNDk4ODYxMjAwfSwiSXBBZGRyZXNzIjp7IkFXU

zpTb3VyY2VJcCI6IjAuMC4wLjAvMCJ9LCJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MT

Q4MzI1MjMxNn19fV19&Signature=rJq1~uW3HZIVChPs5X5K9DnM2haH8oy488wXDAIJ6X6DBQAtVJAh

soHkPU3zaChCSGt9wG2uyuC-KslzhAw85K1b~EL52fOhuPf0uJOFAb5PUYW8R4BSyflE-

snFfzQs8laanuSmmpHNCDhGw3YrqPjFSBxm~03F5t2ElizLF~0nQdheZHLrnTrdPUMgHK6ffnANjnETul3aB4

JAzV8N1Wi5YtjjiTApiPQMJ8QrQaPScq9SonQbZdgqYuG5bzAdTxlW2gRwOfsftKSGNVK8uhczlParWZD8wa-

A5PWEaUznaBfHz1Arwiu~JnVGQTqhNPaAZs2BO95t4tqaVSrlWw__&Key-

Pair-Id=APKAJW4W4KMUGDXXXXXX

(七)驗證測試

1.  當獲得了經過簽名的URL後,使用者就可以在自己的瀏覽器中輸入該簽名URL,或者將簽名URL提供給自己開發的桌面客戶端或移動APP來訪問S3儲存桶中的對應檔案。

2.  使用者還可以繼續測試各種異常場景:

a)  直接使用S3檔案的URL訪問

b)  通過CloudFront域名而不是使用者自有域名訪問

c)  使用Http協議而不是Https協議訪問

d) 在允許的時間段之外訪問

e)  使用允許的源IP地址段之外訪問

基於我們之前的設定,這些操作都將返回失敗訊息。

總結

這篇部落格完整的介紹瞭如何利用Amazon CloudFront簽名URL功能安全地釋出存放在S3儲存桶中的私有內容。讀者通過研究和學習簽名URL生成器的原始碼,演練完整的CloudFront私有內容釋出建立步驟,就可以快速掌握Amazon CloudFront簽名URL功能的正確配置和使用方法。

參考連結

Amazon CloudFront產品介紹

Amazon S3產品介紹

建立CloudFront Web釋出點

利用CloudFront釋出私有內容

在CloudFront中使用Https

利用Java語言開發簽名URL

利用C#和.Net框架開發簽名URL

利用PHP開發簽名URL

上傳和管理CloudFront安全證書

簽名URL定製策略

jets3t官網

作者介紹:

蒙維

AWS解決方案架構師,負責基於AWS的雲端計算方案架構諮詢和設計,有超過十年以上電信行業和移動網際網路行業複雜應用系統架構和設計經驗,主要擅長分散式和高可用軟體系統架構設計,移動網際網路應用解決方案設計,研發機構DevOps最佳實施過程。

相關推薦

使用Amazon CloudFront簽名URL+S3實現私有內容釋出

前言 Amazon CloudFront 是一個全球性內容分發網路 (CDN),可實現網站、API、視訊內容或其他 Web 資產的快速分發。使用者可以使用CloudFront來加速分發儲存在Amazon S3儲存桶上的各種內容,比如文件、圖片、媒體檔案和軟體安裝包等。很多AW

Resolve HTTP 403 Access Denied Error From an S3 Website Endpoint Origin in Amazon CloudFront

{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "Allow-OAI-Access-

Resolve HTTP 403 Access Denied Error From an S3 REST API Endpoint Origin in Amazon CloudFront

{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "Allow-OAI-Access-

Amazon CloudFront Serving Outdated Content From Amazon S3

Invalidate the S3 objects You can invalidate an S3 object to remove it from the CloudFront distribution's cache. After the object is

Amazon CloudFront 內容分發網路(CDN)_免費CDN加速

CloudFront 可與 AWS Shield 無縫整合以提供第 3/4 層 DDoS 緩解,並可與 AWS WAF 整合以提供第 7 層防護。此外,CloudFront 還可使用最高強度的安全密碼協商 TLS 連線,並使用簽名 URL 對瀏覽者進行身份驗證。您還可以使用我們的欄位級

轉 叫板OpenStack:用Docker實現私有

ahp pup tag aam 倉庫 wps pcs clas dht http://www.cnblogs.com/alexkn/p/4239457.html 看到各大廠商的雲主機,會不會覺得高大上?目前大公司的主流方案是OpenStack,比如某個公司的私有雲 其

如是使用JS實現頁面內容隨機顯示

js之前有個客戶咨詢我,因為他們公司的業務員有多個人,但公司網站的聯系方式板塊裏只夠放一個人的信息,所以就想能不能實現這個聯系方式信息隨機顯示,對於業務或客服人員來說也能做到分配均勻公平。本文我們將和大家一起分享,如何使用js控制實現頁面內容隨機顯示。這裏我以本地的蟬知建站系統為例,給大家演示一下實現流程。首

elasticsearch使用More like this實現基於內容的推薦

無限 itl percent 結果 忽略 class terms query col 基於內容的推薦通常是給定一篇文檔信息,然後給用戶推薦與該文檔相識的文檔。Lucene的api中有實現查詢文章相似度的接口,叫MoreLikeThis。Elasticsearch封裝了該接口

C# 通過url地址獲取頁面內容

pre .html res htm 頁面 ons light ebr dto using System.Net; using System.IO; HttpWebRequest request = (HttpWebRequest)WebRequest

利用Django中的url方法實現地址動態拼接自動生成超鏈接地址

蝴蝶 控制 可選 編寫 alt .html url pytho 條件 目標 建立一個圖書列表頁面,顯示圖書名列表,並實現點擊書名跳轉到圖書詳細頁面,顯示圖書詳細信息。 URL方法簡介 功能:返回一個絕對路徑的引用(不包含域名的URL);該引用匹配一個給定的視圖函數和 一

certbot在Centos7上配置合法簽名證書,實現nginx的https訪問

certbot合法簽名證書 nginx配置https 咖菲貓-李常明筆記 公司因之前使用的openssh創建的自簽名證書,有一個弊端,就是在某些客戶端上不能使用此證書,無法使用https連接,所以,研究了一下certbot 做簽名證書! certbot的官網地址: https://certbot.

java通過URL獲取文本內容

file ear null 抓取 output copy pro 技術 public 原文地址https://www.cnblogs.com/myadmin/p/7634262.html public static String readFileByUrl(String

如何實現私有地址訪問外網(華為)

src perm 分享 配置 5.0 其中 rip oss 9.png 操作步驟及思路:一.分別給pc1,pc2配上ip地址,子網掩碼,網關#pc1ip:192.168.1.1子網掩碼:255.255.255.0網關:192.168.1.254pc2ip:192.168.1

C# 使用 Invoke 實現私有函數的白盒 UT 測試

gflags method NPU 白盒 屬性信息 his spa ram new 調用私有方法的方法如下,其中 this 可以改為被調用的方法所屬的類名,通過 BindingFlags 來指定被調用的方法的訪問權限等屬性信息 object[] methodParams

AWS系列-S3實現文件服務頁面展示

tps 鏈接 業務 get 目錄 地址 解決方法 info aws 最近由於業務需求,對於備份的數據存放到S3上面,並需要頁面展示。而且還能下載。 把這個桶裏面的對象,都在某個靜態頁面展示。並且 我可以把這個對象下載下來。 首頁內容就是 桶裏面的對象。 並且可以隨時查

在Bootstrap開發框架的前端視圖中使用@RenderPage實現頁面內容模塊化的隔離,減少復雜度

技術分享 url 邏輯 asp.net 發的 說明 一個 處理流 分隔 在很多開發的場景中,很多情況下我們需要考慮抽象、以及模塊化等方面的內容,其目的就是為了使得開發的時候關註的變化內容更加少一些,整體開發更加簡單化,從而減少開發的復雜度,在Winform開發的時候,往往可

關於requestMapping 進行url對映實現小小知識點 以及如何獲取請求的url中的引數

requstMapping 用來處理url對映  可以作用在controller類上  也可以作用在方法上 經常使用的方式  通過接收一種對映關係 @RequestMapping("/deleteMainMultipleMessages") public

jQ實現獲得內容和屬性

text() - 設定或返回所選元素的文字內容 html() - 設定或返回所選元素的內容(包括 HTML 標記) val() - 設定或返回表單欄位的值 attr() -方法用於獲取屬性值。 下面是這三個的程式碼樣例: text(),html() <!

[Python3] RSA的加解密和簽名/驗籤實現 -- 使用Crypto

前言 關於非對稱加密演算法我就不過多介紹了,本文著重於python3對RSA演算法的實現。 正文 from Crypto.PublicKey import RSA import Crypto.Signature.PKCS1_v1_5 as sign_PKCS1_v1_5 #用於簽名/

使用JDBC實現資料庫內容的展示和對資料內容的刪除。

首先定義一個emp類 package entity; public class Emp { private int empno; private String ename; private double sal; public int getEmpno() {