2016-06-14 102 views
2

這是我的libcurl代碼。我正在嘗試在Linux中將電子郵件發送到我自己的電子郵件域。嘗試使用libcurl發送電子郵件的證書問題

這是我的示例libcurl代碼。

curl_easy_setopt(curl, CURLOPT_USERNAME, "[email protected]"); 
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword"); 
    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.mydomain.com:25"); 
    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); 
    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); 
    recipients = curl_slist_append(recipients, TO); 
    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); 
    curl_easy_setopt(curl, CURLOPT_INFILESIZE, file_size); 
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, fileBuf_source); 
    curl_easy_setopt(curl, CURLOPT_READDATA, &file_upload_ctx); 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); 
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); //Dont display Curl Connection data Change 1L to 0 

    res = curl_easy_perform(curl); 

當我運行此代碼時,出現以下錯誤。

* Rebuilt URL to: smtp://mail.mydomain.com:25/ 
* Hostname was NOT found in DNS cache 
* Trying <My mail domain Ip address>... 
* Connected to mail.mydomain.com (<My mail domain Ip address>) port 25 (#0) 
< 220 mail.mydomain.com ESMTP 
> EHLO client6 
< 250-mail.mydomain.com 
< 250-PIPELINING 
< 250-SIZE 20480000 
< 250-VRFY 
< 250-ETRN 
< 250-STARTTLS 
< 250-AUTH PLAIN LOGIN 
< 250-ENHANCEDSTATUSCODES 
< 250-8BITMIME 
< 250 DSN 
> STARTTLS 
< 220 2.0.0 Ready to start TLS 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* SSL certificate problem: self signed certificate 
* Closing connection 0 
curl_easy_perform() failed: Peer certificate cannot be authenticated with given CA certificates 

回答

3

您的問題是您的服務器提供自簽名證書,因此curl無法驗證其出處。你有幾種選擇:

  • 最好的選擇是獲得由知名證書頒發機構簽署的服務器證書。有些CA會頒發您可以免費使用的證書;搜索「免費ssl證書」。您需要能夠提供一些證據來控制域名。

  • 您可以將自簽證書安裝到運行libcurl代碼的計算機上的可信CA列表中。執行此操作的過程取決於您的操作系統(甚至不同的Linux發行版可能會有所不同)。對於Linux來說,This link是一個體面的起點。

  • 您的程序可以告訴libcurl使用自簽名證書進行驗證。見Adding self-signed SSL certificate for libcurl。您可以使用create your own certificate authority並使用前兩種方法之一。這比自簽名的好處是它將簽名和簽名證書分開。如果要更改服務器證書(例如,如果它到期或主機名稱更改),則不一定需要重新配置所有客戶端。

  • 爲了完整起見,您可以通過將CURLOPT_SSL_VERIFYPEER設置爲0來禁用驗證。但是,這是非常不鼓勵的,因爲它會導致訪問不安全。您應該僅爲測試目的執行此操作,或者在極少數情況下確保客戶端和服務器之間的網絡安全。