OpenSSL

解決問題 SSL/TLS (7)

教學目標

主要解決如何透過 Windows Server 2012 R2 網站伺服器的 IIS 管理員產生適用於設定 Apache 網站伺服器的私密金鑰檔和數位憑證檔之問題。

重點概念

首先 Windows Server 2012 R2 網站伺服器的 IIS 管理員角色中主要能夠匯出 PKCS#7 和 PKCS#12 兩種類型的公鑰加密標準 (Public Key Cryptography Standards, PKCS) 格式檔案,所謂 PKCS#7 密碼訊息語法標準 (Cryptographic Message Syntax Standard) 主要規範以公開金鑰基礎設施 (Public Key Infrastructure,PKI) 所產生之簽章密文之格式,應用於數位憑證,其副檔名為 P7B,至於 PKCS#12 個人資訊交換標準 (Personal Information Exchange Syntax Standard) 主要定義了包含私鑰與公鑰憑證的檔案格式,應用於數位憑證,但是包括私鑰資訊,其副檔名為 PFX。

接著在企業中我們主要會透過Windows Server 2012 R2 網站伺服器的 IIS 管理員建立憑證要求,我們必須指定驗證的必要資訊,主要有一般名稱、組織、組織單位、縣市位置、省份 國家 (地區),其中一般名稱必須設定正確的對外的網址名稱,才能夠正確驗證數位憑證是否有效。並且選擇密碼編譯服務提供者內容為「Microsoft RSA SChannel Cryptographic Provider」,位元長度設定「2048」,就能夠產生憑證要求檔,副檔名為 TXT。此時我們將會傳送憑證要求檔給企業內部的憑證管理中心網站產生數位憑證檔,也就是 P7B 格式的檔案,但是僅有數位憑證檔是無法設定 Apache 網站伺服器的 HTTPS 安全連線,所以我們需要先將數位憑證檔匯入至 Windows Server 2012 R2 網站伺服器之後,我們才能夠透過 IIS 管理員角色匯出包括私密金鑰檔案和數位憑證檔,也就是 PFX 格式檔案。

再來如何將 PFX 檔案轉成私密金鑰檔和數位憑證檔,若是在 Windows 伺服器平台,則能夠 Apache Lounge 中的 openssl 工具進行轉換,請注意在執行 openssl 工具之前必須先安裝Microsoft Visual C++ 可轉散發套件,否則會出現「無法啟動程式,因為您的電腦遺失MSVCP140.dll」的錯誤訊息。此外當我們透過以下指令產生私密金鑰檔時除了輸入當時產生 PFX 所設定的密碼之外,還需輸入暗號 (passphrase),但是若我們需要將私密金鑰檔設定 Apache 網站伺服器的 HTTPS 安全連線設定,則必須再透過以下指令將私密金鑰檔中的暗號 (passphrase) 移除。

1
2
3
> openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt
> openssl pkcs12 -in server.pfx -nocerts -nodes -out server_encrypted.key
> openssl rsa -in server_encrypted.key -out server.key

最後當我們產生出私密金鑰檔 (server.key) 和數位憑證檔 (server.crt) 設定至 Apache網站伺服器的設定檔 (httpd-ssl.conf) 中,並且將 Apache 網站伺服器的設定檔 (httpd.conf) 中的 「LoadModule ssl_module modules/mod_ssl.so」 和 「Include conf/extra/httpd-ssl.conf」 前面的註解取消,以及也將的註解也取消掉,重新啟動 Apache 網站伺服器,就能夠完成 Apache 網站伺服器的 HTTPS 安全連線。

相關資源

SAS 資訊安全 (10)

基本介紹

教學目標

初步了解針對 SAS 平台如何透過 OpenSSL 工具建立憑證頒發機構憑證、網站簽署憑證和自簽憑證。

重點概念

首先許多客戶對於對外網站會採用第三方簽署憑證,對於內部應用程式將會使用網站簽署憑證,因為任何應用程式將會只能夠在組織內部執行,同時組織將會有內部憑證頒發機構和內部處理簽署憑證的流程。但是若是我們要快速針對內部應用程式進行安全連線的測試,則就可能會採用自簽憑證。至於要如何開始呢?我們則可以在 Windows 平台下載 Apache 2.4 VC15 Windows Binaries and Modules,並且解壓縮至「C:\」磁碟機中,同時開啟命令提示字元輸入下述指令,就能夠開始使用 OpenSSL 工具,以利建立憑證頒發機構、建立憑證和建立自簽憑證。

