Я пытаюсь реализовать связь клиентских сертификатов для приложения для Android, но пока без особого успеха - и кажется, что эта функция, если вообще возможно, очень сложна. Полный поток, который я реализую, описан в мой предыдущий вопрос.
Я следил за кодом и кодом из этого сообщения в блоге , описывающий тот же сценарий, более или менее безрезультатно.
Что не работает: открытие SSL-соединения (HttpsURLConnection
) между клиентом Android и сервером заставляет сервер возвращать код состояния 403.
AFAIK, это 403 связано с тем, что сервер не получает или не доверяет полученному сертификату клиента, и я не уверен как его отлаживать.
Что работает:
- Создание запроса PKCS # 10, отправка его в центр сертификации и получение подписанного PKCS # 7 (P7B)
- Сохранение полученного P7B с закрытым ключом в KeyStore и его экспорт в PKCS # 12 (P12)
- (Самое неприятное) выбор P12 с устройства, установка его в Windows, соединение с сервером и получение связного (200 HTTP-OK) ответа.
Что я изменил: из примеров кода, которые я получил (из здесь и здесь), мне пришлось кое-что изменить. Я использую HttpsURLConnection, а не OkHttpClient, как там использовал @Than (но это не имеет значения), я не могу предоставить сертификаты, как это сделал Рич Фридман (у него был сертификат, а я получение его через PKCS # 10 и # 7), поэтому я создал CustomTrustManager, который будет доверять сертификату сервера, и по этой причине я использую SpongyCastle (v1.5.0.0, если это важно, установите как поставщик, вставленный в 0) а также не сохранять сертификат, но все делается в памяти.
Вопрос в том, что делать дальше:
- Как я могу узнать, что ожидает сервер (с точки зрения сертификата клиента)?
- Как я могу узнать, какие клиентские сертификаты (если есть) отправляются на сервер?
- Как вообще отладить этот сценарий? (Прокси, такие как Fiddler, бесполезны для базового SSL)
Спасибо!