title: implement SSL Certificate Pinning while using React Native
body: <p>I can't do use a webservice on Android using React Native. 
  The webservice uses a certificate to be able to connect.
  I tried various solutions but without success. Currently I am trying to use this code: <a href="https://medium.com/@jaedmuva/react-native-ssl-pinning-is-back-e317e6682642" rel="nofollow noreferrer">https://medium.com/@jaedmuva/react-native-ssl-pinning-is-back-e317e6682642</a> which also looks like the code in this link: <a href="https://stackoverflow.com/questions/40240321/how-can-i-implement-ssl-certificate-pinning-while-using-react-native">How can I implement SSL Certificate Pinning while using React Native</a></p>
  
  <p>this is my code:</p>
  
  <pre><code>public class MainApplication extends Application implements ReactApplication {
  
    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
      @Override
      public boolean getUseDeveloperSupport() {
        return BuildConfig.DEBUG;
      }
  
      @Override
      protected List&lt;ReactPackage&gt; getPackages() {
        return Arrays.&lt;ReactPackage&gt;asList(
            new MainReactPackage(),
              new FastImageViewPackage(),
              new RNBackgroundFetchPackage(),
              new RNSqlite2Package(),
              new VectorIconsPackage()
        );
      }
  
      @Override
      protected String getJSMainModuleName() {
        return "index";
      }
    };
  
    @Override
    public ReactNativeHost getReactNativeHost() {
      return mReactNativeHost;
    }
  
    @Override
    public void onCreate() {
      super.onCreate();
      SoLoader.init(this, /* native exopackage */ false);
      OkHttpClientProvider.setOkHttpClientFactory(new CustomClientFactory()); //  I added this line
    }
  }
  </code></pre>
  
  <p>I create a CustomClientFactory class:</p>
  
  <pre><code>import com.facebook.react.modules.network.OkHttpClientFactory;
  import com.facebook.react.modules.network.OkHttpClientProvider;
  import com.facebook.react.modules.network.ReactCookieJarContainer;
  import java.util.concurrent.TimeUnit;
  import okhttp3.CertificatePinner;
  import okhttp3.OkHttpClient;
  public class CustomClientFactory implements OkHttpClientFactory {
  private static String hostname = "https://xxx.xxx.xx.xxx:xxxx/";
  @Override
  public OkHttpClient createNewNetworkModuleClient() {
      CertificatePinner certificatePinner = new CertificatePinner.Builder()
      .add(hostname, "sha256/1XIqmWJAm60di+5db9kkZxF1QGUyybLb0lCaOAnosNg=")
      //.add(hostname, "sha256/YOUR_PUBLIC_KEY_HASH_BACKUP1")
      //.add(hostname, "sha256/YOUR_PUBLIC_KEY_HASH_BACKUP2")
      .build();
      OkHttpClient.Builder client = new OkHttpClient.Builder()
      .connectTimeout(0, TimeUnit.MILLISECONDS)
      .readTimeout(0, TimeUnit.MILLISECONDS)
      .writeTimeout(0, TimeUnit.MILLISECONDS)
      .cookieJar(new ReactCookieJarContainer())
      .certificatePinner(certificatePinner);
      return OkHttpClientProvider.enableTls12OnPreLollipop(client).build();
    }
  }
  </code></pre>
  
  <p>But I still have this error:</p>
  
  <pre><code>09-03 15:56:13.013 4811-5139/com.mweb_dmc D/SettingsInterface:  from settings cache , name = sound_effects_enabled , value = 0
  09-03 15:56:13.015 4811-5319/com.mweb_dmc D/libc-netbsd: [getaddrinfo]: hostname=xxx.xxx.xx.xxx; servname=(null); netid=0; mark=0
      [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
  09-03 15:56:13.015 4811-5319/com.mweb_dmc I/System.out: [CDS][DNS] getAllByNameImpl netId = 0
  09-03 15:56:13.016 4811-5319/com.mweb_dmc D/libc-netbsd: [getaddrinfo]: hostname=xxx.xxx.xx.xxx; servname=(null); netid=0; mark=0
      [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
  09-03 15:56:13.016 4811-5319/com.mweb_dmc I/System.out: [CDS]rx timeout:0
  09-03 15:56:13.017 4811-5319/com.mweb_dmc I/System.out: [socket][20] connection /xxx.xxx.xx.xxx:1443;LocalPort=43588(0)
      [CDS]connect[/xxx.xxx.xx.xxx:1443]
  09-03 15:56:13.017 4811-5319/com.mweb_dmc D/Posix: [Posix_connect Debug]Process com.mweb_dmc :1443 
  09-03 15:56:13.113 4811-5319/com.mweb_dmc I/System.out: [CDS]port[43588]
      [socket][/192.168.1.91:43588] connected
  09-03 15:56:13.114 4811-5319/com.mweb_dmc D/libc-netbsd: [getaddrinfo]: hostname=xxx.xxx.xx.xxx; servname=(null); netid=0; mark=0
      [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
  09-03 15:56:13.115 4811-5319/com.mweb_dmc D/NativeCrypto: ssl=0xaf53cd00 NativeCrypto_SSL_do_handshake fd=0x96f1cd20 shc=0x96f1cd24 timeout_millis=0 client_mode=1 npn=0x0
      doing handshake ++
      ssl=0xaf53cd00 info_callback where=0x10 ret=1
      ssl=0xaf53cd00 handshake start in CINIT  before connect initialization
      ssl=0xaf53cd00 info_callback calling handshakeCompleted
      ssl=0xaf53cd00 info_callback completed
      ssl=0xaf53cd00 info_callback where=0x1001 ret=1
      ssl=0xaf53cd00 SSL_connect:CINIT  before connect initialization
      ssl=0xaf53cd00 info_callback ignored
      ssl=0xaf53cd00 info_callback where=0x1001 ret=1
      ssl=0xaf53cd00 SSL_connect:3WCH_A SSLv3 write client hello A
      ssl=0xaf53cd00 info_callback ignored
      ssl=0xaf53cd00 info_callback where=0x1002 ret=-1
      ssl=0xaf53cd00 SSL_connect:error exit in 3RSH_A SSLv3 read server hello A
      ssl=0xaf53cd00 info_callback ignored
      doing handshake -- ret=-1
      ssl=0xaf53cd00 NativeCrypto_SSL_do_handshake ret=-1 errno=11 sslError=2 timeout_millis=0
  09-03 15:56:13.194 4811-5319/com.mweb_dmc D/NativeCrypto: doing handshake ++
      ssl=0xaf53cd00 info_callback where=0x1001 ret=1
      ssl=0xaf53cd00 SSL_connect:3RSH_A SSLv3 read server hello A
      ssl=0xaf53cd00 info_callback ignored
  09-03 15:56:13.194 4811-5319/com.mweb_dmc E/NativeCrypto: ssl=0xaf53cd00 cert_verify_callback x509_store_ctx=0x96f1cb4c arg=0x0
      ssl=0xaf53cd00 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
  09-03 15:56:13.196 4811-5319/com.mweb_dmc D/NativeCrypto: ssl=0xaf53cd00 cert_verify_callback =&gt; 0
  09-03 15:56:13.196 4811-5319/com.mweb_dmc D/OpenSSLLib: OpensslErr:Module:16(190:126); file:external/boringssl/src/ssl/s3_clnt.c ;Line:984;Function:ssl3_get_server_certificate
  09-03 15:56:13.196 4811-5319/com.mweb_dmc D/NativeCrypto: ssl=0xaf53cd00 info_callback where=0x4008 ret=558
      ssl=0xaf53cd00 SSL3 alert write:F:CU fatal certificate unknown
      ssl=0xaf53cd00 info_callback ignored
      ssl=0xaf53cd00 info_callback where=0x1002 ret=-1
      ssl=0xaf53cd00 SSL_connect:error exit in 3RSC_B SSLv3 read server certificate B
      ssl=0xaf53cd00 info_callback ignored
      doing handshake -- ret=-1
      ssl=0xaf53cd00 NativeCrypto_SSL_do_handshake exception =&gt; 0
  09-03 15:56:13.197 4811-5319/com.mweb_dmc I/System.out: close [socket][/192.168.1.91:43588]
      close [socket][/:::43588]
  09-03 15:56:13.304 4811-5138/com.mweb_dmc I/ReactNativeJS: { [Error: Error Connection]
        line: 119541,
        column: 24,
        sourceURL: 'http://localhost:8081/index.delta?platform=android&amp;dev=true&amp;minify=false' }
  </code></pre>
  
  <p><strong>edit:</strong></p>
  
  <p>for information, I had the same problem with IOS. I solved the problem by adding in the file RCTHTTPRequestHandler.m this code :</p>
  
  <pre><code>- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
  {
    completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
  }
  </code></pre>