1
2
3
> SET OPENSSL_CONF=C:\Apache24\conf\openssl.cnf
> cd C:\Apache24\bin
> openssl version

接著憑證頒發機構 (Certification Authority,CA) 主要是產生數位憑證的實體或單位,憑證頒發機構可以是屬於個人的自簽憑證、屬於組織的網站簽署憑證或屬於商業組織的第三方簽署憑證,同時憑證頒發機構主要為被受信任的第三方,主要是建立憑證所有者和依賴憑證另一方的信任關係。信任的概念主要是使用憑證的關鍵,客戶端必須要能夠信任憑證,以及信任憑證頒發機構,其中憑證頒發機構主要有兩種類型,分別為根憑證頒發機構和中繼憑證頒發機構,同時根憑證頒發機構和多個中繼憑證頒發機構將會形成信任鏈的過程。然而客戶有可能會需要維護一個內部的憑證頒發機構,以利降低公開憑證頒發機構簽署憑證的成本和延遲,以及產生僅有內部存取的測試和開發環境,此時我們將能夠透過 OpenSSL 工具建立憑證頒發機構憑證,主要有三個步驟,分別為:

  1. 產生私密金鑰。
  2. 產生憑證頒發機構憑證。
  3. 檢查和查看憑證頒發機構憑證。

建立憑證頒發機構憑證

產生私密金鑰

1
> openssl genrsa -aes256 -out ca_key.pem 4096

產生憑證頒發機構憑證

1
> openssl req -new -x509 -days 3650 -sha256 -extensions v3_ca -key ca_key.pem -out ca_cert.pem

檢查和查看憑證頒發機構憑證

1
> openssl x509 -in ca_cert.pem -noout -text

再來若我們要建立網站簽署或第三方簽署憑證則會需要私密金鑰和憑證簽署請求,為了確保憑證的安全性,通常我們會採用 2048bits RSA 或 256bits ECDSA 私密金鑰,此外若要保護私密金鑰,則我們會在被信任的電腦中產生私有金鑰和憑證簽署請求,並且確保每年自動更新為最新憑證。 此時我們將能夠透過 OpenSSL 工具建立憑證,主要有三個步驟,分別為:

  1. 產生私密金鑰。
  2. 產生憑證簽署請求。
  3. 簽署憑證。
  4. 查看伺服器憑證。

建立憑證

產生私密金鑰

1
> openssl genrsa -out server_key.pem 2048

產生憑證簽署請求

1
> openssl req -new -key server_key.pem -out server_csr.pem

簽署憑證

請在憑證頒發機構伺服器進行。

1
> openssl x509 -req -days 3650 -sha256 -CA ca_cert.pem -CAkey ca_key.pem -CAcreateserial -in server_csr.pem -out server_cert.pem

查看伺服器憑證

1
> openssl x509 -text -noout -in server_cert.pem

最後我們也能夠透過 OpenSSL 工具建立自簽憑證,主要有兩種方式,分別為簡易和完整,所謂簡易主要是指一行指令即可完成建立自簽憑證,至於所謂完整則是指透過私密金鑰和憑證簽署請求建立自簽憑證,主要有四個步驟分別為:

  1. 產生私密金鑰。
  2. 產生憑證簽署請求。
  3. 簽署憑證。
  4. 查看伺服器憑證。

簡易建立自簽憑證

產生自簽憑證

1
> openssl req -newkey rsa:2048 -nodes -keyout server_key.pem -x509 -days 365 -sha256 -out server_cert.pem

查看伺服器憑證

1
> openssl x509 -text -noout -in server_cert.pem

簡易建立自簽憑證

產生私密金鑰

1
> openssl genrsa -out server_key.pem 2048

產生憑證簽署請求

1
> openssl req -new -key server_key.pem -out server_csr.pem

簽署憑證

1
> openssl x509 -req -days 365 -sha256 -signkey server_key.pem -in server_csr.pem -out server_cert.pem

查看伺服器憑證

1
> openssl x509 -text -noout -in server_cert.pem

總結我們針對 SAS 平台將能夠透過 OpenSSL 工具建立憑證頒發機構憑證、網站簽署憑證和自簽憑證,以利快速針對內部 SAS 相關應用程式進行安全連線的測試。

相關資源

解決問題 SSL/TLS (6)

教學目標

主要解決如何透過 OpenSSL 針對 SSL\TLS 安全連線進行診斷與測試的問題。

重點概念

OpenSSL 開源碼工具中主要提供 s_client 工具針對 SSL\TLS 安全連線進行診斷與測試的功能應用,非常實用。

s_client 工具參數語法:

1
openssl s_client [-connect host:port>] [-verify depth] [-cert filename] [-key filename]  [-CApath directory] [-CAfile filename] [-showcerts] [-state]

其中常用的參數有:

  • -connect 伺服器:連接埠:主要指定驗證伺服器的位置和連接埠,預設為 localhost:443。
  • -verify 深度:主要驗證伺服器憑證的最大深度。
  • -key 檔案名稱:主要指定私密金鑰。
  • -cert 檔案名稱:主要指定客戶端的憑證,以利伺服器驗證客戶端的身份。
  • -CAfile 檔案名稱:主要指定用於驗證伺服器憑證的根憑證。
  • -showcerts:主要顯示伺服器憑證鏈。
  • -state:主要輸出 SSL 工作階段的狀態。

首先我們以 SSL/TLS 安全連線伺服器時會遇到 SSL Handshake 問題,此時我們可以透過 openssl 工具中的 s_client 進行驗證,此時可以加上 -state 參數就能夠逐步確認 SSL 連線的步驟是否正確。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
c:\Apache24\bin>openssl s_client -connect leoyeh.me:443 -state
CONNECTED(00000150)
SSL_connect:before SSL initialization
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS read server hello
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify error:num=20:unable to get local issuer certificate
SSL_connect:SSLv3/TLS read server certificate
SSL_connect:SSLv3/TLS read server key exchange
SSL_connect:SSLv3/TLS read server done
SSL_connect:SSLv3/TLS write client key exchange
SSL_connect:SSLv3/TLS write change cipher spec
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS read server session ticket
SSL_connect:SSLv3/TLS read change cipher spec
SSL_connect:SSLv3/TLS read finished
---

其中我們會發現 SSL 連線基本步驟為:

  1. 初始化設定。
  2. 寫入客戶端 Hello。
  3. 讀取伺服器 Hello。
  4. 讀取伺服器憑證。
  5. 讀取伺服器金鑰交換。
  6. 讀取伺服器完成。
  7. 寫入客戶端金鑰交換。
  8. 寫入變更加密規格。
  9. 寫入完成。
  10. 讀取伺服器工作階段票據。
  11. 讀取變更加密規格。
  12. 讀取完成。

接著我們可以透過 -showcerts 參數獲取伺服器的根憑證,此外憑證鏈將會全部顯示僅有最後才是根憑證。

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
c:\Apache24\bin>openssl s_client -connect leoyeh.me:443 -showcerts
CONNECTED(0000007C)
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
-----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-----
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
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
---
Server 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: F5DA7C79E32BD62A77151C11D9BF120DD763FD808560ABBBF6C967A7107CCF6D
Session-ID-ctx:
Master-Key: 05E82131AB9D1F1722BD9AC0AE03C87712DD91C1D80ADE3EED26D533ACD1675B1C7FCA2C15200E381A07D6E306AB77BF
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 - b9 00 5d 2d f5 a7 90 ed-ce 3e fe aa 5b 01 75 c6 ..]-.....>..[.u.
0020 - a9 35 0f c5 bd 09 5a 57-13 eb 28 03 d0 cc 20 3d .5....ZW..(... =

0030 - a0 d5 56 e2 36 f0 49 18-32 b1 f1 b5 55 5d 8c 00 ..V.6.I.2...U]..
0040 - 9f 8b 5c 33 de ff 39 d6-03 a5 7c f9 d7 6c 70 0e ..\3..9...|..lp.
0050 - 4a 7e 93 91 80 7a 6f 12-e0 fc 8b a8 2b 74 ff fd J~...zo.....+t..
0060 - 87 42 a5 5a 6f 7b cb 0a-ec 52 62 87 43 bb a7 94 .B.Zo{...Rb.C...
0070 - be 3e c8 0f e1 b5 5a 48-a9 6e 0e b6 7f cf 54 e2 .>....ZH.n....T.
0080 - be 09 42 c6 68 2a 3c a1-00 1a a3 32 94 7f ff 76 ..B.h*<....2...v
0090 - 41 a7 a6 79 be 38 c6 44-ea 2e df 79 46 c4 73 fb A..y.8.D...yF.s.
00a0 - 4e 7d 6e 62 cb e6 1a e9-bf b7 a8 e1 7d 03 df 75 N}nb........}..u
00b0 - 01 8e 5f 15 4b 72 f8 2e-ff 27 b7 fa 1b f2 0d c4 .._.Kr...'......

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

