Ошибка проверки сертификата TLS - PullRequest
0 голосов
/ 15 апреля 2020

Мне нужен код, который выполняет двухстороннюю аутентификацию (клиент и сервер аутентифицируют друг друга). Мой сервер является сервером TCP. Я намерен добавить безопасность TLS.

https://github.com/ospaarmann/exdgraph/wiki/TLS-client-authentication Я создал клиент и сервер, сертификаты CA и файлы ключей, используя приведенную выше ссылку.

Код на стороне сервера:

    {
    SSL_CTX_set_options(
            ret, 
            SSL_OP_NO_SSLv2 | 
            SSL_OP_NO_SSLv3 |
            SSL_OP_NO_COMPRESSION
        );

        SSL_CTX_set_verify(
            ret, 
            SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
            NULL
        );


        if (SSL_CTX_load_verify_locations(ret, NULL, "/home/ml5/tls_bio/MyRootCA.pem") == 0) {
                    fprintf(stderr, "Failed to load root certificates\n");
                    SSL_CTX_free(ret);
                    return NULL;
            }

        /*
         * We won't set any verification settings this time. Instead
         * we need to give OpenSSL our certificate and private key.
         */
        if (SSL_CTX_use_certificate_chain_file(ret, "MyServer.pem") != 1) {
            ssl_perror("SSL_CTX_use_certificate_file");
            SSL_CTX_free(ret);
            return NULL;
        }

        if (SSL_CTX_use_PrivateKey_file(ret, "MyServer.key", SSL_FILETYPE_PEM) != 1) {
            ssl_perror("SSL_CTX_use_PrivateKey_file");
            SSL_CTX_free(ret);
            return NULL;
        }

        printf("Loaded root certificates\n");
        /*
         * Check that the certificate (public key) and private key match.
         */
        if (SSL_CTX_check_private_key(ret) != 1) {
            fprintf(stderr, "certificate and private key do not match!\n");
            SSL_CTX_free(ret);
            return NULL;
        }
    }

код на стороне клиента: =================================================== =========================

SSL_CTX *ret;

/* create a new SSL context */
ret = SSL_CTX_new(SSLv23_client_method( ));

if (ret == NULL) {
    fprintf(stderr, "SSL_CTX_new failed!\n");
    return NULL;
}

/* 
 * set our desired options 
 *
 * We don't want to talk to old SSLv2 or SSLv3 servers because
 * these protocols have security issues that could lead to the
 * connection being compromised. 
 *
 * Return value is the new set of options after adding these 
 * (we don't care).
 */
SSL_CTX_set_options(
    ret, 
    SSL_OP_NO_SSLv2 | 
    SSL_OP_NO_SSLv3 |
    SSL_OP_NO_COMPRESSION
);

/*
 * set up certificate verification
 *
 * We want the verification to fail if the peer doesn't 
 * offer any certificate. Otherwise it's easy to impersonate
 * a legitimate server just by offering no certificate.
 *
 * No error checking, not because I'm being sloppy, but because
 * these functions don't return error information.
 */
SSL_CTX_set_verify(
    ret, 
    SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
    NULL
);
SSL_CTX_set_verify_depth(ret, 4);

/*
 * Point our context at the root certificates.
 * This may vary depending on your system.
 */
if (SSL_CTX_load_verify_locations(ret, NULL, "/home/ml5/tls_bio_l1/MyRootCA.pem") == 0) {
    fprintf(stderr, "Failed to load root certificates\n");
    SSL_CTX_free(ret);  
    return NULL;
}

/*
 * We won't set any verification settings this time. Instead
 * we need to give OpenSSL our certificate and private key.
 */
if (SSL_CTX_use_certificate_chain_file(ret, "MyClient.pem") != 1) {
    SSL_CTX_free(ret);
    return NULL;
}

if (SSL_CTX_use_PrivateKey_file(ret, "MyClient.key", SSL_FILETYPE_PEM) != 1) {
    SSL_CTX_free(ret);
    return NULL;
}

printf("Loaded root certificates\n");
/*
 * Check that the certificate (public key) and private key match.
 */
if (SSL_CTX_check_private_key(ret) != 1) {
    fprintf(stderr, "certificate and private key do not match!\n");
    SSL_CTX_free(ret);
    return NULL;
}

Я не уверен, что не так из-за чего, когда я запускаю сервер и клиент, я получаю ошибку, как показано ниже на стороне клиента: ошибка BIO_do_connect: ошибка: 14090086: процедуры SSL: SSL3_GET_SERVER_CERTIFICATE: ошибка проверки сертификата

Если у меня есть собственный обратный вызов проверки на клиенте и сервере, конечно, 2- способ аутентификации успешен Будем весьма благодарны за любую помощь в решении этой проблемы, показанной выше.

1 Ответ

0 голосов
/ 16 апреля 2020

Только для тех, кто приходит сюда. Проблема была связана с тем, как я генерировал сертификат CA, сертификаты клиент / сервер. Как только я их исправил, все заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...