libcurl with client certificate,i get an error "Unable to load client key -8178. * NSS error -8178" - libcurl

when i run this code ,i got error info :
About to connect() to 10.12.190.155 port 443 (#0)
Trying 10.12.190.155... * connected
Connected to 10.12.190.155 (10.12.190.155) port 443 (#0)
Initializing NSS with certpath: sql:/etc/pki/nssdb
CAfile: /home/wh/work/sslkey/ca.crt
CApath: none
Unable to load client key -8178.
NSS error -8178
Closing connection #0
Problem with the local SSL certificate
CURL *curl;
CURLcode res;
//static const char *pClientCert = "/home/wh/work/sslkey/user1.pem";
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, "https://10.12.190.155/");
curl_easy_setopt(curl, CURLOPT_CAINFO, "/home/wh/work/sslkey/ca.crt");
curl_easy_setopt(curl,CURLOPT_SSLCERT,"/home/wh/work/sslkey/user1.pem");
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
curl_global_cleanup();

There is no curl_easy_setopt(curl, CURLOPT_SSLKEY, "key_file_path"); in your code to get your key. Also it is unclear your user1.pem contains both the key and cert or not?
If the answer is no, you need to provide the key.pem file using the above command. If you convert your key from .p12 file then check for this issue as well.
Read this to write the code correctly.

Related

Ignore curl response body in c++

I am doing a post request using CURL in c++ and I wanted to know if theres a way to ignore the response body that gets printed to the output. This is what my code looks like currently
if (curl) {
// Set url
curl_easy_setopt(curl, CURLOPT_URL, str_url);
// Set header
list = curl_slist_append(list, header);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
// Set request type and data
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(body));
res = curl_easy_perform(curl);
everything works but I keep getting the response body posted to the output and I just want to ignore it since all I need is the response code. With the command line I can make a curl request with the following curl --silent --output to ignore it but is there a way to do this in c++?

POST request fails while using libcurl, C++

TEST(ApiTest, TestPostMethod) {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
std::string url = "https://postman-echo.com/post";
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
struct curl_slist *headers = NULL;
// curl_slist_append(headers, "HOST: postman-echo.com");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
ASSERT_EQ(CURLE_OK, res);
}
}
Error: CURLE_COULDNT_RESOLVE_HOST (6)
When I tested this POST request on postman it worked as expected. Also curl command
curl --location --request POST 'https://postman-echo.com/post'
works fine.
Expected equality of these values:
CURLE_OK
Which is: 0
res
Which is: 6
Run NSLOOKUP as suggested by #Andreas Wenzel
> postman-echo.com
Server: 75.75.75.75
Address: 75.75.75.75#53
Non-authoritative answer:
Name: postman-echo.com
Address: 3.210.84.203
Name: postman-echo.com
Address: 52.22.211.29
https://github.com/alexzk1/ed_highway/blob/master/utils/restclient.cpp
this works for many sites last 3-4 years. you can pick those 2 files only.
It uses CURLOPT_POSTFIELDS for post.
Btw, in your code u're following redirects, are u sure website don't redirect you to non-existing link?
Sorry. I figured this out. My server on which I was run this has restrictions in connecting with outside world. Thanks everyone for looking into this.

cURL 404 behind proxy

Just a simple file download test. Not working. Probaby because of the proxy at a Company. How can I configure the proxy?
Before adding "127.0.0.1:8080" I always got error 7: Could not connect to server. Now I always get return code 0, but the test file json.txt contains only a 404. But the url is obviously working in my browser. I also tried to get proxy settings from system via this, but I failed.
HTTP/1.1 404 Not Found
Connection: Keep-Alive
Server: Embedthis-http
ETag: "0-0-56d6b6ea"
Cache-Control: no-cache
Last-Modified: Wed, 02 Mar 2016 09:48:26 GMT
Date: Fri, 19 May 2017 14:33:57 GMT
Content-Length: 167
Keep-Alive: timeout=60, max=199
<!DOCTYPE html>
<html><head><title>Not Found</title></head>
<body>
<h2>Access Error: 404 -- Not Found</h2>
<pre>Cannot locate document: /</pre>
</body>
</html>
Here is my cURL attempt:
CURL *curl;
FILE *fp;
char url[] = "http://www.carqueryapi.com/api/0.3/?callback=?&cmd=getMakes&year=2010&sold_in_us=1";
char outfilename[FILENAME_MAX] = "C:\\temp\\json.txt";
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, url );
curl_easy_setopt(curl, CURLOPT_NOBODY, true);
curl_easy_setopt(curl, CURLOPT_HEADER, true);
curl_easy_setopt(curl, CURLOPT_HTTPGET, true);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1 );
curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:8080" );
res = curl_easy_perform(curl);
cout << "Curl response code " << res << ": " << curl_easy_strerror( res ) << endl;
curl_easy_cleanup(curl);
fclose(fp);
}
UPDATE
The internet settings are configured to use the wpad.dat file to detect proxies. If I enter one of those, I get a response from the server, but it says the access is denied because the website is blocked. But my browser can display this site.
On the contrary, if I enter netsh.exe winhttp show proxy it says that the current winhttp proxy settings are "direct access (no proxy server)".
UPDATE 2
I finally got it working with those options: Used Verbose to get more helpful output; output showed some auth method like negotiate and ntlm; the ntlm option did not work but the negotiateone together with the userpwd : which takes the credentials from the system, if libcurl has the sspi module.
curl_easy_setopt(curl, CURLOPT_URL, url );
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1 );
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1 );
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY );
curl_easy_setopt(curl, CURLOPT_PROXY, <"host:port"> );
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NEGOTIATE );
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, ":" );
Try user agent and define header.
#define HEADER_ACCEPT "Accept:text/html,application/xhtml+xml,application/xml"
#define HEADER_USER_AGENT "User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17"
struct curl_slist *list = NULL;
list = curl_slist_append(list, HEADER_USER_AGENT);
list = curl_slist_append(list, HEADER_ACCEPT);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
You may need a real proxy, find a proxy sites, and retry with another ip

Send Custom String with cURL in Qt C++

i use the cURL Library for send and login users to my application and server and use POST method in cURL. but i want to send custom and get input from user and send to the server and response but seem's error. my source below (the username and password is defined string):
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "Username=" + username + "&Password=" + password);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
But this do not work. Only agree with this sample pattern:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "Username=sina&Password=12781278");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

How to resolve internal error - server connection terminated while posting content to URL

I am trying to POST content to URL using CURL.
My code snippet is as follows
curl_easy_setopt(curl_handle, CURLOPT_PROXY, "proxy.xyz.com:8080");
curl_easy_setopt(curl_handle, CURLOPT_PROXYUSERPWD, "uname:password");
curl_easy_setopt(curl_handle,CURLOPT_POSTFIELDS, jsonResult.c_str());
curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl_handle, CURLOPT_URL, "url");
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
/* provide a buffer to store errors in */
curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, error);
res = curl_easy_perform(curl_handle);
if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
printf("unable to send data");
return false;
}
When I run above code snippet,it is always giving internal error - server connection terminated
Can anyon eplease let me know what could be the cause and how to resolve
Thanks in advance
That error message you see is actually in the HTTP response body - probably a response from the proxy given the meaning of it.