2017-07-24 104 views
0

我正在使用C中的curl庫通過HTTPS編寫文件上傳。 服務器端使用ulfius框架運行小型Web應用程序。通過HTTPS使用libcurl進行文件上傳C

我的代碼看起來是這樣的(短路):

CURL *curl; 
CURLcode res; 
void * buffer = NULL; 
long length; 
FILE *fd; 

fd = fopen(filePath, "rb"); 
if (fd) { 
    fseek(fd, 0, SEEK_END); 
    length = ftell(fd); 
    fseek(fd, 0, SEEK_SET); 
    buffer = malloc(length * sizeof (void)); 
    if (buffer) { 
     fread(buffer, 1, length, fd); 
    } 
    fclose(fd); 
} 

curl = curl_easy_init(); 
if (curl) { 
    struct curl_slist *chunk = NULL; 
    chunk = curl_slist_append(chunk, "Accept: */*"); 
    chunk = curl_slist_append(chunk, "X-IsReplication: 1"); 

    curl_easy_setopt(curl, CURLOPT_URL, "https://192.168.1.6:8080/upload/test.txt/"); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, length); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer); 

    res = curl_easy_perform(curl); 
    if (res != CURLE_OK) { 
    fprintf(stderr, "Error: %s\n", curl_easy_strerror(res)); 
    } else { 
    printf("Success!\n"); 
    } 

    curl_easy_cleanup(curl); 
} 

從curl_easy_strerror()的錯誤信息是: 「失敗接收來自所述對等體的數據時」。 如果我使用Wireshark進行捕獲,我會看到一些加密的TCP數據包,但沒有TLS數據包。 「客戶端問候」和「服務器問候」消息也丟失。

讓我們假裝服務器端工作正常,因爲如果我切換到HTTP(服務器+客戶端),一切正常。 我的代碼的捲曲部分中是否存在某些內容? 似乎沒有SSL/TLS握手。

+0

我在服務器端發現了一個錯誤。上面的代碼是正確的。 – Radmor

回答

0

我試過你的代碼和TLS/SSL連接工作正常。請嘗試以下操作:

  • 使用online tool檢查您的服務器TLS/SSL配置。
  • 如果您的服務器正確實現它,然後嘗試強行首選TLS/SSL與下面的代碼行:curl_easy_setopt(CURL *handle, CURLOPT_SSLVERSION, long version);

更多的文檔關於此命令here