【问题标题】:Libcurl Certificate Pinning working on iPhone but not on AndroidLibcurl 证书固定在 iPhone 上工作,但在 Android 上不工作
【发布时间】:2015-10-06 06:28:52
【问题描述】:

这是我在 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,它将返回成功,但我想改用我的证书。

【问题讨论】:

  • 我不知道 cURL,但是在 OWASP 的Certificate and Public Key Pinning 上有一些固定的例子。它们提供了适用于 Android、OpenSSL 和 .Net 的示例。但是,没有 cURL。
  • libcurl 为 iOS 和 Android 提供了什么版本?
  • 安卓:libcurl/7.43.0-DEV OpenSSL/1.0.1o zlib/1.2.8
  • iPhone:libcurl/7.40.0 SecureTransport zlib/1.2.5
  • 从问题中,不清楚您是否添加了代码以将 certificatePinning.der 文件从您的应用资产复制到数据文件夹,以便可以使用“/data/data/ packageName”您正在使用的路径。似乎你有(因为你提到如果你使用 cacert.pem 文件它可以工作)但以防万一你没有,这是一种方法:stackoverflow.com/a/16984117/1023092

标签: android c++ iphone openssl libcurl


【解决方案1】:

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

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

【讨论】:

  • 是的,我也试过了。它给了我错误号 60 --- CURLE_SSL_CACERT, /* 60 - CA 证书问题(路径?)*/
猜你喜欢
  • 2019-02-24
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多