title: Android and Client Certificates
body: <p>I have been searching for this for a few weeks and can't seem to find an answer anywhere.  I am trying to do the following for Android.  This code is from a C# app I wrote but am porting it to Android.  The web endpoint requires a cert to be attached to the request for mutual authentication to make the web service call.</p>
  
  <pre><code>        string certThumbprint = "E1313F6A2D770783868755D016CE748F6A9B0028";
          X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
          try
          {
              certStore.Open(OpenFlags.ReadOnly);
          }
          catch (Exception e)
          {
              if (e is CryptographicException)
              {
                  Console.WriteLine("Error: The store is unreadable.");
              }
              else if (e is SecurityException)
              {
                  Console.WriteLine("Error: You don't have the required permission.");
              }
              else if (e is ArgumentException)
              {
                  Console.WriteLine("Error: Invalid values in the store.");
              }
              else
              {
                  throw;
              }
          }
          X509Certificate2Collection certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, certThumbprint, false);
          certStore.Close();
          if (0 == certCollection.Count)
          {
              throw new Exception("Error: No certificate found containing thumbprint " + certThumbprint);
          }
          X509Certificate2 certificate = certCollection[0];
          return certificate;
  </code></pre>
  
  <p>I am then doing this (request is an HttpWebRequest):</p>
  
  <pre><code>request.ClientCertificates.Add(cert);
  </code></pre>
  
  <p>This works fine in C# however when I move to Android I'm getting a "file not found" error on the getInputStream() call.  Here is my Android code:</p>
  
  <pre><code>StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  
          StrictMode.setThreadPolicy(policy);
          CertificateFactory cf = CertificateFactory.getInstance("X.509");
  
          InputStream caInput = new BufferedInputStream(new FileInputStream("/sdcard/Certificate.pfx"));
          KeyHelper kh = new KeyHelper();
          Certificate ca = kh.GetKey("Password");
          String keyStoreType = KeyStore.getDefaultType();
          keyStore = KeyStore.getInstance(keyStoreType);
          keyStore.load(null, null);
          keyStore.setCertificateEntry("ca", ca);
          KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
          kmf.init(keyStore, "Password".toCharArray());
          SSLContext context = SSLContext.getInstance("TLS");
          context.init(kmf.getKeyManagers(),null,new SecureRandom());
          HttpsURLConnection urlConnection =
                  (HttpsURLConnection)url.openConnection();
          urlConnection.setRequestProperty("x-ms-version",AZURE_REST_VERSION);
          urlConnection.setDoInput(true);
          urlConnection.setDoOutput(true);
          urlConnection.setRequestMethod("GET");
          urlConnection.setSSLSocketFactory(context.getSocketFactory());
          urlConnection.connect();
  
          InputStream in = new BufferedInputStream(urlConnection.getInputStream()); //&lt;-----Blows up here
  
      } catch (KeyStoreException e) {
          throw new KeyStoreException("Keystore Exception",e);
      } catch (NoSuchAlgorithmException e) {
          throw new NoSuchAlgorithmException("Algorithm exception",e);
      } catch (KeyManagementException e) {
          throw new KeyManagementException("Key Exception", e);
      }
  </code></pre>
  
  <p>I tried to put fiddler between the emulator and the endpoint and it comes back with a 200.  I think this is because my cert is in my local private store on my dev machine.   Any thoughts?</p>