APP安全機制(十七) —— 阻止使用SSL Pinning 和 Alamofire的中間人攻擊(一)

版本記錄

版本號 時間
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 PinningAlamofire防止中間人攻擊轻绞。 您將使用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 PinningAlamofire 5防止中間人攻擊眼姐。要驗證您的實現(xiàn)是否按預(yù)期起作用,您將使用Charles Proxyman-in-the-middle策略佩番。

注意:安全套接字層(Secure Sockets Layer - SSL)TLS的始祖众旗。 TLS解決了 Internet Engineering Task Force (IETF)發(fā)現(xiàn)的各種安全漏洞,這些漏洞影響了SSL 3.0版趟畏。在本教程中逝钥,您應(yīng)該將SSLTLS作為同義詞閱讀,但代碼實現(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

Public key plus private key equals…

要了解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證書的編碼方式可能不同拣展,這會影響它們的外觀。 最常見的是:

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 FromValid 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支持證書和公鑰的固定帖汞。 特別是,它提供了兩個不同的類凑术,分別稱為PinnedCertificatesTrustEvaluatorPublicKeysTrustEvaluator翩蘸,它們允許您處理這些情況。

注意:此后淮逊,本教程僅涵蓋證書固定(certificate pinning)催首。 如果您愿意,可以在完成教程后使用公鑰固定(public key pinning)的實現(xiàn)泄鹏。

1. Storing The Certificate

要查看Alamofire 5的運行情況郎任,首先需要從StackExchange.com下載證書。

使用OpenSSLStack 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)完成了所有事情?

Trusted traffic only please

要回答這個問題族阅,請直接跳到下一部分篓跛。


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)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末平夜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卸亮,更是在濱河造成了極大的恐慌忽妒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異段直,居然都是意外死亡吃溅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門鸯檬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罕偎,“玉大人,你說我怎么就攤上這事京闰⊙占埃” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵蹂楣,是天一觀的道長俏站。 經(jīng)常有香客問我,道長痊土,這世上最難降的妖魔是什么肄扎? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮赁酝,結(jié)果婚禮上犯祠,老公的妹妹穿的比我還像新娘。我一直安慰自己酌呆,他們只是感情好衡载,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隙袁,像睡著了一般痰娱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菩收,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天梨睁,我揣著相機與錄音,去河邊找鬼娜饵。 笑死坡贺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箱舞。 我是一名探鬼主播遍坟,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褐缠!你這毒婦竟也來了政鼠?” 一聲冷哼從身側(cè)響起风瘦,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤队魏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胡桨,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡官帘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年布疙,在試婚紗的時候發(fā)現(xiàn)自己被綠了仗阅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡拔创,死狀恐怖呢诬,靈堂內(nèi)的尸體忽然破棺而出涌哲,到底是詐尸還是另有隱情,我是刑警寧澤尚镰,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布阀圾,位于F島的核電站,受9級特大地震影響狗唉,放射性物質(zhì)發(fā)生泄漏初烘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一分俯、第九天 我趴在偏房一處隱蔽的房頂上張望肾筐。 院中可真熱鬧,春花似錦缸剪、人聲如沸吗铐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抓歼。三九已至,卻和暖如春拢锹,著一層夾襖步出監(jiān)牢的瞬間谣妻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工卒稳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹋半,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓充坑,卻偏偏與公主長得像减江,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捻爷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容