{"id":6335,"date":"2020-10-28T18:07:11","date_gmt":"2020-10-28T12:37:11","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=6335"},"modified":"2020-10-28T18:07:11","modified_gmt":"2020-10-28T12:37:11","slug":"ssl-pinning-with-public-key-using-trustkit","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/","title":{"rendered":"SSL pinning with public key using TrustKit"},"content":{"rendered":"<p>In today&#8217;s advance environment, everybody will be comfortable with automation rather than applying manual efforts.<\/p>\n<p>With <strong>Trustkit<\/strong>, one can easily <em>validate the certificate\u2019s public key<\/em> by typing only a few lines of codes and also, it comes with extra functionalities like reporting or fallback public keys.<\/p>\n<p><strong>Step 1<\/strong>: <strong>Extracting the public key of the certificate <\/strong><\/p>\n<p>Firstly, one has to download the actual certificate used by the server. \u00a0Here, I am using the google certificate for the testing purpose.\u00a0 Extract certificate with the below command:<\/p>\n<pre class=\"lang:default decode:true \">openssl s_client -showcerts -connect www.google.co.uk:443 &lt; \/dev\/null | openssl x509 -outform DER &gt; google.cer<\/pre>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-6336 size-full\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/1.png\" alt=\"\" width=\"1612\" height=\"742\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/1.png 1612w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/1-300x138.png 300w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/1-1024x471.png 1024w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/1-768x354.png 768w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/1-1536x707.png 1536w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/1-624x287.png 624w\" sizes=\"(max-width: 1612px) 100vw, 1612px\" \/><\/p>\n<p><strong>Note:<\/strong> Change the format of the downloaded certificate from .cer to .pem (which is the accepted format of TrustKit). Here, I renamed the google certificate \u2018<em>google.cer<\/em>\u2019 to \u2018googleSSL.cer\u2019 for better understanding. Use below command to change the file format:<\/p>\n<pre class=\"lang:default decode:true \">openssl x509 -inform der -in googleSSL.cer -out certificate.pem<\/pre>\n<p><img decoding=\"async\" class=\"alignnone wp-image-6337 size-full\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/2.png\" alt=\"\" width=\"1142\" height=\"678\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/2.png 1142w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/2-300x178.png 300w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/2-1024x608.png 1024w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/2-768x456.png 768w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/2-624x370.png 624w\" sizes=\"(max-width: 1142px) 100vw, 1142px\" \/><\/p>\n<p>And finally, use the below command to extracts the public key for the pinning:<\/p>\n<pre class=\"lang:default decode:true \">cat certificate.pem | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64<\/pre>\n<p><img decoding=\"async\" class=\"alignnone wp-image-6338 size-full\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/3.png\" alt=\"\" width=\"1138\" height=\"682\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/3.png 1138w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/3-300x180.png 300w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/3-1024x614.png 1024w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/3-768x460.png 768w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/3-624x374.png 624w\" sizes=\"(max-width: 1138px) 100vw, 1138px\" \/><\/p>\n<p><strong>Step 2: Installation<\/strong><\/p>\n<p>Now that one has extracted the public key, set up the TrustKit by installing TrustKit by using pods and add TrustKit in the project.<\/p>\n<p>Add below line in your pod file and install the pod.<\/p>\n<pre class=\"lang:default decode:true \">pod 'TrustKit'<\/pre>\n<p><strong>Step 3: TrustKit configuration<\/strong><\/p>\n<p>There are two ways to configure TrustKit. The first way is by<strong> Adding keys and values to info.plist file<\/strong> which could be achieved by below code:<\/p>\n<pre class=\"lang:default decode:true \">&lt;key&gt;TSKConfiguration&lt;\/key&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;dict&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;key&gt;TSKPinnedDomains&lt;\/key&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;dict&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;key&gt;myDomain.com&lt;\/key&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;dict&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;key&gt;TSKPublicKeyHashes&lt;\/key&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;array&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;string&gt;public key 1&lt;\/string&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;string&gt;public key 2&lt;\/string&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/array&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;key&gt;TSKPublicKeyAlgorithms&lt;\/key&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;array&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;string&gt;TSKAlgorithmRsa2048&lt;\/string&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/array&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;key&gt;TSKIncludeSubdomains&lt;\/key&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;true\/&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;key&gt;TSKEnforcePinning&lt;\/key&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;true\/&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/dict&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/dict&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/dict&gt;<\/pre>\n<p>The second public key i.e. <em>public key 2 (in the code above) <\/em>is the backup key. So, if, there is some issue with the first key, the application will work properly with the second key (backup key).<\/p>\n<p>One has to add two mandatory keys: <strong>kTSKPublicKeyAlgorithms<\/strong> and <strong>kTSKPublicKeyHashes<\/strong> to make the configuration works properly. \u00a0Here, the key kTSKPublicKeyAlgorithms specifies the encoding method of the public key and the kTSKPublicKeyHashes define the hashed version of the public key.<\/p>\n<p><strong>Note:<\/strong>\u00a0 One has to provide at least two public keys for the pinning. The first key is from the main certificate and another key is from the backup certificate key.<\/p>\n<p>The second way is by <strong>Adding the same keys and values by code in your Appdelegate file<\/strong>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6339 size-full\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/4.png\" alt=\"\" width=\"1430\" height=\"739\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/4.png 1430w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/4-300x155.png 300w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/4-1024x529.png 1024w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/4-768x397.png 768w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/4-624x322.png 624w\" sizes=\"(max-width: 1430px) 100vw, 1430px\" \/><\/p>\n<pre class=\"lang:default decode:true \">@UIApplicationMain\r\n\r\nclass AppDelegate: UIResponder, UIApplicationDelegate {\u00a0\r\n\r\nvar window: UIWindow?\r\n\r\nstatic let kMyDomain = \"your domain Name\"\r\n\r\nvar backgroundSessionCompletionHandler: (() -&gt; Void)?\u00a0\r\n\r\nfunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&gt; Bool {\u00a0\r\n\r\nApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)\r\n\r\nTrustKit.setLoggerBlock { (message) in\r\n\r\nprint(\"TrustKit log: \\(message)\")}\u00a0\r\n\r\nlet trustKitConfig = [\r\n\r\n\/\/ kTSKSwizzleNetworkDelegates: false,\r\n\r\nkTSKPinnedDomains : [\r\n\r\nAppDelegate.kMyDomain : [\r\n\r\nkTSKEnforcePinning: true,\r\n\r\nkTSKIncludeSubdomains: true,\r\n\r\nkTSKPublicKeyAlgorithms: [kTSKAlgorithmRsa2048],\r\n\r\nkTSKPublicKeyHashes: [\r\n\r\n\"public key 1\",\r\n\r\n\"public key 2\"\r\n\r\n],\r\n\r\n]\r\n\r\n]\r\n\r\n] as [String : Any]\u00a0\r\n\r\nTrustKit.initSharedInstance(withConfiguration: trustKitConfig)<\/pre>\n<p><strong style=\"font-size: 1rem;\">Step 4: To validate Public Key<\/strong><\/p>\n<p>After configuration, one can validate the public key by using <strong>PinnigValidator<\/strong> and <strong>URLSessionDelegate<\/strong>.<\/p>\n<pre class=\"lang:default decode:true \">static func isServerCertValid(_ challenge: URLAuthenticationChallenge) -&gt; Bool {\r\n\r\n\u00a0 guard let serverTrust = challenge.protectionSpace.serverTrust else {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 return false\r\n\r\n\u00a0 }\r\n\r\n\u00a0 let pinningValidator = TrustKit.sharedInstance().pinningValidator\r\n\r\n\u00a0 let trustDecision = pinningValidator.evaluateTrust(serverTrust, forHostname: \"myWebsite.com\")\r\n\r\n\u00a0 return trustDecision == .shouldAllowConnection\r\n\r\n}<\/pre>\n<p><strong>Step 5: To test the validation<\/strong><\/p>\n<p>The easiest way to test the public key pinning is by using <em>Charles Proxy<\/em>. The Charles Proxy works as a middleman between the application and the server and intercepts the sent requests.<\/p>\n<p>By following the above steps, one can reduce the manual efforts of validating public key and automate this task with TrustKit.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In today&#8217;s advance environment, everybody will be comfortable with automation rather than applying manual efforts. With Trustkit, one can easily validate the certificate\u2019s public key by typing only a few lines of codes and also, it comes with extra functionalities like reporting or fallback public keys. Step 1: Extracting the public key of the certificate [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6340,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71,6,102,258],"tags":[14,549],"class_list":["post-6335","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mobile","category-mobile-web-app","category-web-service","category-web-technology","tag-innovationm","tag-ssl-pinning-with-public-key-using-trustkit"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SSL pinning with public key using TrustKit - InnovationM - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SSL pinning with public key using TrustKit - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"In today&#8217;s advance environment, everybody will be comfortable with automation rather than applying manual efforts. With Trustkit, one can easily validate the certificate\u2019s public key by typing only a few lines of codes and also, it comes with extra functionalities like reporting or fallback public keys. Step 1: Extracting the public key of the certificate [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-28T12:37:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/5.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"SSL pinning with public key using TrustKit\",\"datePublished\":\"2020-10-28T12:37:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/\"},\"wordCount\":413,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/5.png\",\"keywords\":[\"InnovationM\",\"SSL pinning with public key using TrustKit\"],\"articleSection\":[\"Mobile\",\"Mobile Web App\",\"Web service\",\"Web Technology\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/\",\"name\":\"SSL pinning with public key using TrustKit - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/5.png\",\"datePublished\":\"2020-10-28T12:37:11+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/5.png\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/5.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/ssl-pinning-with-public-key-using-trustkit\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SSL pinning with public key using TrustKit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SSL pinning with public key using TrustKit - InnovationM - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/","og_locale":"en_US","og_type":"article","og_title":"SSL pinning with public key using TrustKit - InnovationM - Blog","og_description":"In today&#8217;s advance environment, everybody will be comfortable with automation rather than applying manual efforts. With Trustkit, one can easily validate the certificate\u2019s public key by typing only a few lines of codes and also, it comes with extra functionalities like reporting or fallback public keys. Step 1: Extracting the public key of the certificate [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/","og_site_name":"InnovationM - Blog","article_published_time":"2020-10-28T12:37:11+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/5.png","type":"image\/png"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"SSL pinning with public key using TrustKit","datePublished":"2020-10-28T12:37:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/"},"wordCount":413,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/5.png","keywords":["InnovationM","SSL pinning with public key using TrustKit"],"articleSection":["Mobile","Mobile Web App","Web service","Web Technology"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/","url":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/","name":"SSL pinning with public key using TrustKit - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/5.png","datePublished":"2020-10-28T12:37:11+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/5.png","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/5.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/ssl-pinning-with-public-key-using-trustkit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SSL pinning with public key using TrustKit"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=6335"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6335\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/6340"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=6335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=6335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=6335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}