【问题标题】:certificate problems trying to send email with libcurl尝试使用 libcurl 发送电子邮件的证书问题
【发布时间】:2016-10-15 08:06:57
【问题描述】:

这是我的 libcurl 代码。我正在尝试在 linux 中向我自己的电子邮件域发送电子邮件。

这是我的示例 libcurl 代码。

curl_easy_setopt(curl, CURLOPT_USERNAME, "username@mydomain.com");
    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

【问题讨论】:

    标签: email ssl smtp ssl-certificate libcurl


    【解决方案1】:

    您的问题是您的服务器提供了自签名证书,因此 curl 无法验证其出处。您有多种选择:

    • 最好的选择是获取由知名证书颁发机构签署的服务器证书。一些 CA 会颁发您可以免费使用的证书;搜索“免费 ssl 证书”。您需要能够提供一些证明您控制该域的证据。

    • 您可以将自签名证书安装到运行 libcurl 代码的计算机上的受信任 CA 列表中。执行此操作的过程取决于您的操作系统(即使是不同的 Linux 发行版也可能以不同的方式执行此操作)。 This link 是 Linux 的一个不错的起点。

    • 您的程序可以告诉 libcurl 使用自签名证书进行验证。见Adding self-signed SSL certificate for libcurl

    • 您可以create your own certificate authority 并使用前两种方法中的任何一种。与自签名相比,它的优势在于它将签名和签名证书解耦。如果您想更改服务器证书(例如,如果它过期或主机名更改),您不一定需要重新配置所有客户端。

    • 为了完整起见,您可以通过将 CURLOPT_SSL_VERIFYPEER 设置为 0 来禁用验证。但是,强烈建议不要这样做,因为它会使访问不安全。您应该仅出于测试目的执行此操作,或者在极少数情况下保证客户端和服务器之间的网络安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多