Libcurl 证书固定在 iPhone 上工作但不在 Android 上工作
Libcurl Certificate Pinning working on iPhone but not on Android
这是我在 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
return 成功 readBuffer
包含从服务器发送的响应。
-------------------------------------------- ----------------------
在 Android Studio 中,我的证书 "certificatePinning.der" 存储在资产文件夹中。 (我在使用前复制到data文件夹)
为了使用上面的代码,我将 certificateBeingUsed 设置为我的证书路径:
certificateBeingUsed = "/data/data/packageName/certificatePinning.der"
但是 res
returns CURLE_SSL_CACERT_BADFILE (77)
和 readBuffer
是空的
-------------------------------------------- ----------------------
我在 Android 中遗漏了什么无法验证存储在服务器中的证书??
注意:
- 我在 libCurl 中支持 SSL。
- 在 android 中,如果我将其设置为证书 cacert.pem 它将 return 成功,但我想改用我的证书。
这可能是编码问题,请尝试使用以下方法将您的 .der 文件转换为 .pem 格式:
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
这是我在 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
return 成功 readBuffer
包含从服务器发送的响应。
-------------------------------------------- ----------------------
在 Android Studio 中,我的证书 "certificatePinning.der" 存储在资产文件夹中。 (我在使用前复制到data文件夹)
为了使用上面的代码,我将 certificateBeingUsed 设置为我的证书路径:
certificateBeingUsed = "/data/data/packageName/certificatePinning.der"
但是 res
returns CURLE_SSL_CACERT_BADFILE (77)
和 readBuffer
是空的
-------------------------------------------- ----------------------
我在 Android 中遗漏了什么无法验证存储在服务器中的证书??
注意:
- 我在 libCurl 中支持 SSL。
- 在 android 中,如果我将其设置为证书 cacert.pem 它将 return 成功,但我想改用我的证书。
这可能是编码问题,请尝试使用以下方法将您的 .der 文件转换为 .pem 格式:
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem