Сертификат Libcurl Pinning работает на iPhone, но не на Android

Это мой код на С++, который я использую в проектах Obj-C и JAVA.

string readBuffer;
string certificateBeingUsed;
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_URL, "https://apiServer");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 120);
curl_easy_setopt(curl, CURLOPT_ENCODING, GZIP);

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER , true);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST , 2);
curl_easy_setopt(curl, CURLOPT_CAINFO,certificateBeingUsed);

CURLcode res;
res = curl_easy_perform(curl);

----------------------------------------------- ---------------------

В Xcode у меня есть свой ceritificate "certificatePinning.der", хранящийся в папке Ресурсы/Сертификаты.

Чтобы использовать приведенный выше код, я устанавливаю certificateBeingUsed в свой путь к сертификату:

certificateBeingUsed = "/Users/graceo/Library/Developer/CoreSimulator/Devices/1BB154CB-276B-4DDC-86C8-4975213D7E3B/data/Containers/Bundle/Application/4819EC2A-CA18-46BF-815F-445B5E3E519F/TestStoryBoardWithLibraryAndSwift.app/certificatePinning.der" 

и res возвращает успех с readBuffer, содержащий ответ, отправленный с сервера.

----------------------------------------------- ---------------------

В Android Studio у меня есть свой сертификат "certificatePinning.der", хранящийся в папке с ресурсами. (я копирую его в папку с данными перед его использованием)

Чтобы использовать приведенный выше код, я устанавливаю certificateBeingUsed в свой путь к сертификату:

certificateBeingUsed = "/data/data/packageName/certificatePinning.der" 

но res возвращает CURLE_SSL_CACERT_BADFILE (77) и readBuffer пуст

----------------------------------------------- ---------------------

Что мне не хватает в Android, который не смог проверить сертификат, хранящийся на сервере?

NB:

  • Я поддерживаю SSL в libCurl.
  • В андроиде, если я установил его в сертификат cacert.pem, он вернет успех, но вместо этого я хочу использовать свой сертификат.

Ответ 1

Это может быть проблема с кодировкой, попробуйте преобразовать ваш .der файл в формат .pem, используя это:

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem