Загрузка сертификатов из строковых буферов в цепочку для проверки клиента с использованием OpenSSL - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь использовать проверку подлинности клиента SSL для подключения к удаленной конечной точке IoT AWS.У меня есть три файла:

- CA Root Certificate File
- Certificate File
- Private Key

Соединение с конечной точкой будет успешным, если я использую SSL_CTX_load_verify_locations, SSL_CTX_use_certificate_chain_file и SSL_CTX_use_PrivateKey_file.

    if (!SSL_CTX_load_verify_locations(p_ssl_context_, root_ca_location_.c_str(), NULL)) {
        AWS_LOG_ERROR(OPENSSL_WRAPPER_LOG_TAG, " Root CA Loading error");
        return ResponseCode::NETWORK_SSL_ROOT_CRT_PARSE_ERROR;
    }

    // TODO: streamline error codes for TLS
    if (0 < device_cert_location_.length() && 0 < device_private_key_location_.length()) {
        AWS_LOG_DEBUG(OPENSSL_WRAPPER_LOG_TAG, "Device crt : %s", device_cert_location_.c_str());
        if (!SSL_CTX_use_certificate_chain_file(p_ssl_context_, device_cert_location_.c_str())) {
            AWS_LOG_ERROR(OPENSSL_WRAPPER_LOG_TAG, " Device Certificate Loading error");
            return ResponseCode::NETWORK_SSL_DEVICE_CRT_PARSE_ERROR;
        }
        AWS_LOG_DEBUG(OPENSSL_WRAPPER_LOG_TAG, "Device privkey : %s", device_private_key_location_.c_str());
        if (1 != SSL_CTX_use_PrivateKey_file(p_ssl_context_,
                                             device_private_key_location_.c_str(),
                                             SSL_FILETYPE_PEM)) {
            AWS_LOG_ERROR(OPENSSL_WRAPPER_LOG_TAG, " Device Private Key Loading error");
            return ResponseCode::NETWORK_SSL_KEY_PARSE_ERROR;
        }
    }
    certificates_read_flag_ = true;

Однако вызов не работает, если я создаюцепочка вручную путем добавления сертификатов с использованием строковых буферов.Возвращенная ошибка: «Неизвестное произошло в ожидании завершения квитирования TLS.».

    X509_STORE* store = SSL_CTX_get_cert_store(p_ssl_context_);
    X509 *rootCACertificate, *deviceCertificate;
    RSA *privateKey;
    BIO *bio;

    std::string rootCACertificateBuffer;
    std::string deviceCertificateBuffer;
    std::string privateKeyBuffer;

    rootCACertificateBuffer = 
    "-----BEGIN CERTIFICATE-----\n"

    "-----END CERTIFICATE-----\n";

    deviceCertificateBuffer = 
    "-----BEGIN CERTIFICATE-----\n"

    "-----END CERTIFICATE-----\n";

    privateKeyBuffer = 
    "-----BEGIN RSA PRIVATE KEY-----\n"

    "-----END RSA PRIVATE KEY-----\n";

    bio = BIO_new(BIO_s_mem());
    BIO_puts(bio, rootCACertificateBuffer.c_str());
    rootCACertificate = PEM_read_bio_X509(bio, NULL, 0, NULL);
    X509_STORE_add_cert(store, rootCACertificate);
    BIO_free(bio);

    bio = BIO_new(BIO_s_mem());
    BIO_puts(bio, deviceCertificateBuffer.c_str());
    deviceCertificate = PEM_read_bio_X509(bio, NULL, 0, NULL);
    X509_STORE_add_cert(store, deviceCertificate);
    BIO_free(bio);

    bio = BIO_new(BIO_s_mem());
    BIO_puts(bio, privateKeyBuffer.c_str());
    privateKey = PEM_read_bio_RSAPrivateKey(bio, NULL, 0, NULL);
    SSL_CTX_use_RSAPrivateKey(p_ssl_context_, privateKey);
    BIO_free(bio);

    SSL_CTX_build_cert_chain(p_ssl_context_,SSL_BUILD_CHAIN_FLAG_CHECK );

    certificates_read_flag_ = true;
...