資安管理 SSL/TLS (1)

基本介紹

教學目標

初步了解 SSL/TLS 基本概念,尤其是 SSL Handshake 協商流程。

重點概念

SSL 的全名為 Secure Socket Layer,TLS 的全名稱 Transport Layer Security 兩者皆為加密協定主要提供網際網路中安全的通訊。SSL 主要被使用於證明內容,其將會透過加密技術在網際網路中提供端點驗證和通訊隱私,然而通常僅有伺服器被驗證,我們會使用公開金鑰基礎架構 (Public Key Infrastructure,PKI) 部署驗證資訊至客戶端,其協定允許客戶端和伺服器應用程式通訊時避免 eavesdropping、tampering 、 message forgery 、… 等問題發生。

大部份網站會透過網頁瀏覽器交換機密的使用者資訊,此時透過 SSL 加密協定就能夠保護其工作階段中的機敏資訊,為了方便識別我們會將網址中的 HTTP 以 HTTPS 取代之後,該網址連線至的網站使用 SSL 加密協定,也就是所謂 HTTPS 安全協定,SSL 主要使用非對稱金鑰交換在客戶端與伺服器進行協商,所有主流網頁瀏覽器皆會支援 SSL 加密協定,其中 SSL Handshake 就是在客戶端與伺服器建立初始安全通訊的工作階段。

SSL Handshake 協定組成主要有兩個階段,分別為必要的第一階段伺服器驗證和非必要的第二階段客戶端驗證。在第一個階段伺服器在回應給客戶端的請求中會傳送憑證和 Cipher 相關屬性,接著客戶端會產生主要的金鑰,主要是用於加密伺服器的公開金鑰和傳送被加密的主要金鑰至伺服器。伺服器透過主要金鑰驗證訊息,並且再透過主要金鑰返回被驗證的訊息,接著會再透過主要的金鑰衍生出金鑰持續針對通訊的資料進行加密和驗證。第二個階段伺服器傳送 Challenge 的訊息給客戶端,客戶端會進行驗證同時傳送客戶端包括公開金鑰的數位憑證,至於 SSL 資訊交換的流程主要有八個步驟:

  1. 客戶端傳送 SSL 相關資訊給伺服器,像是版本號碼、Cipher 設定、隨機產生資料、…等需要與伺服器進行 SSL 安全通訊的資訊。
  2. 伺服器傳送 SSL 相關資訊給客戶端,像是版本號碼、Cipher 設定、隨機產生資料、…等需要與客戶端進行 SSL 安全通訊的資訊。同時伺服器也會傳送所擁有的憑證,以及若客戶端請求伺服器資源時則會需要客戶端驗證的相關數位憑證。
  3. 客戶端使用與伺服器相同的資訊驗證伺服器,若是伺服器無法被驗證,則連線就無法被建立,代表 SSL Handshake 協商發生錯誤。
  4. 客戶端使用在 SSL Handshake 中所有被產生的資料建立工作階段的 Parameter Secret,接著會透過伺服器公開金鑰進行加密,之後傳送被加密的 Parameter Secret 給伺服器。
    若是伺服器已經請求客戶端驗證,則客戶端也會簽署此次 SSL Handshake 僅有伺服器和客戶端知道的資料,之後會傳送被簽署的資料、憑證和被加密的 Parameter Secret 至伺服器。
    若是伺服器已經請求客戶端驗證,則伺服器會嘗試驗證客戶端,若是客戶端無法被驗證,則工作階段就會被終止,接著伺服器會使用私密金鑰解密 Parameter Secret,然後執行接下來的步驟產生 Master Secret。
  5. 伺服器和客戶端會使用 Master Secret 產生工作階段金鑰,主要為被使用於加密和解密在 SSL 工作階段資訊交換的對稱金鑰,以及驗證完整性,同時還會偵測 SSL 安全連線之間的任何資料改變情況。
  6. 客戶端透過工作階段金鑰加密訊息傳送給伺服器,同時讓伺服器知道客戶端 SSL Handshake 已結束。
  7. 伺服器透過工作階段金鑰加密訊息傳送給客戶端,同時讓客戶端知道伺服器 SSL Handshake 已結束。
  8. 當客戶端和伺服器 SSL Handshake 皆已結果,就完成 SSL Handshake ,接著代表 SSL 工作階段開始,客戶端和伺服器將會使用工作階段金鑰加密和解密傳送的資料,同時驗證資料的完整性。