其中我們可以從 ——-BEGIN CERTIFICATE——- 複製至 ——-END CERTIFICATE——- 另存為 CA 憑證檔。

再來我們可以透過 -CAfile 參數設定 CA 憑證檔之後進行安全連線,此外當我們發現 error 19 at 1 depth lookup:self signed certificate in certificate chain 的錯誤訊息時,請透過 -CAfile 參數進行測試。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
c:\Apache24\bin>openssl s_client -connect leoyeh.me:443 -CAfile leoyeh.me.ca.pem -state
CONNECTED(0000012C)
SSL_connect:before SSL initialization
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS read server hello
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify error:num=2:unable to get issuer certificate
issuer= O = Digital Signature Trust Co., CN = DST Root CA X3
SSL_connect:SSLv3/TLS read server certificate
SSL_connect:SSLv3/TLS read server key exchange
SSL_connect:SSLv3/TLS read server done
SSL_connect:SSLv3/TLS write client key exchange
SSL_connect:SSLv3/TLS write change cipher spec
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS read server session ticket
SSL_connect:SSLv3/TLS read change cipher spec
SSL_connect:SSLv3/TLS read finished
---

最後我們可以透過 x509 工具確認 CA 憑證詳細的內容是否正確無誤。

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
c:\Apache24\bin>openssl x509 -text -in leoyeh.me.ca.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
0a:01:41:42:00:00:01:53:85:73:6a:0b:85:ec:a7:08
Signature Algorithm: sha256WithRSAEncryption
Issuer: O = Digital Signature Trust Co., CN = DST Root CA X3
Validity
Not Before: Mar 17 16:40:46 2016 GMT
Not After : Mar 17 16:40:46 2021 GMT
Subject: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:9c:d3:0c:f0:5a:e5:2e:47:b7:72:5d:37:83:b3:
68:63:30:ea:d7:35:26:19:25:e1:bd:be:35:f1:70:
92:2f:b7:b8:4b:41:05:ab:a9:9e:35:08:58:ec:b1:
2a:c4:68:87:0b:a3:e3:75:e4:e6:f3:a7:62:71:ba:
79:81:60:1f:d7:91:9a:9f:f3:d0:78:67:71:c8:69:
0e:95:91:cf:fe:e6:99:e9:60:3c:48:cc:7e:ca:4d:
77:12:24:9d:47:1b:5a:eb:b9:ec:1e:37:00:1c:9c:
ac:7b:a7:05:ea:ce:4a:eb:bd:41:e5:36:98:b9:cb:
fd:6d:3c:96:68:df:23:2a:42:90:0c:86:74:67:c8:
7f:a5:9a:b8:52:61:14:13:3f:65:e9:82:87:cb:db:
fa:0e:56:f6:86:89:f3:85:3f:97:86:af:b0:dc:1a:
ef:6b:0d:95:16:7d:c4:2b:a0:65:b2:99:04:36:75:
80:6b:ac:4a:f3:1b:90:49:78:2f:a2:96:4f:2a:20:
25:29:04:c6:74:c0:d0:31:cd:8f:31:38:95:16:ba:
a8:33:b8:43:f1:b1:1f:c3:30:7f:a2:79:31:13:3d:
2d:36:f8:e3:fc:f2:33:6a:b9:39:31:c5:af:c4:8d:
0d:1d:64:16:33:aa:fa:84:29:b6:d4:0b:c0:d8:7d:
c3:93
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE, pathlen:0
X509v3 Key Usage: critical
Digital Signature, Certificate Sign, CRL Sign
Authority Information Access:
OCSP - URI:http://isrg.trustid.ocsp.identrust.com
CA Issuers - URI:http://apps.identrust.com/roots/dstrootcax3.p7c

