{"id":6092,"date":"2020-07-17T12:05:48","date_gmt":"2020-07-17T06:35:48","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=6092"},"modified":"2020-07-17T12:05:52","modified_gmt":"2020-07-17T06:35:52","slug":"how-to-do-ssl-pinning-via-public-key","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/","title":{"rendered":"How to do SSL pinning via public key"},"content":{"rendered":"\n<p>What is&nbsp; SSL&nbsp;?<\/p>\n\n\n\n<p>SSL stands for Secure Socket Layer. It is a protocol for establishing secure data transfer between networked computers or servers.<\/p>\n\n\n\n<p>Need For SSL-<\/p>\n\n\n\n<p>Many developers assume that using HTTPS in a network layer is enough to be sure that user data transfer will be fully secured and not compromised by a Man-in-the-Middle (MitM) attack. In most cases that is true, but not always.<\/p>\n\n\n\n<p>This is why to secure information passed by a browser, like a customer&#8217;s credit card number or password to a web server, most of the applications like an online store or online banking application uses SSL to prevent Man-in-the-Middle.<\/p>\n\n\n\n<p>Android SSL Pinning&#8211;<\/p>\n\n\n\n<p>There multiple ways we can perform SSL pinning in android&nbsp;<\/p>\n\n\n\n<p>1- Certificate pinning<\/p>\n\n\n\n<p>2-Public key pinning&nbsp;<\/p>\n\n\n\n<p>3- SPKI (SubjectPublicKeyInfo) pinning&nbsp;<\/p>\n\n\n\n<p>Here we will focus our attention on Public key pinning as it is the most recommended way for safe SSL pinning operations.<\/p>\n\n\n\n<p>To implement the pinning you need to know your certificates SPKI data.<\/p>\n\n\n\n<p>we can retrieve it using OpenSSL.<\/p>\n\n\n\n<p>Pinning on Android N(API 24) and above-:<\/p>\n\n\n\n<p>If minimum SDK is Android N&nbsp; then the implementation is very simple as Android has a new API in Android SDK from API 24 onwards the Network Security Configuration.<\/p>\n\n\n\n<p>you just need to enter an XML configuration file that defines the pins you require in our&nbsp; AndroidManifest.xml file.<\/p>\n\n\n\n<p><em>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<\/em><\/p>\n\n\n\n<p><em>&lt;network-security-config&gt;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain-config&gt;<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain includeSubdomains=&#8221;true&#8221;&gt;xyz.com&lt;\/domain&gt;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pin-set&gt;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pin digest=&#8221;SHA-256&#8243;&gt;6jj6tz+scE+XW+mlai6ZipDfFWn1dqvfLG+nU7tq1V8=&lt;\/pin&gt;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pin digest=&#8221;SHA-256&#8243;&gt;LLh6dUR9y6Kka30RrAn7fKbQG\/uEtLMkBgFF2Fuihg=&lt;\/pin&gt;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/pin-set&gt;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/domain-config&gt;<\/em><\/p>\n\n\n\n<p><em>&lt;\/network-security-config&gt;<\/em><\/p>\n\n\n\n<p>Declaration of Configuration file in AndroidManifest.xml:-<\/p>\n\n\n\n<p><em>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<\/em><\/p>\n\n\n\n<p><em>&lt;manifest xmlns:android=&#8221;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;<em>&nbsp;&nbsp;xmlns:tools=&#8221;http:\/\/schemas.android.com\/tools&#8221;<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&lt;application<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;android:name=&#8221;.application.XYZApplication&#8221;<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;<em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:allowBackup=&#8221;false&#8221;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:icon=&#8221;@mipmap\/app_launcher&#8221;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:label=&#8221;@string\/app_name&#8221;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:supportsRtl=&#8221;true&#8221;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:theme=&#8221;@style\/AppTheme&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:networkSecurityConfig=&#8221;@xml\/network_security_config&#8221;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tools:replace=&#8221;android:allowBackup,android:icon&#8221;&gt;<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/application&gt;<\/em><\/p>\n\n\n\n<p><em>&lt;\/manifest&gt;<\/em><\/p>\n\n\n\n<p>if&nbsp; you want to use network libraries for pinning we can do the following&nbsp;<\/p>\n\n\n\n<p>Pinning with Retrofit-<\/p>\n\n\n\n<p>Pining with Retrofit is easy being built on top of OkHttp.<\/p>\n\n\n\n<p><em>CertificatePinner certPinner = new CertificatePinner.Builder()<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&#8220;xyz.com&#8221;,<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;sha256\/8Rw90Ej3Ttt8RRkrg+WYDS9n7IS03bk5bjP\/UXPtaY8=&#8221;)<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;&nbsp;.build();<\/em><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><em>OkHttpClient okHttpClient = new OkHttpClient.Builder()<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.certificatePinner(certPinner)<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();<\/em><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><em>Retrofit retrofit = new Retrofit.Builder()<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;&nbsp;&nbsp;.baseUrl(&#8220;https:\/\/xyz.com&#8221;)<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;&nbsp;&nbsp;.addConverterFactory(GsonConverterFactory.create())<\/em><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;&nbsp;&nbsp;.client(okHttpClient)<\/em><\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();<\/em><\/p>\n\n\n\n<p>Pinning with HttpUrlConnection-<\/p>\n\n\n\n<p>if you are still using HttpURlconnection consider upgrading it to some other network libraries.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><\/pre>\n\n\n<pre class=\"wp-block-preformatted \">import java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStreamWriter;\nimport java.net.HttpURLConnection;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.security.KeyStore;\nimport java.security.KeyStoreException;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.cert.Certificate;\nimport java.security.cert.CertificateException;\nimport java.security.cert.X509Certificate;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Locale;\nimport javax.net.ssl.HttpsURLConnection;\nimport javax.net.ssl.SSLException;\nimport javax.net.ssl.SSLPeerUnverifiedException;\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.TrustManagerFactory;\nimport javax.net.ssl.X509TrustManager;\n\n\npublic class WebServiceManager {\n\n    private static String TAG = \"WebServiceManager\";\n\n\n \n\n    \n    private static String requestHttpsServer(String targetUrl, String jsonRequestString, int httpMethod, int readTimeOutType) throws IELTSException {\n        String jsonResponseString = null;\n        HttpsURLConnection httpsUrlConnection = null;\n        URL url;\n        try {\n            url = new URL(AppConstants.BASE_URL + targetUrl);\n\n\n            httpsUrlConnection = (HttpsURLConnection) url.openConnection();\n\n            httpsUrlConnection.setConnectTimeout(AppConstants.TIME_CONNECTION_TIMEOUT);\n            if (readTimeOutType == AppConstants.READ_TIMEOUT_SMALL) {\n                httpsUrlConnection.setReadTimeout(AppConstants.TIME_CONNECTION_DATA_WAIT_TIMEOUT_SMALL);\n            } else {\n                httpsUrlConnection.setReadTimeout(AppConstants.TIME_CONNECTION_DATA_WAIT_TIMEOUT_LARGE);\n            }\n\n\/\/ applying SSL pinning\n        \n            \/\/ getting SPKI keys for validation\n            String[] spki = CachingManager.getAppContext().getResources().getStringArray(R.array.spki);\n            List  validPins = Arrays.asList(spki);\n\n            \/\/ getting trust manager\n            X509TrustManagerExtensions trustManagerExt = prepTrustManager();\n            \/\/ validating pins for ssl pinning\n            validatePinning(trustManagerExt, httpsUrlConnection, validPins);\n\n\n          ......................\n\t\t  ...................\n        return jsonResponseString;\n    }\n\n    \n\n\n    \/\/ this method validate the pins return by the server with the public key  pin and throw an exception\n\t\n    private static void validatePinning(X509TrustManagerExtensions trustManagerExt, HttpsURLConnection conn, List validPins)\n            throws SSLException {\n        String certChainMsg = \"\";\n        try {\n            MessageDigest md = MessageDigest.getInstance(\"SHA-256\");\n\n            \/\/ getting list of trust chain\n            List trustedChain = trustedChain(trustManagerExt, conn);\n\n            \/\/ validating pins for both side\n            for (X509Certificate cert : trustedChain) {\n                byte[] publicKey = cert.getPublicKey().getEncoded();\n                md.update(publicKey, 0, publicKey.length);\n                String pin = Base64.encodeToString(md.digest(), Base64.NO_WRAP);\n                certChainMsg += \"    sha256\/\" + pin + \" : \" +\n                        cert.getSubjectDN().toString() + \"\\n\";\n                if (validPins.contains(pin)) {\n                    return;\n                }\n            }\n        } catch (NoSuchAlgorithmException e) {\n            throw new SSLException(e);\n        }\n        throw new SSLPeerUnverifiedException(\"Certificate pinning \" +\n                \"failure\\n  Peer certificate chain:\\n\" + certChainMsg);\n    }\n\n    \/\/ extracting the X509  certificates chains for server end\n\t\n    private static List trustedChain(X509TrustManagerExtensions trustManagerExt, HttpsURLConnection conn) throws SSLException {\n\n        Certificate[] serverCerts = conn.getServerCertificates();\n\n        X509Certificate[] untrustedCerts = Arrays.copyOf(serverCerts, serverCerts.length, X509Certificate[].class);\n\n        String host = conn.getURL().getHost();\n        try {\n            return trustManagerExt.checkServerTrusted(untrustedCerts,\n                    \"RSA\", host);\n        } catch (CertificateException e) {\n            throw new SSLException(e);\n        }\n    }\n\n    \/\/ prepare TrustManagers\n\t\n    private static X509TrustManagerExtensions prepTrustManager() {\n        \/\/ creating trust manager to get X509 trust manager\n        TrustManagerFactory trustManagerFactory = null;\n        try {\n            trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\n            trustManagerFactory.init((KeyStore) null);\n\n        } catch (NoSuchAlgorithmException | KeyStoreException e) {\n            Log.e(TAG, e.toString());\n        }\n\n        \/\/ Find first X509TrustManager in the TrustManagerFactory\n        X509TrustManager x509TrustManager = null;\n        for (TrustManager trustManager : trustManagerFactory.getTrustManagers()) {\n            if (trustManager instanceof X509TrustManager) {\n                x509TrustManager = (X509TrustManager) trustManager;\n                break;\n            }\n        }\n\n\n        return new X509TrustManagerExtensions(x509TrustManager);\n\n    }\n\n}\n<\/pre>","protected":false},"excerpt":{"rendered":"<p>What is&nbsp; SSL&nbsp;? SSL stands for Secure Socket Layer. It is a protocol for establishing secure data transfer between networked computers or servers. Need For SSL- Many developers assume that using HTTPS in a network layer is enough to be sure that user data transfer will be fully secured and not compromised by a Man-in-the-Middle [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6094,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71,6,102,258],"tags":[],"class_list":["post-6092","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mobile","category-mobile-web-app","category-web-service","category-web-technology"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to do SSL pinning via public key - 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\/how-to-do-ssl-pinning-via-public-key\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to do SSL pinning via public key - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"What is&nbsp; SSL&nbsp;? SSL stands for Secure Socket Layer. It is a protocol for establishing secure data transfer between networked computers or servers. Need For SSL- Many developers assume that using HTTPS in a network layer is enough to be sure that user data transfer will be fully secured and not compromised by a Man-in-the-Middle [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-17T06:35:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-07-17T06:35:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/07\/pinning.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1137\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\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=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"How to do SSL pinning via public key\",\"datePublished\":\"2020-07-17T06:35:48+00:00\",\"dateModified\":\"2020-07-17T06:35:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/\"},\"wordCount\":719,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/07\\\/pinning.png\",\"articleSection\":[\"Mobile\",\"Mobile Web App\",\"Web service\",\"Web Technology\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/\",\"name\":\"How to do SSL pinning via public key - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/07\\\/pinning.png\",\"datePublished\":\"2020-07-17T06:35:48+00:00\",\"dateModified\":\"2020-07-17T06:35:52+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/07\\\/pinning.png\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/07\\\/pinning.png\",\"width\":1137,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/how-to-do-ssl-pinning-via-public-key\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to do SSL pinning via public key\"}]},{\"@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":"How to do SSL pinning via public key - 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\/how-to-do-ssl-pinning-via-public-key\/","og_locale":"en_US","og_type":"article","og_title":"How to do SSL pinning via public key - InnovationM - Blog","og_description":"What is&nbsp; SSL&nbsp;? SSL stands for Secure Socket Layer. It is a protocol for establishing secure data transfer between networked computers or servers. Need For SSL- Many developers assume that using HTTPS in a network layer is enough to be sure that user data transfer will be fully secured and not compromised by a Man-in-the-Middle [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/","og_site_name":"InnovationM - Blog","article_published_time":"2020-07-17T06:35:48+00:00","article_modified_time":"2020-07-17T06:35:52+00:00","og_image":[{"width":1137,"height":630,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/07\/pinning.png","type":"image\/png"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"How to do SSL pinning via public key","datePublished":"2020-07-17T06:35:48+00:00","dateModified":"2020-07-17T06:35:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/"},"wordCount":719,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/07\/pinning.png","articleSection":["Mobile","Mobile Web App","Web service","Web Technology"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/","url":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/","name":"How to do SSL pinning via public key - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/07\/pinning.png","datePublished":"2020-07-17T06:35:48+00:00","dateModified":"2020-07-17T06:35:52+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/07\/pinning.png","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/07\/pinning.png","width":1137,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/how-to-do-ssl-pinning-via-public-key\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to do SSL pinning via public key"}]},{"@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\/6092","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=6092"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6092\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/6094"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=6092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=6092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=6092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}