<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Author at Infinum</title>
		<atom:link href="https://infinum.com/blog/author/ante-karin/feed/" rel="self" type="application/rss+xml" />
		<link></link>
		<description>Building digital products</description>
		<lastBuildDate>Tue, 21 Apr 2026 22:30:50 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>8085https://infinum.com/uploads/2017/02/how-to-make-your-ios-apps-more-secure-with-ssl-pinning-0.webp</url>
				</image>
				<title>How to Make Your iOS Apps More Secure with SSL Pinning</title>
				<link>https://infinum.com/blog/how-to-make-your-ios-apps-more-secure-with-ssl-pinning/</link>
				<pubDate>Wed, 24 Feb 2016 08:30:00 +0000</pubDate>
				<dc:creator>Ante Karin</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/how-to-make-your-ios-apps-more-secure-with-ssl-pinning/</guid>
				<description>
					<![CDATA[<p>SSL pinning plays a major role in building highly secure mobile apps which users will be able to use even in countless insecure wireless networks.</p>
<p>The post <a href="https://infinum.com/blog/how-to-make-your-ios-apps-more-secure-with-ssl-pinning/">How to Make Your iOS Apps More Secure with SSL Pinning</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-281"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	SSL pinning plays a major role in building highly secure mobile apps which users will be able to use even in countless insecure wireless networks that they encounter every day while using their mobile devices.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	<em>We’ve published an updated article, read about <a href="https://infinum.com/blog/ssl-pinning-revisited/">SSL pinning in iOS – Swift edition</a></em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-100'
	>
	Here at Infinum, we have a solid chunk of experience in working on apps that require high-security standards, such as mobile banking apps. This article covers the SSL pinning technique that helps us deal with one of the most common security attacks – <a href="https://www.owasp.org/index.php/Man-in-the-middle_attack">MITM</a> or man-in-the-middle.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-102"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-103">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2017/02/how-to-make-your-ios-apps-more-secure-with-ssl-pinning-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="690"
															width="1000"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-105">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-106'
	>
	At a glance</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-108">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-109'
	>
	SSL (Secure Socket Layer) ensures encrypted client-server communication over HTTP – specified by HTTPS (HTTP over SSL). The encryption is based on PKI (Public Key Infrastructure) and a session key. The session key was introduced because encrypting and decrypting a public/private key uses a lot of processing power and it would slow down the whole communication process.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-111">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-112'
	>
	Instead of having to asymmetrically encrypt data at the source and decrypt it at the destination, a symmetric session key, which is exchanged with the SSL handshake when the communication starts, is used.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-114">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-115'
	>
	SSL Security – Identification</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-119"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-117">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-118'
	>
	The security aspect of SSL is based on the certificate’s “chain of trust”. When the communication starts, the client examines the server’s SSL certificate and checks if the received certificate is trusted by the Trusted Root CA store or other user-trusted certificates.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-120">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-121'
	>
	MITM</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-125"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-123">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-124'
	>
	Although SSL communication is considered pretty much secure and unbreakable in realistic time frames, the man-in-the-middle attack still poses an actual threat. It can be carried out using several methods, which include <a href="http://www.thegeekstuff.com/2012/01/arp-cache-poisoning/">ARP cache poisoning</a> and <a href="http://www.menandmice.com/resources/dns-spoofing/">DNS spoofing</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-128"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-126">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-127'
	>
	With ARP cache poisoning, it is possible to carry out an <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM</a> attack by using the nature of the <em>Address Resolution Protocol</em> which is responsible for mapping the IP address to the device’s MAC address.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-131"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-129">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-130'
	>
	For example, let’s describe a simple network containing these 3 main actors:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-134"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-132">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-133'
	>
	<li>a common user’s <strong>device U</strong></li><li>the attacker’s <strong>device A</strong></li><li>and the <strong>router R</strong></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-137"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-135">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-136'
	>
	<strong>Device A</strong> can send the ARP reply packet to the <strong>device U</strong>, introducing itself as the <strong>router R</strong>. To complete the MITM attack, <strong>A</strong> sends another ARP reply to <strong>R</strong> introducing itself as the <strong>device U</strong>. In this way, the attacker’s <strong>device A</strong> is in the middle of the communication between the <strong>device U</strong> and <strong>router R</strong> and it can eavesdrop or block it. IP forwarding is often used on the attacker’s device to keep the communication flowing seamlessly between the user’s device and router.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-138">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-139'
	>
	DNS spoofing includes a broad range of attacks aimed at corrupting the name server’s domain name mapping. The attacker tries to find a way to force the DNS to return an incorrect IP address and divert traffic to their computer.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-141">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-142'
	>
	SSL pinning</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-144">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-145'
	>
	We use SSL pinning to ensure that the app communicates only with the designated server itself. One of the prerequisites for SSL pinning is saving the target’s server SSL certificate within the app bundle. The saved certificate is used when defining the pinned certificate(s) upon session configuration.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-147">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-148'
	>
	We will be covering SSL pinning using <a href="https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/">NSURLSession</a>, <a href="https://github.com/Alamofire/Alamofire">AlamoFire</a> and <a href="https://infinum.com/blog/top-5-ios-libraries-every-ios-developer-should-know-about/">AFNetworking</a> (using AFHTTPRequestOperationManager).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-152"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-150">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-151'
	>
	NSURLSession</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-155"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-153">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-154'
	>
	Things are a bit more tricky when it comes to NSURLSession SSL pinning. There is no way to set an array of pinned certificates and cancel all responses that don’t match our local certificate automatically. We need to perform all checks manually to implement SSL pinning on NSURLSession. We’ll happily use some of the Security’s framework C API (like all other true hackers do).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-158"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-156">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-157'
	>
	We can start by instantiating an NSURLSession object with the default session configuration.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-161"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-159">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-160'
	>
	Swift</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-163"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">self.urlSession </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">NSURLSession</span><span class="token">(</span><span class="token">configuration: NSURLSessionConfiguration.</span><span class="token" style="color: #6f42c1;">defaultSessionConfiguration</span><span class="token">(</span><span class="token">)</span><span class="token">,</span><span class="token"> delegate: self</span><span class="token">,</span><span class="token"> delegateQueue: nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-166"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-164">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-165'
	>
	Objective C</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">NSURLSessionConfiguration </span><span class="token" style="color: #d73a49;">*</span><span class="token">sessionConfig </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">NSURLSessionConfiguration defaultSessionConfiguration</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">self.urlSession </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-169">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-170'
	>
	NSURLSession sends requests using tasks (NSURLSessionTask). We will use the <strong>dataTaskWithURL:completionHandler:</strong> method for the SSL pinning test. The request we send will look something like this:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-172">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-173'
	>
	Swift</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-176"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">self.urlSession</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token" style="color: #6f42c1;">dataTaskWithURL</span><span class="token">(</span><span class="token" style="color: #6f42c1;">NSURL</span><span class="token">(</span><span class="token">string:</span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">urlTextField</span><span class="token">.</span><span class="token" style="color: #24292e;">text</span><span class="token" style="color: #d73a49;">!</span><span class="token">)</span><span class="token" style="color: #d73a49;">!</span><span class="token">,</span><span class="token"> completionHandler: </span><span class="token">{</span><span class="token"> </span><span class="token">(</span><span class="token">NSData data</span><span class="token">,</span><span class="token"> NSURLResponse response</span><span class="token">,</span><span class="token"> NSError error</span><span class="token">)</span><span class="token"> Void in
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> response management code</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">resume</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-177">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-178'
	>
	Objective C</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">[</span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">urlSession</span><span class="token"> dataTaskWithURL:</span><span class="token">[</span><span class="token">NSURL URLWithString:</span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">textField</span><span class="token">.</span><span class="token">text</span><span class="token">]</span><span class="token"> completionHandler:</span><span class="token" style="color: #d73a49;">^</span><span class="token">(</span><span class="token">NSData </span><span class="token" style="color: #d73a49;">*</span><span class="token"> _Nullable data</span><span class="token">,</span><span class="token"> NSURLResponse </span><span class="token" style="color: #d73a49;">*</span><span class="token"> _Nullable response</span><span class="token">,</span><span class="token"> NSError </span><span class="token" style="color: #d73a49;">*</span><span class="token"> _Nullable error</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> response management code</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">]</span><span class="token"> resume</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-184"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-182">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-183'
	>
	As the <strong>dataTaskWithURL:completionHandler</strong> method only returns the NSURLSessionTask object, the <strong>[NSURLSessionTask -resume]</strong> method sends the request, or in other words, executes the task.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-187"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-185">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-186'
	>
	The magic of SSL pinning is implemented within the <strong>URLSession:didReceiveChallenge:completionHandler:delegate</strong> method. Note that, upon the creation of the NSURLSession object, we assigned self as the delegate so that this method is called on our object.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-190"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-188">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-189'
	>
	Swift</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-192"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">func </span><span class="token" style="color: #6f42c1;">URLSession</span><span class="token">(</span><span class="token">session: NSURLSession</span><span class="token">,</span><span class="token">  didReceiveChallenge challenge: NSURLAuthenticationChallenge</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">completionHandler</span><span class="token"> </span><span class="token">(</span><span class="token">NSURLSessionAuthChallengeDisposition</span><span class="token">,</span><span class="token"> NSURLCredential</span><span class="token" style="color: #d73a49;">?</span><span class="token">)</span><span class="token" style="color: #24292e;"> </span><span class="token">-&gt;</span><span class="token"> </span><span class="token" style="color: #24292e;">Void</span><span class="token">) </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    let serverTrust </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">challenge</span><span class="token">.</span><span class="token" style="color: #24292e;">protectionSpace</span><span class="token">.</span><span class="token" style="color: #24292e;">serverTrust</span><span class="token">
</span></span><span class="line"><span class="token">    let certificate </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">SecTrustGetCertificateAtIndex</span><span class="token">(</span><span class="token">serverTrust</span><span class="token" style="color: #d73a49;">!</span><span class="token">,</span><span class="token"> </span><span class="token">0</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Set SSL policies for domain name check</span><span class="token">
</span></span><span class="line"><span class="token">    let policies </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">NSMutableArray</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">policies</span><span class="token">.</span><span class="token" style="color: #6f42c1;">addObject</span><span class="token">(</span><span class="token" style="color: #6f42c1;">SecPolicyCreateSSL</span><span class="token">(</span><span class="token" style="color: #005cc5;">true</span><span class="token">,</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">challenge</span><span class="token">.</span><span class="token" style="color: #24292e;">protectionSpace</span><span class="token">.</span><span class="token" style="color: #24292e;">host</span><span class="token">)</span><span class="token">)</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">SecTrustSetPolicies</span><span class="token">(</span><span class="token">serverTrust</span><span class="token" style="color: #d73a49;">!</span><span class="token">,</span><span class="token"> policies</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Evaluate server certificate</span><span class="token">
</span></span><span class="line"><span class="token">    var result: SecTrustResultType </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">0</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">SecTrustEvaluate</span><span class="token">(</span><span class="token">serverTrust</span><span class="token" style="color: #d73a49;">!</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">result</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    let isServerTrusted:Bool </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #6f42c1;">Int</span><span class="token">(</span><span class="token">result</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">==</span><span class="token"> </span><span class="token" style="color: #005cc5;">kSecTrustResultUnspecified</span><span class="token"> </span><span class="token" style="color: #d73a49;">||</span><span class="token"> </span><span class="token" style="color: #6f42c1;">Int</span><span class="token">(</span><span class="token">result</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">==</span><span class="token"> </span><span class="token" style="color: #005cc5;">kSecTrustResultProceed</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Get local and remote cert data</span><span class="token">
</span></span><span class="line"><span class="token">    let remoteCertificateData:NSData </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">SecCertificateCopyData</span><span class="token">(</span><span class="token">certificate</span><span class="token" style="color: #d73a49;">!</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    let pathToCert </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">NSBundle</span><span class="token">.</span><span class="token" style="color: #6f42c1;">mainBundle</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">pathForResource</span><span class="token">(</span><span class="token">githubCert</span><span class="token">,</span><span class="token"> ofType: </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">cer</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    let localCertificate:NSData </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">NSData</span><span class="token">(</span><span class="token">contentsOfFile: pathToCert</span><span class="token" style="color: #d73a49;">!</span><span class="token">)</span><span class="token" style="color: #d73a49;">!</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">isServerTrusted </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #24292e;">remoteCertificateData</span><span class="token">.</span><span class="token" style="color: #6f42c1;">isEqualToData</span><span class="token">(</span><span class="token">localCertificate</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        let credential:NSURLCredential </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">NSURLCredential</span><span class="token">(</span><span class="token">forTrust: serverTrust</span><span class="token" style="color: #d73a49;">!</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">completionHandler</span><span class="token">(</span><span class="token">.UseCredential</span><span class="token">,</span><span class="token"> credential</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token"> </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">completionHandler</span><span class="token">(</span><span class="token">.CancelAuthenticationChallenge</span><span class="token">,</span><span class="token"> nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-195"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-193">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-194'
	>
	Objective C</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">-</span><span class="token">(</span><span class="token" style="color: #d73a49;">void</span><span class="token">)</span><span class="token">URLSession:</span><span class="token">(</span><span class="token">NSURLSession </span><span class="token" style="color: #d73a49;">*</span><span class="token">)</span><span class="token">session didReceiveChallenge:</span><span class="token">(</span><span class="token">NSURLAuthenticationChallenge </span><span class="token" style="color: #d73a49;">*</span><span class="token">)</span><span class="token">challenge completionHandler:</span><span class="token">(</span><span class="token" style="color: #d73a49;">void</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">^</span><span class="token">)</span><span class="token">(</span><span class="token">NSURLSessionAuthChallengeDisposition</span><span class="token">,</span><span class="token"> NSURLCredential </span><span class="token" style="color: #d73a49;">*</span><span class="token"> _Nullable</span><span class="token">)</span><span class="token">)</span><span class="token">completionHandler </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Get remote certificate</span><span class="token">
</span></span><span class="line"><span class="token">    SecTrustRef serverTrust </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">challenge</span><span class="token">.</span><span class="token" style="color: #24292e;">protectionSpace</span><span class="token">.</span><span class="token" style="color: #24292e;">serverTrust</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    SecCertificateRef certificate </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">SecTrustGetCertificateAtIndex</span><span class="token">(</span><span class="token">serverTrust</span><span class="token">,</span><span class="token"> </span><span class="token">0</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Set SSL policies for domain name check</span><span class="token">
</span></span><span class="line"><span class="token">    NSMutableArray </span><span class="token" style="color: #d73a49;">*</span><span class="token">policies </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">NSMutableArray array</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">[</span><span class="token">policies addObject:</span><span class="token">(</span><span class="token">__bridge_transfer id</span><span class="token">)</span><span class="token" style="color: #6f42c1;">SecPolicyCreateSSL</span><span class="token">(</span><span class="token" style="color: #005cc5;">true</span><span class="token">,</span><span class="token"> </span><span class="token">(</span><span class="token">__bridge CFStringRef</span><span class="token">)</span><span class="token" style="color: #24292e;">challenge</span><span class="token">.</span><span class="token" style="color: #24292e;">protectionSpace</span><span class="token">.</span><span class="token" style="color: #24292e;">host</span><span class="token">)</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">SecTrustSetPolicies</span><span class="token">(</span><span class="token">serverTrust</span><span class="token">,</span><span class="token"> </span><span class="token">(</span><span class="token">__bridge CFArrayRef</span><span class="token">)</span><span class="token">policies</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Evaluate server certificate</span><span class="token">
</span></span><span class="line"><span class="token">    SecTrustResultType result</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">SecTrustEvaluate</span><span class="token">(</span><span class="token">serverTrust</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">result</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    BOOL certificateIsValid </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">(</span><span class="token">result </span><span class="token" style="color: #d73a49;">==</span><span class="token"> </span><span class="token" style="color: #005cc5;">kSecTrustResultUnspecified</span><span class="token"> </span><span class="token" style="color: #d73a49;">||</span><span class="token"> result </span><span class="token" style="color: #d73a49;">==</span><span class="token"> </span><span class="token" style="color: #005cc5;">kSecTrustResultProceed</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Get local and remote cert data</span><span class="token">
</span></span><span class="line"><span class="token">    NSData </span><span class="token" style="color: #d73a49;">*</span><span class="token">remoteCertificateData </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">CFBridgingRelease</span><span class="token">(</span><span class="token" style="color: #6f42c1;">SecCertificateCopyData</span><span class="token">(</span><span class="token">certificate</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    NSString </span><span class="token" style="color: #d73a49;">*</span><span class="token">pathToCert </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">[</span><span class="token">NSBundle mainBundle</span><span class="token">]</span><span class="token">pathForResource:@</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">github.com</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> ofType:@</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">cer</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    NSData </span><span class="token" style="color: #d73a49;">*</span><span class="token">localCertificate </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">NSData dataWithContentsOfFile:pathToCert</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> The pinnning check</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">[</span><span class="token">remoteCertificateData isEqualToData:localCertificate</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> certificateIsValid</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        NSURLCredential </span><span class="token" style="color: #d73a49;">*</span><span class="token">credential </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">NSURLCredential credentialForTrust:serverTrust</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">completionHandler</span><span class="token">(</span><span class="token">NSURLSessionAuthChallengeUseCredential</span><span class="token">,</span><span class="token"> credential</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token"> </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">completionHandler</span><span class="token">(</span><span class="token">NSURLSessionAuthChallengeCancelAuthenticationChallenge</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">NULL</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-198">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-199'
	>
	At the beginning of the method, we use <strong>SecTrustGetCertificateAtIndex</strong> to get the certificate reference from the <strong>challenge.protectionSpace.serverTrust</strong> which contains the server’s SSL certificate data.<br>After that, we set the policies (in this case SSL) to be used in the certificate evaluation – SecTrustSetPolicies.<br>The certificate is evaluated using SecTrustEvaluate, which can return one of the following SecTrustResultType results:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-203"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-201">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-202'
	>
	Swift</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-205"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultInvalid</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultProceed</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">@</span><span class="token" style="color: #6f42c1;">available</span><span class="token">(</span><span class="token" style="color: #d73a49;">*</span><span class="token">,</span><span class="token"> deprecated</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultConfirm</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultDeny</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultUnspecified</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultRecoverableTrustFailure</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultFatalTrustFailure</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">public var </span><span class="token" style="color: #005cc5;">kSecTrustResultOtherError</span><span class="token">: Int </span><span class="token">{</span><span class="token"> get </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-208"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-206">
	<h5	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-207'
	>
	Objective C</h5></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-210"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">typedef</span><span class="token"> </span><span class="token" style="color: #d73a49;">uint32_t</span><span class="token"> SecTrustResultType</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">enum</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultInvalid</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">0</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultProceed</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultConfirm</span><span class="token"> SEC_DEPRECATED_ATTRIBUTE </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultDeny</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">3</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultUnspecified</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">4</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultRecoverableTrustFailure</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">5</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultFatalTrustFailure</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">6</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">kSecTrustResultOtherError</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">7</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-213"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-211">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-212'
	>
	If we get anything else other than the <strong>kSecTrustResultProceed</strong> and <strong>kSecTrustResultUnspecified</strong> result, we can consider the certificate to be invalid (untrusted).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-216"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-214">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-215'
	>
	So far we’ve done nothing but checked for the remote server’s certificate evaluation. For the SSL pinning check we need to get the NSData from the SecCertificateRef which we got from the <strong>challenge.protectionSpace.serverTrust</strong> and get the NSData from the locally saved “.cer” certificate file. The magic of SSL pinning happens using one of the most basic methods of comparison – isEqual:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-219"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-217">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-218'
	>
	If the remote server’s certificate NSData isEqualToData of the local certificate, and the evaluation passes with no issues, we can verify the server’s identity and proceed with communication, as well as continue executing the request with the <strong>completionHandler(NSURLSessionAuthChallengeUseCredential, credential)</strong> method.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-222"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-220">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-221'
	>
	However, if the data objects are not equal, we cancel the execution of the dataTask with the <strong>completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, NULL)</strong> method and, in that way, reject the communication with the server.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-225"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-223">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-224'
	>
	AlamoFire</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-228"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-226">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-227'
	>
	SSL pinning using AlamoFire is fairly simple. Retrieving data for the certificate is optional as AlamoFire has the <strong>ServerTrustPolicy.certificatesInBundle()</strong> method which returns all the certificates within the bundle. First we create the ServerTrustPolicy object in which we load the certificate(s). To instantiate a Manager object with SSL pinning, we need to provide the ServerTrustPolicyManager object which is instantiated with a dictionary that maps the domain name to the ServerTrustPolicy object.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-231"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-229">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-230'
	>
	This is important as it means that we are using a slightly different approach to SSl pinning with AlamoFire than with the NSURLSession and AFNetworking. In AlamoFire, we are pinning only the predefined domain(s) &#8211; in this case github.com, and we don&#8217;t use pinning for all other domains. In NSURLSession and AFNetworking implementation, we cancel all requests except the ones for the pinned server, as all other servers fail when the SSL pinning check is performed. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">func configureAlamoFireSSLPinning </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        let pathToCert </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">NSBundle</span><span class="token">.</span><span class="token" style="color: #6f42c1;">mainBundle</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">pathForResource</span><span class="token">(</span><span class="token">githubCert</span><span class="token">,</span><span class="token"> ofType: </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">cer</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        let localCertificate:NSData </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">NSData</span><span class="token">(</span><span class="token">contentsOfFile: pathToCert</span><span class="token" style="color: #d73a49;">!</span><span class="token">)</span><span class="token" style="color: #d73a49;">!</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">serverTrustPolicy</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">ServerTrustPolicy</span><span class="token">.</span><span class="token" style="color: #6f42c1;">PinCertificates</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">            certificates: </span><span class="token">[</span><span class="token" style="color: #6f42c1;">SecCertificateCreateWithData</span><span class="token">(</span><span class="token">nil</span><span class="token">,</span><span class="token"> localCertificate</span><span class="token">)</span><span class="token" style="color: #d73a49;">!</span><span class="token">]</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            validateCertificateChain: </span><span class="token" style="color: #005cc5;">true</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            validateHost: </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">serverTrustPolicies</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">github.com</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">: </span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">serverTrustPolicy</span><span class="token" style="color: #d73a49;">!</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">afManager</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">Manager</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">            configuration: </span><span class="token" style="color: #24292e;">NSURLSessionConfiguration</span><span class="token">.</span><span class="token" style="color: #6f42c1;">defaultSessionConfiguration</span><span class="token">(</span><span class="token">)</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            serverTrustPolicyManager: </span><span class="token" style="color: #6f42c1;">ServerTrustPolicyManager</span><span class="token">(</span><span class="token">policies: </span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">serverTrustPolicies</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">func alamoFireRequestHandler </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">afManager</span><span class="token">.</span><span class="token" style="color: #6f42c1;">request</span><span class="token">(</span><span class="token">.GET</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">self</span><span class="token">.</span><span class="token" style="color: #24292e;">urlTextField</span><span class="token">.</span><span class="token" style="color: #24292e;">text</span><span class="token" style="color: #d73a49;">!</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            .response </span><span class="token">{</span><span class="token"> request</span><span class="token">,</span><span class="token"> response</span><span class="token">,</span><span class="token"> data</span><span class="token">,</span><span class="token"> error in
</span></span><span class="line"><span class="token">         </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> response management code</span><span class="token">
</span></span><span class="line"><span class="token">     </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-234">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-235'
	>
	Every request for the github.com domain goes through SSL pinning validation!</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-239"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-237">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-238'
	>
	AFNetworking</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-240">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-241'
	>
	Using SSL pinning in AFNetworking is pretty simple and straightforward. All you need to do is assign an AFSecurityPolicy policy object with the <strong>policyWithPinningMode:AFSSLPinningModePublicKey</strong> to the <strong>AFHTTPRequestOperationManager</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-244"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">AFHTTPRequestOperationManager </span><span class="token" style="color: #d73a49;">*</span><span class="token">manager </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">AFHTTPRequestOperationManager manager</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">AFSecurityPolicy </span><span class="token" style="color: #d73a49;">*</span><span class="token">policy </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">manager.securityPolicy </span><span class="token" style="color: #d73a49;">=</span><span class="token"> policy</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-247"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-245">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-246'
	>
	By default, AFNetworking will scan through your bundle and check for all “.cer” files, and add them to the <strong>manager.securityPolicy.pinnedCertificates</strong> array. That’s why there’s no need to add them manually. However, if there is a reason for using a specific certificate for a specific purpose (often there is; when we add multiple targets to the project which talk to different servers), we can add them selectively with the following bit of code:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-249"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-c github-light" data-language="c" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">NSString </span><span class="token" style="color: #d73a49;">*</span><span class="token">pathToCert </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">[</span><span class="token">NSBundle mainBundle</span><span class="token">]</span><span class="token">pathForResource:@</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">github.com</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> ofType:@</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">cer</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">NSData </span><span class="token" style="color: #d73a49;">*</span><span class="token">localCertificate </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">[</span><span class="token">NSData dataWithContentsOfFile:pathToCert</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">manager.securityPolicy.pinnedCertificates </span><span class="token" style="color: #d73a49;">=</span><span class="token"> @</span><span class="token">[</span><span class="token">localCertificate</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-252"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-250">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-251'
	>
	And that’s it! Every request we create using the previously configured and instanced <strong>AFHTTPRequestOperationManager</strong> will be using SSL pinning when communicating with the target server.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-255"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-253">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-254'
	>
	An example project of SSL pinning is available on GitHub:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-258"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-256">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-257'
	>
	Swift: <a href="https://github.com/antekarin/ssl-pinning-swift">https://github.com/antekarin/ssl-pinning-swift</a> </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-261"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-259">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-260'
	>
	Objective-C: <a href="https://github.com/antekarin/ios-ssl-pinning">https://github.com/antekarin/ios-ssl-pinning</a> </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-262">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-263'
	>
	The pinned SSL certificate which is saved within the app&#8217;s bundle belongs to github.com. Feel free to check it out!</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-267"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-265">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-266'
	>
	Bottom line</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-270"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-268">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-269'
	>
	Although the SSL connection is considered secure and is widely used whenever an encrypted connection is needed, another layer of protection is always welcomed when building high-risk apps. SSL pinning allows us to verify the server’s identity on top of the SSL chain of trust verification.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-273"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-271">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-272'
	>
	With SSL pinning, we can refuse all connections except the ones with the designated server whose SSL certificate we’ve saved into our local bundle. A potential drawback is that we need to update the app whenever the server’s SSL key is changed, either because it expired, or for some other reason.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-276"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-274">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-275'
	>
	With the release of the iOS 9, the <em>App Transport Security</em> library was also introduced. By default, ATS denies all insecure connections which do not use at least the TLS 1.2 protocol. The TLS protocol is a replacement for the SSL protocol, but still, both of them are often referred to as SSL. With SSL pinning in mind, there is no difference between having TLS or SSL as the underlying implementation – the basic concept remains the same.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-279"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-277">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-278'
	>
	Need to implement SSL pinning in an Android app? <a href="https://infinum.com/blog/securing-mobile-banking-on-android-with-ssl-certificate-pinning/">Check this out</a>.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/how-to-make-your-ios-apps-more-secure-with-ssl-pinning/">How to Make Your iOS Apps More Secure with SSL Pinning</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>