X509v3 Authority Key Identifier:
keyid:C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10

X509v3 Certificate Policies:
Policy: 2.23.140.1.2.1
Policy: 1.3.6.1.4.1.44947.1.1.1
CPS: http://cps.root-x1.letsencrypt.org

X509v3 CRL Distribution Points:

Full Name:
URI:http://crl.identrust.com/DSTROOTCAX3CRL.crl

X509v3 Subject Key Identifier:
A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1
Signature Algorithm: sha256WithRSAEncryption
dd:33:d7:11:f3:63:58:38:dd:18:15:fb:09:55:be:76:56:b9:
70:48:a5:69:47:27:7b:c2:24:08:92:f1:5a:1f:4a:12:29:37:
24:74:51:1c:62:68:b8:cd:95:70:67:e5:f7:a4:bc:4e:28:51:
cd:9b:e8:ae:87:9d:ea:d8:ba:5a:a1:01:9a:dc:f0:dd:6a:1d:
6a:d8:3e:57:23:9e:a6:1e:04:62:9a:ff:d7:05:ca:b7:1f:3f:
c0:0a:48:bc:94:b0:b6:65:62:e0:c1:54:e5:a3:2a:ad:20:c4:
e9:e6:bb:dc:c8:f6:b5:c3:32:a3:98:cc:77:a8:e6:79:65:07:
2b:cb:28:fe:3a:16:52:81:ce:52:0c:2e:5f:83:e8:d5:06:33:
fb:77:6c:ce:40:ea:32:9e:1f:92:5c:41:c1:74:6c:5b:5d:0a:
5f:33:cc:4d:9f:ac:38:f0:2f:7b:2c:62:9d:d9:a3:91:6f:25:
1b:2f:90:b1:19:46:3d:f6:7e:1b:a6:7a:87:b9:a3:7a:6d:18:
fa:25:a5:91:87:15:e0:f2:16:2f:58:b0:06:2f:2c:68:26:c6:
4b:98:cd:da:9f:0c:f9:7f:90:ed:43:4a:12:44:4e:6f:73:7a:
28:ea:a4:aa:6e:7b:4c:7d:87:dd:e0:c9:02:44:a7:87:af:c3:
34:5b:b4:42
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----

總結我們可以透過 OpenSSL 開源碼工具中主要提供 s_client 工具針對 SSL\TLS 安全連線以黑箱測試的方式進行問題診斷,以利解決在部署安全連線所面臨的問題。

相關資源

解決問題 SSL/TLS (5)

教學目標

主要解決如何透過 OpenSSL 進行不同 SSL 憑證檔案查看和轉換的問題。

重點概念

SSL 憑證和金鑰檔根據不同的平台有許多不同的編碼格式的檔案,根據檔案類型初步可以分為四大類,分別為:

  1. 憑證檔 (.pem、.der、.crt、.cer)
  2. 金鑰檔 (*.key)
  3. 憑證簽署請求檔 (*.csr)
  4. 特殊憑證與金鑰檔 (*.pfx)

憑證檔

X.509

X.509 主要是 PKI 所制定憑證的國際標準,通常採用 PKCS#12 的憑證格式,所謂 PKCS 全名為 Public Key Cryptography Standard 主要是由 RSA 實驗室為了促進公開金鑰密碼的發展而制訂的系列標準,其中最常見的就是 PKCS#12 Personal Information Exchange Syntax Standard,主要有兩個不同的編碼格式。

PEM

全名為 Privacy Enhanced Mail,內容主要是 BASE 64 編碼。

查看 PEM 憑證檔案的資訊指令

1
$ openssl x509 -in myserver.pem -text -noout

DER

