android - Libcurl Certificate Pinning 在 iPhone 上工作但在 Android 上不工作

标签 android c++ iphone openssl libcurl

这是我在 Obj-C 和 JAVA 项目中使用的 C++ 代码。

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 中,我将我的证书“certificatePinning.der”存储在 Resources/Certificates 文件夹中。

为了使用上面的代码,我将 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”存储在 Assets 文件夹中。 (我在使用前复制到data文件夹下)

为了使用上面的代码,我将 certificateBeingUsed 设置为我的证书路径:

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

res 返回 CURLE_SSL_CACERT_BADFILE (77) 并且 readBuffer 为空

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

我在 Android 中缺少什么无法验证服务器存储的证书??

注意:

  1. 我在 libCurl 中支持 SSL。
  2. 在 android 中,如果我将它设置为证书 cacert.pem它将返回成功,但我想改用我的证书。

最佳答案

这可能是编码问题,请尝试使用此方法将您的 .der 文件转换为 .pem 格式:

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

关于android - Libcurl Certificate Pinning 在 iPhone 上工作但在 Android 上不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32963148/

相关文章:

android - 无法获取 android.permission.CLEAR_APP_USER_DATA

java - 更新 Firebase 中的键值

c++ - 如何在 C++ 中使用引用参数?

objective-c - 在 Objective-C (iPhone) 中将字符串保存到文件中

iphone - MonoTouch iPhone 方向不匹配

android - (Unity3D-Android)始终无法构建

android - SURF 和 SIFT 特征检测器 OpenCV android

c++ - 在构造函数中带有参数的 blitz++ 类的 GoogleTest Fixture

返回指针但不允许删除该指针的 C++ 类公共(public)函数?

iphone - 使用 objective-c 获取任何一个月的所有日期