2016-06-14 83 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来禁用验证。但是,这是非常不鼓励的,因为它会导致访问不安全。您应该仅为测试目的执行此操作,或者在极少数情况下确保客户端和服务器之间的网络安全。