android - 在android中为cCURL添加ssl证书有错误

标签 android c++ curl android-ndk openssl

我在这个链接的帮助下为 android 交叉构建了 curl 和 openssl Using cURL in Android .. 我能够成功构建。现在我正在尝试运行我的应用程序,在我的应用程序中我需要添加我自己的证书,当我尝试添加通过我的 native 代码存储在 sdcard 中的证书 时,我得到以下信息来自 curl 的错误响应,即 CURLE_SSL_CERTPROBLEM (58)=> 本地客户端证书问题。如果删除我下面的应用程序中的所有证书,并且如果我使用没有证书的简单 https curl 客户端,则会收到以下错误 CURLE_SSL_CACERT_BADFILE (77)。

我在这里放了我的代码,我只是想从 sdcard 中读取证书(我已经复制并粘贴到 sdcard 中)。

我是否正确加载了证书?

//将从Java接收网页的接口(interface)函数

  {
  pageInfo_t page;
  CURL *curl;
  CURLcode res;
   char *buffer;

 static const char *pCertFile = "/mnt//sdcard/sslcerts/33330001-root.x509";
 static const char *pCACertFile="/mnt//sdcard/sslcerts/root.x509.crt";
 pKeyName  = "/mnt/sdcard/sslcerts/33330001-root-privkey.der"; 

 const char *pKeyName;
 const char *pKeyType;

const char *pEngine;
const jbyte *webpage;

pKeyType  = "DER";
pEngine   = NULL;

webpage = (*env)->GetStringUTFChars(env, webpageJStr, NULL);
if (webpage == NULL) {
  return NULL; /* OutOfMemoryError already thrown */
}

page.data = (char *)malloc(16 * 1024);
page.len = 0;
if (page.data)
 memset(page.data, 32, 16 * 1024);

buffer = (char *)malloc(1024);

 curl = curl_easy_init();
 if(curl) {
 curl_easy_setopt(curl, CURLOPT_URL, webpage);
 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData);
 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page);
 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

  curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"DER");

  curl_easy_setopt(curl,CURLOPT_SSLCERT,pCertFile);

  curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,pKeyType);

  curl_easy_setopt(curl,CURLOPT_SSLKEY,pKeyName);

  curl_easy_setopt(curl,CURLOPT_CAINFO,pCACertFile);

 curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,1L);
 res = curl_easy_perform(curl);
    /* always cleanup */
curl_easy_cleanup(curl);
(*env)->ReleaseStringUTFChars(env, webpageJStr, webpage);
if(res == 0) {
  if (buffer) {
    page.data[page.len < 256 ? page.len : 256] = '\0';
sprintf(buffer, "pagedata(%d): %s. done.\n", page.len, page.data);
    return (*env)->NewStringUTF(env, buffer);
  }
}
sprintf(buffer, "Result %d", res);
return (*env)->NewStringUTF(env, buffer);
} else {
  return (*env)->NewStringUTF(env, "Unable to init cURL");
}
} 

最佳答案

你需要添加这一行

#define CURL_CA_BUNDLE "/etc/ssl/certs/ca-certificates.crt"

在构建 libCurl 时添加到 curl_config.h

关于android - 在android中为cCURL添加ssl证书有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12464014/

相关文章:

c++ - 该程序中的 16 位数学是否调用了未定义的行为?

ssl - 使用 Wget 忽略 SSL 证书错误

android - Android 2d Gallery 源代码中未初始化的变量

Android 为谷歌地图上的标记设置监听器

c++ - 当我在结构中包含多个数组时,我的程序跳过了一堆代码

c++ - 使用指定的路径更改目录(路径包括字符串形式的文件名)

php - 如何使用 PHP/cURL 对 Discogs API 的 POST 进行身份验证

ruby - 如何配置 capfile 以使用 curl 与 New Relic 通信?

android - 开发flutter应用程序而无需在我的机器中实际安装flutter

android - 在 PWA 中,虚拟键盘与 html 元素重叠,在移动 chrome 浏览器中则不会