版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2019.06.07 星期五 |
前言
在這個信息爆炸的年代,特別是一些敏感的行業(yè),比如金融業(yè)和銀行卡相關(guān)等等,這都對
app
的安全機制有更高的需求匕坯,很多大公司都有安全 部門,用于檢測自己產(chǎn)品的安全性拔稳,但是及時是這樣葛峻,安全問題仍然被不斷曝出,接下來幾篇我們主要說一下app
的安全機制巴比。感興趣的看我上面幾篇术奖。
1. APP安全機制(一)—— 幾種和安全性有關(guān)的情況
2. APP安全機制(二)—— 使用Reveal查看任意APP的UI
3. APP安全機制(三)—— Base64加密
4. APP安全機制(四)—— MD5加密
5. APP安全機制(五)—— 對稱加密
6. APP安全機制(六)—— 非對稱加密
7. APP安全機制(七)—— SHA加密
8. APP安全機制(八)—— 偏好設(shè)置的加密存儲
9. APP安全機制(九)—— 基本iOS安全之鑰匙鏈和哈希(一)
10. APP安全機制(十)—— 基本iOS安全之鑰匙鏈和哈希(二)
11. APP安全機制(十一)—— 密碼工具:提高用戶安全性和體驗(一)
12. APP安全機制(十二)—— 密碼工具:提高用戶安全性和體驗(二)
13. APP安全機制(十三)—— 密碼工具:提高用戶安全性和體驗(三)
14. APP安全機制(十四) —— Keychain Services API使用簡單示例(一)
15. APP安全機制(十五) —— Keychain Services API使用簡單示例(二)
16. APP安全機制(十六) —— Keychain Services API使用簡單示例(三)
開始
首先看下寫作環(huán)境
Swift 5, iOS 12, Xcode 10
在本教程中,您將學(xué)習(xí)如何使用SSL Pinning
和Alamofire
防止中間人攻擊轻绞。 您將使用Charles Proxy
工具模擬中間人攻擊采记。
如今,大多數(shù)iOS應(yīng)用程序與服務(wù)器通信以檢索要使用的信息政勃。當(dāng)應(yīng)用交換信息時唧龄,它們通常使用傳輸層安全性(TLS)
協(xié)議來提供安全通信。
應(yīng)用程序通常不會確定在嘗試與服務(wù)器建立連接時要信任哪些證書以及哪些證書不信任奸远。相反既棺,它們完全依賴于iOS包含的證書。
即使TLS保護傳輸?shù)臄?shù)據(jù)免遭竊聽和篡改懒叛,攻擊者也可以使用黑客或自簽名證書設(shè)置中間人攻擊丸冕。通過這些證書,他們可以捕獲移入和移出應(yīng)用程序的數(shù)據(jù)薛窥。
在本教程中胖烛,您將學(xué)習(xí)如何使用SSL Certificate Pinning
和Alamofire 5防止中間人攻擊眼姐。要驗證您的實現(xiàn)是否按預(yù)期起作用,您將使用Charles Proxy
的man-in-the-middle
策略佩番。
注意:安全套接字層
(Secure Sockets Layer - SSL)
是TLS
的始祖众旗。TLS
解決了 Internet Engineering Task Force (IETF)發(fā)現(xiàn)的各種安全漏洞,這些漏洞影響了SSL 3.0
版趟畏。在本教程中逝钥,您應(yīng)該將SSL
和TLS
作為同義詞閱讀,但代碼實現(xiàn)應(yīng)始終使用TLS
拱镐。
在本教程中,您將使用PinMyCert
持际,這是一個使用Stack Exchange REST API
檢索Stack Overflow
用戶的iOS應(yīng)用程序沃琅。
首先使用下載好的起始程序,在Xcode中打開PinMyCert.xcodeproj
蜘欲。
為了讓您專注益眉,初學(xué)者項目已經(jīng)為您設(shè)置了與SSL Certificate Pinning
無關(guān)的所有內(nèi)容。
打開Main.storyboard
并查看其中包含的視圖控制器姥份。左側(cè)的視圖控制器是應(yīng)用程序的根導(dǎo)航控制器郭脂。接下來,您將擁有ViewController
澈歉,其中包含一個列出從Stack Overflow
檢索到的用戶的表展鸡。最后,您有DetailViewController
埃难,它顯示所選用戶的詳細信息莹弊。
ViewController
使用NetworkClient
。這是Alamofire
的一個包裝器涡尘,它公開了一個執(zhí)行網(wǎng)絡(luò)請求的API忍弛。在NetworkClient
中,您將實現(xiàn)處理SSL Certificate Pinning
的邏輯考抄。稍后會詳細介紹细疚。
構(gòu)建并運行應(yīng)用程序,您將看到此初始屏幕:
在深入研究代碼之前川梅,讓我們來談?wù)?code>TLS吧疯兼!
了解TLS
要了解SSL Certificate Pinning
,您應(yīng)該首先掌握TLS的本質(zhì)及其加密基礎(chǔ)挑势。
TLS的主要目標是為雙方之間交換的消息增加隱私和完整性镇防。 換句話說,TLS允許您通過網(wǎng)絡(luò)傳輸數(shù)據(jù)潮饱,而不會將數(shù)據(jù)暴露給不受信任的第三方来氧。
當(dāng)客戶端和服務(wù)器需要TLS連接時,構(gòu)建該連接遵循三個階段,按特定順序執(zhí)行啦扬。
1. The Three Phases of TLS Connections
在第一階段中狂,客戶端啟動與服務(wù)器的連接。
然后扑毡,客戶端向服務(wù)器發(fā)送一條消息胃榕,該消息列出了它可以支持的TLS
版本以及它可用于加密的密碼套件。
注意:密碼套件是一組通過TLS保護網(wǎng)絡(luò)連接所需的算法瞄摊。有關(guān)詳細信息勋又,請參閱cipher suite。
服務(wù)器使用選定的密碼套件進行響應(yīng)换帜,并將一個或多個數(shù)字證書(digital certificates)
發(fā)送回客戶端楔壤。
客戶端驗證這些數(shù)字證書(簡稱證書)是否有效。它還驗證服務(wù)器是真實的惯驼,而不是想要窺探敏感信息的人蹲嚣。
如果驗證成功,則驗證的第二階段開始祟牲∠缎螅客戶端生成預(yù)主密鑰(pre-master secret key)
并用服務(wù)器的公鑰(即證書中包含的公鑰)對其進行加密。
服務(wù)器接收加密的預(yù)主密鑰并用其私鑰解密说贝。服務(wù)器和客戶端各自基于預(yù)主密鑰生成主密鑰(master secret key)
和會話密鑰议惰。
注意:第二階段使用公鑰加密public-key cryptography或非對稱加密
(asymmetric cryptography)
。這是一個使用密鑰對的加密系統(tǒng):廣泛傳播的公鑰和只有所有者知道的私鑰乡恕。
然后在最后階段使用該主密鑰來解密和加密兩個參與者交換的信息换淆。
注意:第三階段使用對稱密鑰加密(symmetric-key cryptography),其中您使用相同的密鑰來加密明文和解密密文几颜。
2. About Digital Certificates
正如您在上一節(jié)中所了解到的倍试,服務(wù)器將一個或多個證書發(fā)送回客戶端。
那么蛋哭,什么是證書县习? 證書是封裝有關(guān)擁有證書的服務(wù)器的信息的文件。 它類似于身份證谆趾,例如護照或駕駛執(zhí)照躁愿。
證書頒發(fā)機構(gòu)(Certificate Authority (CA))可以頒發(fā)證書,也可以自簽名沪蓬。 在第一種情況下彤钟,CA
必須在頒發(fā)證書之前以及應(yīng)用程序使用證書時驗證證書持有者的身份。 在第二種情況下跷叉,其證明其身份的同一實體簽署證書逸雹。
3. The Structure of a Digital Certificates
證書的結(jié)構(gòu)使用X.509標準X.509 standard营搅。 以下是主要字段:
- Subject:提供CA頒發(fā)證書的實體(計算機,用戶梆砸,網(wǎng)絡(luò)設(shè)備等)的名稱转质。
- Serial Number:為CA頒發(fā)的每個證書提供唯一標識符。
- Issuer:為頒發(fā)證書的CA提供唯一的名稱帖世。
- Valid From:提供證書生效的日期和時間休蟹。
- Valid To:提供證書不再有效的日期和時間。
- *Public Key:包含與證書一起使用的密鑰對的公鑰日矫。
- Algorithm Identifier:表示用于簽署證書的算法赂弓。
- Digital Signature:用于驗證證書真實性的位字符串。
由公鑰和算法標識符組成的對象表示主題公鑰信息(subject public key info)
哪轿。
X.509
證書的編碼方式可能不同拣展,這會影響它們的外觀。 最常見的是:
-
Privacy Enhanced Mail (PEM):
Base-64
編碼缔逛,其文件擴展名為.pem
。 -
Distinguished Encoding Rules (DER):二進制編碼姓惑,其文件擴展名為
.cer褐奴,.der
和.crt
。 -
Public Key Cryptography Standards (PKCS)公鑰加密標準(PKCS):用于在單個文件中交換公共和私有對象于毙。 它的擴展名是
.p7b敦冬,.p7c,.p12唯沮,.pfx
等脖旱。
4. 驗證數(shù)字證書
從CA
獲得證書時,該證書是信任鏈(chain of trust)或證書鏈的一部分介蛉。
鏈中的證書數(shù)量取決于CA的層次結(jié)構(gòu)萌庆。 雙層層次結(jié)構(gòu)是最常見的。 頒發(fā)CA簽署用戶證書币旧,根CA簽署頒發(fā)CA證書践险。 根CA是自簽名的,應(yīng)用程序必須在最后信任它吹菱。
在證書驗證期間巍虫,應(yīng)用驗證:
- 評估日期必須介于證書的
Valid From
和Valid To
字段之間,以使證書有效鳍刷。 - 數(shù)字簽名占遥,通過查找下一個頒發(fā)CA或中間CA的公鑰。 該過程一直持續(xù)到它到達根證書输瓜。
注意:iOS會將所有知名的根CA證書保留在其
Trust Store
中瓦胎。 如果您想了解預(yù)裝iOS的受信任根證書芬萍,請參閱Apple在iOS中可用的受信任根證書列表(Apple’s lists of available trusted root certificates in iOS)。
SSL Certificate Pinning Under the Hood
SSL Certificate Pinning
或簡稱為pinning
凛捏,是將主機與其證書或公鑰相關(guān)聯(lián)的過程担忧。一旦知道了主機的證書或公鑰,就可以將其固定到該主機上坯癣。
換句話說瓶盛,您將應(yīng)用程序配置為拒絕除一個或幾個預(yù)定義證書或公鑰之外的所有證書。每當(dāng)應(yīng)用程序連接到服務(wù)器時示罗,它都會將服務(wù)器證書與固定證書或公鑰進行比較惩猫。當(dāng)且僅當(dāng)它們匹配時,應(yīng)用程序信任服務(wù)器并建立連接蚜点。
您通常在開發(fā)時添加服務(wù)的證書或公鑰轧房。換句話說,您的移動應(yīng)用應(yīng)該在應(yīng)用包中包含數(shù)字證書或公鑰绍绘。這是首選方法奶镶,因為攻擊者無法污染pin
。
1. Why Do You Need SSL Certificate Pinning?
通常陪拘,您將設(shè)置和維護TLS
會話委托給iOS厂镇。這意味著當(dāng)應(yīng)用程序嘗試建立連接時,它不會確定要信任哪些證書以及哪些證書不信任左刽。該應(yīng)用程序完全依賴于iOS Trust Store
提供的證書捺信。
但是,此方法存在缺陷:攻擊者可以生成自簽名證書并將其包含在iOS Trust Store
中或破解根CA證書(hack a root CA certificate)欠痴。這允許這樣的攻擊者設(shè)置一個中間人攻擊并捕獲移入和移出應(yīng)用程序的傳輸數(shù)據(jù)迄靠。
通過固定限制受信任證書集可防止攻擊者分析應(yīng)用程序的功能及其與服務(wù)器通信的方式。
2. Types of SSL Certificate Pinning
如果你想實現(xiàn)固定(pinning)
- 你似乎在做喇辽,因為你正在閱讀本教程 - 你可以決定兩個選項:
- Pin the certificate - 固定證書:您可以下載服務(wù)器的證書并將其捆綁到您的應(yīng)用程序中掌挚。在運行時,應(yīng)用程序會將服務(wù)器的證書與您嵌入的證書進行比較菩咨。
- Pin the public key - 固定公鑰:您可以檢索證書的公鑰疫诽,并將其作為字符串包含在您的代碼中。在運行時旦委,應(yīng)用程序會將證書的公鑰與代碼中的硬編碼進行比較奇徒。
在這兩個選項之間進行選擇取決于您的需求和服務(wù)器配置。如果您選擇第一個選項缨硝,則需要在服務(wù)器旋轉(zhuǎn)(更改)其證書時上傳您的應(yīng)用程序摩钙,否則它將停止工作。如果選擇第二個選項查辩,則可能違反密鑰輪換策略胖笛,因為公鑰不會更改网持。
注意:除了固定證書或公鑰之外,還可以固定
subject
公鑰信息长踊。在撰寫本文時功舀,Alamofire
無法執(zhí)行此類pinning
。如果您正在尋找這樣的解決方案身弊,請參閱TrustKit辟汰。
現(xiàn)在你已經(jīng)掌握了pinning
的工作原理,現(xiàn)在是時候看看Alamofire 5
能為你做些什么了阱佛!
Pinning in Alamofire 5
Alamofire 5
支持證書和公鑰的固定帖汞。 特別是,它提供了兩個不同的類凑术,分別稱為PinnedCertificatesTrustEvaluator
和PublicKeysTrustEvaluator
翩蘸,它們允許您處理這些情況。
注意:此后淮逊,本教程僅涵蓋證書固定
(certificate pinning)
催首。 如果您愿意,可以在完成教程后使用公鑰固定(public key pinning)
的實現(xiàn)泄鹏。
1. Storing The Certificate
要查看Alamofire 5
的運行情況郎任,首先需要從StackExchange.com
下載證書。
使用OpenSSL
從Stack Overflow
服務(wù)器檢索證書命满。 更具體地說,您將使用s_client
命令绣版,該命令可以通過指定服務(wù)器地址和端口443
連接到任何服務(wù)器上的SSL
胶台。
打開一個新終端并鍵入cd
后跟一個空格。 然后杂抽,拖放您的入門項目的目錄诈唬,然后按鍵盤上的Enter
鍵。
仍然在終端窗口中缩麸,鍵入cd PinMyCert
以移動到項目的根文件夾中铸磅。
接下來,復(fù)制并粘貼以下代碼段:
openssl s_client -connect api.stackexchange.com:443 </dev/null
完成后杭朱,您將收到大量數(shù)據(jù)阅仔,包括證書列表。 鏈中的每個證書都有一個公用名Common Name (CN)
弧械。
Certificate chain
0 s:/C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
在此之下八酒,您可以看到您感興趣的實際證書,其中CN
是* .stackexchange.com
刃唐。
Server certificate
-----BEGIN CERTIFICATE-----
MIIHMjCCBhqgAwIBAgIQBmgM1QeOzDnM9C33n9PrfTANBgkqhkiG9w0BAQsFADBw
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz
dXJhbmNlIFNlcnZlciBDQTAeFw0xNjA1MjEwMDAwMDBaFw0xOTA4MTQxMjAwMDBa
MGoxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJOWTERMA8GA1UEBxMITmV3IFlvcmsx
HTAbBgNVBAoTFFN0YWNrIEV4Y2hhbmdlLCBJbmMuMRwwGgYDVQQDDBMqLnN0YWNr
ZXhjaGFuZ2UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0YD
zscT5i6T2FaRsTGNCiLB8OtPXu8N9iAyuaROh/nS0kRRsN8wUMk1TmgZhPuYM6oF
S377V8W2LqhLBMrPXi7lnhvKt2DFWCyw38RrDbEsM5dzVGErmhux3F0QqcTI92zj
VW61DmE7NSQLiR4yonVpTpdAaO4jSPJxn8d+4p1sIlU2JGSk8LZSWFqaROc7KtXt
lWP4HahNRZtdwvL5dIEGGNWx+7B+XVAfY1ygc/UisldkA+a3D2+3WAtXgFZRZZ/1
CWFjKWJNMAI6ZBAtlbgSNgRYxdcdleIhPLCzkzWysfltfiBmsmgz6VCoFR4KgJo8
Gd3MeTWojBthM10SLwIDAQABo4IDzDCCA8gwHwYDVR0jBBgwFoAUUWj/kK8CB3U8
zNllZGKiErhZcjswHQYDVR0OBBYEFFrBQmPCYhOznZSEqjIeF8tto4Z7MIIB/AYD
VR0RBIIB8zCCAe+CEyouc3RhY2tleGNoYW5nZS5jb22CEXN0YWNrb3ZlcmZsb3cu
Y29tghMqLnN0YWNrb3ZlcmZsb3cuY29tgg1zdGFja2F1dGguY29tggtzc3RhdGlj
Lm5ldIINKi5zc3RhdGljLm5ldIIPc2VydmVyZmF1bHQuY29tghEqLnNlcnZlcmZh
dWx0LmNvbYINc3VwZXJ1c2VyLmNvbYIPKi5zdXBlcnVzZXIuY29tgg1zdGFja2Fw
cHMuY29tghRvcGVuaWQuc3RhY2thdXRoLmNvbYIRc3RhY2tleGNoYW5nZS5jb22C
GCoubWV0YS5zdGFja2V4Y2hhbmdlLmNvbYIWbWV0YS5zdGFja2V4Y2hhbmdlLmNv
bYIQbWF0aG92ZXJmbG93Lm5ldIISKi5tYXRob3ZlcmZsb3cubmV0gg1hc2t1YnVu
dHUuY29tgg8qLmFza3VidW50dS5jb22CEXN0YWNrc25pcHBldHMubmV0ghIqLmJs
b2dvdmVyZmxvdy5jb22CEGJsb2dvdmVyZmxvdy5jb22CGCoubWV0YS5zdGFja292
ZXJmbG93LmNvbYIVKi5zdGFja292ZXJmbG93LmVtYWlsghNzdGFja292ZXJmbG93
LmVtYWlsghJzdGFja292ZXJmbG93LmJsb2cwDgYDVR0PAQH/BAQDAgWgMB0GA1Ud
JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5odHRw
Oi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1oYS1zZXJ2ZXItZzUuY3JsMDSgMqAw
hi5odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1oYS1zZXJ2ZXItZzUuY3Js
MEwGA1UdIARFMEMwNwYJYIZIAYb9bAEBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQICMIGDBggrBgEFBQcBAQR3MHUw
JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBNBggrBgEFBQcw
AoZBaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkhpZ2hB
c3N1cmFuY2VTZXJ2ZXJDQS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsF
AAOCAQEARIdUz7n08ZtqWscAmTXegtB6yPrU0l5IQCXQRqnEVXPKyS+w8IVOcblT
T/W2Qlp5we2BTDbRDfVokXIOSxOTAT0XN3f3c+nbvKJ3XMBH236846AY6bpfqL0/
05gcdt39d2iXTL+qnJW9P0yFKpkfGXBBTYQl4ACSeThSuSBXIVJ0v/TfR9+ggXuP
pmXiIKkPOReKu2Tu8SO7+5KRqRJvYhP9mhL4Bl+YLrTQXzM1NwVAahRT1QJJNemy
yEY1kkZOCKt0xRu4CVWhJlpNdoRZenT9BrD8Fo22kt5MxAvCVrjT/g1BHDQd4S8p
PKC8kRwmMA8mdo8TiHJQMy0DBCDCDg==
-----END CERTIFICATE-----
subject=/C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
要將證書復(fù)制到文件中羞迷,請再次使用openssl
界轩。 重復(fù)上一個命令并將其輸出傳遞給openssl x509
,指定DER
編碼并將其輸出到名為stackexchange.com.der
的新文件:
openssl s_client -connect api.stackexchange.com:443 </dev/null \
| openssl x509 -outform DER -out stackexchange.com.der
如果您已正確執(zhí)行這些步驟衔瓮,則應(yīng)該能夠在項目的同一文件夾中看到該證書浊猾。
2. Implementing Certificate Pinning
在編寫代碼之前,您需要導(dǎo)入先前下載的證書热鞍。 如果您還沒有打開它葫慎,請在Xcode中打開PinMyCert.xcodeproj
。
右鍵單擊Project導(dǎo)航器中的根PinMyCert
文件夾碍现。 單擊Add Files to “PinMyCert”...
幅疼,然后在文件選擇器中,找到并選擇stackexchange.com.der
并單擊Add
昼接。
打開NetworkClient.swift
并將以下代碼粘貼到文件末尾:
struct Certificates {
static let stackExchange =
Certificates.certificate(filename: "stackexchange.com")
private static func certificate(filename: String) -> SecCertificate {
let filePath = Bundle.main.path(forResource: filename, ofType: "der")!
let data = try! Data(contentsOf: URL(fileURLWithPath: filePath))
let certificate = SecCertificateCreateWithData(nil, data as CFData)!
return certificate
}
}
上面的結(jié)構(gòu)提供了一種用戶友好的方法來從主包中檢索證書爽篷。
SecCertificateCreateWithData
負責(zé)從DER
編碼的文件創(chuàng)建證書對象。
仍在NetworkClient.swift
中慢睡,找到NetworkClient
并用以下代碼替換整行let session = Session.default
:
// 1
let evaluators = [
"api.stackexchange.com":
PinnedCertificatesTrustEvaluator(certificates: [
Certificates.stackExchange
])
]
let session: Session
// 2
private init() {
session = Session(
serverTrustManager: ServerTrustManager(evaluators: evaluators)
)
}
以下是上述代碼的細分:
- 1) 您創(chuàng)建一個名為
evaluateators
的字典逐工,其中包含一個鍵值對。 鍵的類型為String
漂辐,它表示要檢查的主機泪喊。 該值是ServerTrustEvaluating
的子類型,名為PinnedCertificatesTrustEvaluator
髓涯。 它描述了您要為該特定主機應(yīng)用的評估策略袒啼。 您將使用PinnedCertificatesTrustEvaluator
來驗證服務(wù)器信任。 如果固定證書與服務(wù)器證書完全匹配纬纪,則服務(wù)器信任有效蚓再。 - 2) 您聲明了一個使用
ServerTrustManager
實例化Session
的私有初始化程序。 后者負責(zé)管理evaluators
字典中聲明的映射包各。
現(xiàn)在摘仅,打開ViewController.swift
并找到負責(zé)網(wǎng)絡(luò)請求的代碼:
NetworkClient.request(Router.users)
.responseDecodable { (response: DataResponse<UserList>) in
switch response.result {
case .success(let value):
self.users = value.users
case .failure(let error):
self.presentError(withTitle: "Oops!", message: error.localizedDescription)
}
}
用這個新實現(xiàn)替換它:
NetworkClient.request(Router.users)
.responseDecodable { (response: DataResponse<UserList>) in
switch response.result {
case .success(let value):
self.users = value.users
case .failure(let error):
let isServerTrustEvaluationError =
error.asAFError?.isServerTrustEvaluationError ?? false
let message: String
if isServerTrustEvaluationError {
message = "Certificate Pinning Error"
} else {
message = error.localizedDescription
}
self.presentError(withTitle: "Oops!", message: message)
}
}
雖然成功案例仍然相同,但您已經(jīng)通過附加條件豐富了失敗案例问畅。 首先娃属,您嘗試將error
轉(zhuǎn)換為AFError
。 如果轉(zhuǎn)換成功护姆,您將評估isServerTrustEvaluationError
矾端。 如果其值為true
,則表示證書鎖定失敗卵皂。
構(gòu)建并運行應(yīng)用程序须床。 什么都不應(yīng)該在視覺上改變。
可是等等渐裂! 如果這是一個教你如何防止中間人攻擊的教程豺旬,那么如果沒有發(fā)生攻擊钠惩,你怎么能確定你已經(jīng)完成了所有事情?
要回答這個問題族阅,請直接跳到下一部分篓跛。
Testing Certificate Pinning With Charles
為了驗證一切都按預(yù)期運行,您首先需要下載最新版本的Charles Proxy the latest version of Charles Proxy坦刀,在撰寫本文時版本為4.2.8
愧沟。雙擊DMG
文件并將Charles
圖標拖到Applications
文件夾進行安裝。
Charles
是一個代理服務(wù)器鲤遥,一個中間件沐寺,位于您的應(yīng)用程序和計算機的網(wǎng)絡(luò)連接之間。您可以使用Charles配置網(wǎng)絡(luò)設(shè)置以通過它路由所有流量盖奈。這使Charles
可以檢查進出計算機的所有網(wǎng)絡(luò)事件混坞。
代理服務(wù)器處于強大的地位,這也意味著它們有可能被濫用钢坦。這就是TLS
如此重要的原因:數(shù)據(jù)加密可以防止代理服務(wù)器和其他中間件竊聽敏感信息究孕。
Charles生成自己的自簽名證書,您可以在Mac和iOS設(shè)備上安裝這些證書以進行TLS
加密爹凹。由于此證書不是由受信任的證書頒發(fā)者頒發(fā)的厨诸,因此您需要告知您的設(shè)備明確信任它。安裝并信任后禾酱,Charles
將能夠解密SSL
事件微酬。
但是,在您的情況下颤陶,Charles不會窺探您的SSL
消息颗管。查爾斯偷偷摸摸的中間人策略是行不通的,因為你的pinning
策略會阻止它指郁。
1. Certificate Pinning in Action
要查看增強的安全性忙上,請啟動Charles
拷呆。 Charles一啟動就開始記錄網(wǎng)絡(luò)事件闲坎。
在Charles
中,首先切換到Sequence
選項卡茬斧。 然后在過濾器框中輸入api.stackexchange.com
以便更容易找到所需的請求腰懂,并單擊掃帚符號以清除當(dāng)前會話。
現(xiàn)在單擊菜單欄上的Proxy
并選擇macOS Proxy
將其重新打開(如果它尚未顯示復(fù)選標記)项秉。
然后绣溜,單擊Proxy ? SSL Proxying Settings
并將api.stackexchange.com
添加到列表中。 您可以將Port
字段留空娄蔼。 選擇Enable SSL Proxying
怖喻,然后單擊OK
進行確認底哗。
注意:完成測試后,請記住取消選擇
Enable SSL Proxying
锚沸。 否則跋选,您將無法正常運行該應(yīng)用程序。
接下來哗蜈,您需要安裝Charles Proxy SSL
證書以允許在Simulator
中代理SSL請求前标。
在Charles
中,單擊Help ? SSL Proxying ? Install Charles Root Certificate in iOS Simulators
距潘。 然后炼列,在模擬器上,打開Settings
應(yīng)用音比。 點按 General ? About ? Certificate Trust Settings
(它位于底部俭尖,因此您可能需要滾動)。 點擊開關(guān)以打開Charles Proxy CA
硅确,然后在出現(xiàn)的警告對話框中點擊Continue
目溉。
回到Xcode,構(gòu)建并運行項目菱农。 您應(yīng)該看到如下警告:
在Charles
一側(cè)缭付,您應(yīng)該看到如下所示的失敗:
恭喜循未! 你現(xiàn)在有一個能夠防止中間人攻擊的應(yīng)用程序陷猫!
當(dāng)您完成對應(yīng)用程序和Charles的試驗后,從模擬器中刪除Charles CA
證書非常重要的妖。 啟用模擬器后绣檬,從菜單中選擇Hardware ? Erase All Content and Settings...
,然后單擊Erase
嫂粟。
如果您想了解有關(guān)SSL證書固定和安全性的更多信息娇未,請查看OWASP Mobile Security Testing Guide。 它是一份全面的測試指南星虹,涵蓋了移動應(yīng)用安全測試期間使用的流程零抬,技術(shù)和工具。
后記
本篇主要講述了阻止使用SSL Pinning 和 Alamofire的中間人攻擊宽涌,感興趣的給個贊或者關(guān)注~~~