全名為 Distinguished Encoding Rules,內容主要是 ASCII 二進位格式,通常應用於 Windows 和 Java 伺服器。

查看 DER 憑證檔案的資訊指令

1
$ openssl x509 -in myserver.der -text -noout -inform der

CRT

主要是憑證檔案,通常應用於 Unix 和 Linux 系統中,基本上為 PEM 編碼,也有可能是 DER 編碼。

查看 CRT 憑證檔案的資訊指令

1
$ openssl x509 -in myserver.crt -text -noout

CER

主要是憑證檔案,通常應用於 Windows 系統中,基本上為 DER 編碼,也有可能是 PEM 編碼。

查看 CER 憑證檔案的資訊指令

1
$ openssl x509 -in myserver.cer -text -noout

PEM 轉 DER

1
$ openssl x509 -in myserver.crt -inform pem -outform der -out myserver.der

DER 轉 PEM

1
$ openssl x509 -in myserver.crt -inform der -outform pem -out myserver.pem

金鑰檔

KEY

主要是金鑰檔案,通常應用於儲存公開金鑰或私密金鑰。

查看 KEY 金鑰檔案的資訊指令

PEM 編碼格式

1
$ openssl rsa -in myserver.key -inform pem -text -noout

DER 編碼格式

1
$ openssl rsa -in myserver.key -inform der -text -noout

憑證簽署請求檔

CSR

全名為 Certificate Signing Request,主要是憑證簽署請求,不是憑證,而是向權威憑證機構獲取簽署憑證的申請,其中核心內容就是公開金鑰。

查看 CSR 憑證簽署請求檔案的資訊指令

PEM 編碼格式

1
$ openssl req -in myserver.csr -inform pem -text -noout

DER 編碼格式

1
$ openssl req -in myserver.csr -inform der -text -noout

向權威憑證機構的憑證申請憑證,需要透過指令產生 CSR 憑證簽署請求檔給權威憑證機構進行簽署,當憑證過期時可嘲用同樣的 CSR 憑證簽署請求檔在 KEY 金鑰檔不改變的情況下申請新的憑證。

1
$ openssl req -newkey rsa:2048 -new -nodes -keyout myserver.key -out myserver.csr

產生自行簽署的憑證的指令。

1
$ openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout myserver.key -out myserver.crt

特殊憑證與金鑰檔

PFX

Windows 作業系統中的 IIS 伺服器主要會將憑證和金鑰檔案合併為 PFX 檔案,通常包括保護的密碼,主要以 ASCII 二進位格式。

產生 PFX 檔案的指令,其中 myserver.crt 為憑證檔,myserver.key 為金鑰檔,certificate.crt 為權威憑證機構的憑證。

1
$ openssl pkcs12 -export -in myserver.crt -inkey myserver.key -out myserver.pfx -certfile certificate.crt

若我們要直接將 X.509 的憑證和金鑰檔案直接轉換為 PFX 檔案,則就不要使用 -certfile 參數的指令。

1
$ openssl pkcs12 -export -in myserver.crt -inkey myserver.key -out myserver.pfx

通常 PKCS12 皆是 DER 編碼格式所以我們可以透過下述指令將 PFX 轉換為 PEM 編碼格式的憑證和金鑰檔。

轉換為 PEM 編碼格式的合併檔 (*.pem)

1
$ openssl pkcs12 -in myserver.pfx -out myserver.pem -nodes

轉換為 PEM 編碼格式的憑證和金鑰檔 (*.pem)

1
2
$ openssl pkcs12 -in myserver.pfx -clcerts -nokeys -out myserver_cert.pem
$ openssl pkcs12 -in myserver.pfx -nocerts -nodes -out myserver_key.pem

轉換為 PEM 編碼格式的憑證 (.crt) 和金鑰檔 (.key)

1
2
$ openssl pkcs12 -in myserver.pfx -clcerts -nokeys -out myserver.crt
$ openssl pkcs12 -in myserver.pfx -nocerts -nodes -out myserver.key

總結雖然 SSL 憑證和金鑰檔根據不同的平台有許多不同的編碼格式的檔案,但是只要透過 OpenSSL 套件即可很輕易的進行編碼格式和檔案格式的互相轉換。

