1

C++アプリケーションでlibcurl7.26.0を使用して、httpsプロトコルでサーバーと通信しています。正しく動作しますが、約20分後に接続が失敗します:をcurl_easy_perform返しますCURLE_SSL_CACERT_BADFILEcurl_easy_cleanupセッションを作成してから、同じ方法で正常に初期化curl_easy_performしますが、同じエラーで失敗します。アプリケーションの再起動のみが役立ちます。* .pemファイルがファイルシステムに存在し、アプリケーションのアクセス許可が実行中に変更されていないことを確認しました。

libcurl 7.26.0、Windows 7 x86、MSVC2005を使用しています。

どんな助けでも大歓迎です。

UPD:問題はリリースモードのみを再現します。

4

2 に答える 2

1
if (curl)
{
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
    curl_easy_setopt(curl, CURLOPT_CAINFO, certificate_file_path);
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curlErrorBuffer);
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_easy_setopt(curl, CURLOPT_URL, "https://ap....");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
    
    struct curl_slist* headers = NULL;
    headers = curl_slist_append(headers, "Content-Type: application/json");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ss.str().c_str());
    
    ...
}

私は次のことを試しました:

curl-ca-bundle.crt
curl-ca-bundle-my-site.crt
curl-ca-bundle.pem
curl-ca-bundle-my-site.pem

ca-mysite.crt
ca-mysite.pem

しかし:CURLE_SSL_CACERT_BADFILE .. ..

パス:/Users/user/Documents/Test test / CA / ca-any-version.pem / crt

于 2021-03-14T10:42:08.367 に答える
0

cURLロギングを使用しています。これは次のようにオンになり curl_easy_setopt(m_curl_session, CURLOPT_DEBUGFUNCTION, curl_debug_trace) ます。関数の最初にcurl_debug_traceログファイルが開かれfopen、最後に。を使用して閉じられfcloseます。いくつかの理由でリリースモードでは、ファイルを閉じず、開いているファイルの制限までプロセスが実行され、cacertファイルを開くことができません。

解決策は、ログファイルを一度開いて、プログラムが実行されるまで開いたままにすることです。

于 2012-10-11T16:47:50.440 に答える