C ++ Curl не может подключиться с помощью файлов Pets LetsEncrypt с использованием SSL_CTX_FUNCTION - PullRequest
0 голосов
/ 19 января 2019

У меня есть сервер, на котором установлен SSL-сертификат от LetsEncrypt. У меня есть следующие файлы, которые в настоящее время помечены как live:

  • cert.pem
  • privkey.pem
  • fullchain.pem
  • chain.pem

Часть моего кода, где я указываю сертификат:

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, *sslctx);

И sslctx-function Я использую:

static CURLcode sslctx(CURL *curl, void *sslctx, void *parm) {
    X509_STORE *store;
    X509 *cert = NULL;
    BIO *bio;
    const char *mypem = // ANY PEM FILE CONTENTS HERE? 
        "-----BEGIN CERTIFICATE-----\n"
        "XXXXXX WHICH PEM FILE? XXXX\n"
        "-----END CERTIFICATE-----";
    bio = BIO_new_mem_buf(mypem, -1);
    PEM_read_bio_X509(bio, &cert, 0, NULL);
    if (cert == NULL) {
        cout << "Failed reading SSL-certificate" << endl;
        Exit(false);
        }
    store = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
    if (X509_STORE_add_cert(store, cert) == 0) {
        cout << "Error adding SSL-certificate" << endl;
        Exit(false);
        }
    X509_free(cert);
    BIO_free(bio);
    return CURLE_OK;
    }

Однако, когда я пытаюсь подключиться к моему серверу через https, curl возвращает мне ошибку: Peer certificate cannot be authenticated with given CA certificates

Я не могу понять, какой сгенерированный LetsEncrypt PEM -файл мне требуется, чтобы убедиться, что я могу проверить одноранговый узел ...

Если я отключу CURLOPT_SSL_VERIFYPEER, запрос будет выполнен успешно, но небезопасно, что неприемлемо для приложения

Дополнительная информация Содержимое от /etc/letsencrypt/options-ssl-apache.conf:

# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

SSLEngine on

# Intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-$
SSLHonorCipherOrder     on
SSLCompression          off

SSLOptions +StrictRequire

# Add vhost name to log entries:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common

#CustomLog /var/log/apache2/access.log vhost_combined
#LogLevel warn
#ErrorLog /var/log/apache2/error.log

# Always ensure Cookies have "Secure" set (JAH 2012/1)
#Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4"

Содержимое /etc/apache2/sites-enabled/{site}-le-ssl.conf содержит:

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/{site}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/{site}/privkey.pem
...