相關資源

解決問題 SSL/TLS (3)

教學目標

主要解決如何在 Linux 作業系統中,將 SSL 憑證和金鑰檔設定至 HAProxy 負載平衡伺服器,讓我們可以針對不同的服務模擬進行安全連線的問題。

重點概念

首先閱讀本篇之前,請先完成 HAProxy 的設定,請參考「問題解決 HAProxy (1)」 教學文章。

接著只要將 SSL 憑證和金鑰檔設定至 HAProxy 負載平衡伺服器中,就能夠讓我們針對不同的服務進行安全連線,其實只要簡單三個步驟就能夠完成初步實作,分別為;

  1. 建立 SSL 憑證和金鑰檔。
  2. 設定 HAProxy 伺服器。
  3. 測試與驗證。

建立 SSL 憑證和金鑰檔

建立 HAProxy 專屬 SSL 憑證的目錄 /etc/haproxy/ssl/ 中。

1
$ sudo mkdir /etc/haproxy/ssl/

產生一組沒有加密的 2048 bits 私密金鑰和憑證簽署請求。

  • Country 國別
  • State 州
  • Location 地區
  • Organization 組織
  • Organizational Unit 組織部門單位
  • Common Name 網域名稱
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/haproxy/ssl/server.key -out /etc/haproxy/ssl/server.crt
Generating a 2048 bit RSA private key
....+++
........+++
writing new private key to '/etc/haproxy/ssl/server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.myserver.com
Email Address []:

指令詳細說明:

  • openssl:主要是用於建立和管理憑證、金鑰、簽章請求、…等應用的工具。
  • req:主要是建立新的 X.509 憑證簽章請求,SSL 是使用 X.509 公開金鑰架構標準進行金鑰和憑證管理。
  • -x509:主要是設定我們自主簽署的憑證檔案取代一般憑證請求。
  • -nodes:主要是設定密碼保護金鑰檔的安全。
  • -days 365:主要是設定憑證有效期間為一年
  • -newkey rsa:2048:主要是同時建立憑證請求和新的私密金鑰,採用 2048 bits 的 RSA 金鑰。
  • -keyout:主要是設定私密金鑰檔的名稱。
  • -out:主要是憑證請求檔的名稱

產生 PEM 格式的憑證和金鑰合併檔案。

1
$ sudo cat /etc/haproxy/ssl/server.crt /etc/haproxy/ssl/server.key > /etc/haproxy/ssl/server.pem

設定 HAProxy 伺服器

開啟 HAProxy 伺服器的設定檔。

1
$ vi website.cfg

設定臨時產生 Diffie-Hellman 私密金鑰,主要會取決於 RSA 金鑰的加密大小,預設為 1024,因為我們是採用採用 2048 bits 的 RSA 金鑰,所以要設定為 2048。

1
2
3
4
global
daemon
maxconn 256
tune.ssl.default-dh-param 2048

設定 PEM 格式的憑證和金鑰合併檔案至 HAProxy 伺服器中,同時設定為 8443 網站連接埠和 https 協定。

1
2
3
4
5
listen http-in
bind *:8443 ssl crt /etc/haproxy/ssl/server.pem
reqadd X-Forwarded-Proto:\ https
server server1 127.0.0.1:8080 maxconn 32
server server2 127.0.0.1:8080 maxconn 32

測試與驗證

停止 HAProxy。

1
2
$ ps aux|grep haproxy
$ sudo kill -9 <PID>

執行 HAProxy。

1
$ haproxy -f website.cfg

開啟瀏覽器輸入以下網址進行測試與驗證。

1
$ firefox https://127.0.0.1:8443

總結在問題解決 HAProxy (1) 教學文章中讓我們透過 HAProxy 解決方案快速將能夠讓我們在三分鐘內啟用高可用性、負載平衡和代理網路應用程式的解決方案,接著只要再來透過本篇教學文章的簡單三步驟,就能夠完成 SSL/TLS 安全機制的連線直接應用至任何服務,同時概念性證明任何服務若其主要的負載平衡伺服器已經設定 SSL/TLS 安全機制的連線,則任何服務皆不用在設定 SSL/TLS 安全機制就已經能夠進行安全連線。

相關資源