I'm trying to implement a Client Certificates communication for an Android App, so far without much success - and it seems that this feature is, if at all possible, very hard. The full flow I'm implementing is described in my previous question.
I followed the code there and code from this blog post, describing the same scenario, more or less, without results.
What doesn't work: Opening an SSL Connection (HttpsURLConnection
) between the Android Client and the Server causes the server to return an 403 status code.
AFAIK, this 403 is because the server doesn't get or doesn't trust the Client Certificate that it gets, and I'm not sure how to debug it.
What does work:
- Creating a PKCS#10 request, sending it to the CA and getting a signed PKCS#7 (P7B)
- Storing the received P7B with the private key in a KeyStore, and exporting it to a PKCS#12 (P12)
- (Most annonying) picking the P12 from the device, installing it on windows, contacting the server and getting a coherent (200 HTTP-OK) response.
What I've changed: From the code samples I got (from here and here), I had to change a few things. I'm using HttpsURLConnection and not OkHttpClient as @Than used there (but it shouldn't matter), I can't provide the Certificates as Rich Freedman did (he had the certificate, and I'm obtaining it via PKCS#10 and #7), so I've created a CustomTrustManager that would trust the server's certificate, and for this reason I use SpongyCastle (v1.5.0.0 if it matters, set as a provider inserted at 0) and also don't persist the certificate, but all is done in-memory.
Question is what to do next:
- How can I tell what the server is expecting (client-certificate wise)?
- How can I tell which client certificates (if any) is being sent to the server?
- How to debug this scenario in general? (Proxies such as Fiddler are useless for the underlying SSL)
Thanks!
It's not good answer, but there is too much in here to post it as comment.
For logging, debugging you can create your own
X509KeyManager
which uses normal key manager obtained fromKeyManagerFactory
:@DebugLog
annotation comes from Hugo library created by Jake Wharton. It prints function arguments and what it return. You can use normal Log.d or whatever you want.ex:
And use it to init
SSLContext
You will see which method are called, what are the arguments (obtained from serwer certificate) and which certificate and private key your keymanager returns.