2016-06-14 14 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

あなたの問題は、サーバーが自己署名証明書を提供しているため、カールがその出所を確認できないということです。あなたは、いくつかのオプションがあります。

  • 最良のオプションは、よく知られた認証局によって署名されたサーバー証明書を取得することです。一部のCAは、無料で使用できる証明書を発行します。 "free ssl certificate"を検索してください。ドメインを制御するといういくつかの証拠を提供できる必要があります。

  • libcurlコードを実行するコンピュータ上の信頼できるCAのリストに、自己署名証明書をインストールできます。これを行う手順は、お使いのOSによって異なります(異なるLinuxディストリビューションでもこれが異なる場合があります)。 This linkは、Linuxにとってまともな出発点です。

  • あなたのプログラムは、libcurlに自己署名証明書で確認するよう伝えることができます。 Adding self-signed SSL certificate for libcurlを参照してください。

  • create your own certificate authorityとすることができ、前の2つの方法のいずれかを使用できます。これを超える自己署名の利点は、署名と署名付き証明書を切り離すことです。サーバー証明書を変更する場合(たとえば、期限が切れた場合やホスト名が変更された場合など)、必ずしもすべてのクライアントを再構成する必要はありません。

  • CURLOPT_SSL_VERIFYPEERを0に設定することで、検証を無効にすることができます。ただし、アクセスが安全でないため、これは避けてください。これは、テスト目的で、またはまれにクライアントとサーバー間のネットワークが安全であることが保証されている場合にのみ行う必要があります。

関連する問題