使用 libcurl 的 CA 证书身份验证
CA certificate authentication using libcurl
我在获取证书以使用 libcurl 时遇到问题。
C++代码:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
// const char* szURL = "https://www.google.se/";
const char* szURL = "https://api-sandbox.oanda.com/";
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, szURL);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_setopt(curl, CURLOPT_CAINFO, "./ca.crt");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
文件 ca.crt 与我的示例程序放在同一文件夹中,文件如下所示:
-----开始证书-----
/* 大量的字符和数字 */
-----证书结束-----
我检索到的那个文件的内容:
openssl s_client -connect api-sandbox.oanda.com:443 > logfile
然后我复制粘贴了 ----BEGIN CERTIFICATE----- ..... ----END CERTIFICATE-----
部分放入一个空文件并将其另存为 ca.crt.
程序打印:
curl_easy_perform() failed: Peer certificate cannot be authenticated with given CA certificates
我在 Windows 8 上使用 MinGW 64 位(g++ 编译器)。
我错过了什么?
我已经能够通过使用 ca-bundle 向 https://www.google.se/ 发出请求,该 ca-bundle 是由 libcurl-development 包附带的 VB-script 生成的。显然,这是一个脚本
Script to fetch certdata.txt from Mozilla.org site and create a
'* ca-bundle.crt for use with OpenSSL / libcurl / libcurl bindings
感谢您的指点。
我解决了。
我下载了这个文件:https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
该文件似乎包含来自 Thawte Server CA 的证书。
当运行我们可以看到openssl命令:
i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
这暗示了 Thawte。我上面post编辑的代码确实是正确的,看来证书不正确。我不知道为什么会这样(任何了解 openssl 工具的人:随时 post 回答这个问题)。
我在获取证书以使用 libcurl 时遇到问题。
C++代码:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
// const char* szURL = "https://www.google.se/";
const char* szURL = "https://api-sandbox.oanda.com/";
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, szURL);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_setopt(curl, CURLOPT_CAINFO, "./ca.crt");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
文件 ca.crt 与我的示例程序放在同一文件夹中,文件如下所示:
-----开始证书----- /* 大量的字符和数字 */ -----证书结束-----
我检索到的那个文件的内容:
openssl s_client -connect api-sandbox.oanda.com:443 > logfile
然后我复制粘贴了 ----BEGIN CERTIFICATE----- ..... ----END CERTIFICATE----- 部分放入一个空文件并将其另存为 ca.crt.
程序打印:
curl_easy_perform() failed: Peer certificate cannot be authenticated with given CA certificates
我在 Windows 8 上使用 MinGW 64 位(g++ 编译器)。 我错过了什么?
我已经能够通过使用 ca-bundle 向 https://www.google.se/ 发出请求,该 ca-bundle 是由 libcurl-development 包附带的 VB-script 生成的。显然,这是一个脚本
Script to fetch certdata.txt from Mozilla.org site and create a '* ca-bundle.crt for use with OpenSSL / libcurl / libcurl bindings
感谢您的指点。
我解决了。 我下载了这个文件:https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
该文件似乎包含来自 Thawte Server CA 的证书。 当运行我们可以看到openssl命令:
i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
这暗示了 Thawte。我上面post编辑的代码确实是正确的,看来证书不正确。我不知道为什么会这样(任何了解 openssl 工具的人:随时 post 回答这个问题)。