可是上述的流程有點太多技術名詞,是否能夠更簡單的說明流程呢? 請參考下述說明流程。

  1. 客戶端會傳送訊息至伺服器,訊息內容為:「嗨,請您設定加密工作階段,這有我們將會使用的 Chiper 組合列表和 SSL/TLS 的版本。」。
  2. 伺服器會回應訊息至客戶端,訊息內容為:「嗨,請使用這個來自於您列表中特別的 Chiper 組合,我也已經確認,並且我會使用 1.2 版本的 TLS 協定,此外這有我的憑證主要包括公開金鑰。」。
  3. 客戶端驗證伺服器憑證,然後取得公開金鑰,接著客戶端會使用公開金鑰的憑證加密全新的 Pre-master Key 給伺服器。
  4. 伺服器會使用私密金鑰解密 Pre-master Key,也就是 Parameter Secret。
  5. 客戶端和伺服器現在皆使用前置主金鑰運算將被分享的秘密金鑰,稱為 Shared Secret,也就是 Master Secret。
  6. 客戶端會傳送已被加密訊息至伺服器,訊息內容為:「嗨,這有一個被加密的訊息,請嘗試解密訊息和驗證訊息是否符合規格,同時之後我將會傳送以 Shared Secret 加密的訊息。」。
  7. 伺服器會解密和驗證訊息,若是正常運作則伺服器會回傳訊息至客戶端,訊息內容為:「嗨,您的加密訊息確認無誤,現在我傳送一個被加密的訊息,請嘗試解密訊息和驗證訊息是否符合規格,同時之後我將會傳送以 Shared Secret 加密的訊息。」。
  8. 客戶端和伺服器現在皆使用 Shared Secret 加密和保護它們接下來工作階段的所有通訊內容。

但是流程有八個步驟太複雜了,是否能夠更簡化為階段流程呢? 請參考下述三個主要階段流程說明。

  1. 伺服器在傳送其包含公開金鑰的憑證之後就完成部份的 SSL Handshake 協商。(細節請參考第 1 步驟至第 4 步驟)
  2. 客戶端在傳送已完成的訊息,代表已經確認 Shared Secret 交換和驗證流程已順利成功。(細節請參考第 5 步驟至第 7 步驟)
  3. 客戶端開始傳送應用程式的資料,以利進行安全的操作。(細節請參考第 8 步驟)

最後在實務應用中我們經常會碰到 SSL Handshke Failures 的錯誤訊息導致網頁應用程式無法正常使用,此時最有可能會發生在初始協商第一個階段,客戶端和伺服器可能無法進行驗證,原因可能是通訊協定版本和 Cipher 不相同所造成,當然也有可能是重新協商的安全選項或客戶端憑證請求。至於要如何確認 SSL/TLS 連線和相關資訊進行分析,則可以透過下述指令。

測試 SSL 連線指令之範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
c:\Apache24\bin>openssl s_client -connect leoyeh.me:443
CONNECTED(00000158)
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
0 s:/CN=www.leoyeh.me
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFCDCCA/CgAwIBAgISA3OASIRpV7eLLmq/wHnuCKs1MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzA4MTMwMDE1MDBaFw0x
NzExMTEwMDE1MDBaMBgxFjAUBgNVBAMTDXd3dy5sZW95ZWgubWUwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDhPPRlDV858i61vNclVmg6C6nC9fi2SLJ
sHDeLZRMfGd+7+dkJL4PNk5PiBfsZPS8oXDSviSwHcE/bWVTHSuaMXMvvYVpnQu/
K03UJaSGLvSbKofVH+56OYIbyGJ18PT8Aj4eWiVI5+gS6fmVx6jv5ASISRBJdMze
R057PXE63zXumu/IeYzwz8jDGQd4yFuyXIlQP1HKJTS65zHHX+hO2N8KheSN4t7Q
twG6h+YXKv90ufTv5SXijEJuM406brxEMutz+y6Mkn5JvLAhuwEB38RgxuLOR8qF
QxOX9q+xo8v7/lgdNnLwBpCbsrG7WZaE105VJEN4CMAs7Zp35Q3rAgMBAAGjggIY
MIICFDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNnw6L8lvnlIq/Ys9uKcgU1tZuYj
MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMw
YTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
ZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9y
Zy8wIwYDVR0RBBwwGoIJbGVveWVoLm1lgg13d3cubGVveWVoLm1lMIH+BgNVHSAE
gfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAmBggrBgEFBQcCARYa
aHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUFBwICMIGeDIGbVGhp
cyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBvbiBieSBSZWx5aW5n
IFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBDZXJ0aWZp
Y2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5jcnlwdC5vcmcvcmVw
b3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAHTJepxm+oj1irBJXYmqiAcsPUm2
BQmeD+rWffwVl4U2QrX/ddTsnD7PANHJpOS+PB1XHxMGvRekWp8/Kq+tcTDujQTq
i6gd5tWI/lEpiYlVOMw9GBPbvgr2EBXfEbcYX9Zhdr/g9q8A10gFPlvdiFFQc57Q
HieDVJN0M1T/4A1i5ajS7iuRDmxxZCTX390zXZ5ZAULSLJX4u2Q3CFy2Gjlj/XbN
NzoMAETvx62n8XvkbyT4OeOjpYgTpV26437pzyX1Ks9lzB0nqoT59FWAPbq0Qskj
WZARXHeQPMPIARHj2RLX83LkXPo814D+Tjl18UIY10Gx0dBeZx9jkNuU4xo=
-----END CERTIFICATE-----
subject=/CN=www.leoyeh.me
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3155 bytes and written 302 bytes
Verification error: unable to get local issuer certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 57C8C964E802FDE202E1B7219A73E5339377872D605B7CB11F77DDB609F1A110
Session-ID-ctx:
Master-Key: 953F9FC02F91B3592C98B00908959626B0D6643836F102762F07BA90A53168D2CCF2BC70CCCE823AC7A5858637AE740D
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - ba b6 f2 21 e4 08 8c 67-04 95 04 3b 3e b0 1f 8e ...!...g...;>...
0010 - 04 89 d8 00 14 d6 2a a2-2f 50 bb 97 76 6f 1e b4 ......*./P..vo..
0020 - 3e 2f 6e c0 6f 48 c8 82-52 41 fa e8 52 59 de c3 >/n.oH..RA..RY..
0030 - c8 5f e8 08 67 ce c3 77-22 56 5c cc 57 8c 72 e0 ._..g..w"V\.W.r.
0040 - 0c 60 32 6d 60 6e 86 09-ed a3 14 ab 4a 2a 39 db .`2m`n......J*9.
0050 - 18 09 81 5b 0a 88 1d fd-a7 01 aa 89 dd 2b 54 73 ...[.........+Ts
0060 - 03 fa 21 9c 0b 98 19 a2-c4 7b ee 9a 81 54 8b 5a ..!......{...T.Z
0070 - c7 c3 e7 2a 19 71 c8 99-09 77 ae a1 33 e7 39 45 ...*.q...w..3.9E
0080 - 81 43 22 e0 f1 a9 d3 6b-64 5b 7c 67 4e da 01 54 .C"....kd[|gN..T

0090 - 18 3a d7 e1 e4 46 d1 0f-48 1c 05 3a e5 6a 8c 76 .:...F..H..:.j.v
00a0 - ab d4 9b 6f 6e 1c 01 2a-49 a4 c7 79 57 45 0b a4 ...on..*I..yWE..
00b0 - 2c 7b 49 c0 cb bc bd 89-d2 4a 4d 0b 4d ff 0a 54 ,{I......JM.M..T


Start Time: 1504939264
Timeout : 7200 (sec)
Verify return code: 20 (unable to get local issuer certificate)
Extended master secret: no
---

總結本篇主要是先了解 SSL/TLS 基本概念,尤其是 SSL Handshake 流程,至於有關 SSL/TLS 更多的資安風險和除錯方式將在之後進行說明。

相關資源