98 / 69 / 13
Регистрация: 15.12.2013
Сообщений: 455
1

Не могу найти тип ошибки OpenSSL

16.10.2018, 12:56. Показов 1451. Ответов 6
Метки нет (Все метки)

ЗДравствуйте.
Юзаю asio standalone в связке с OpenSSL.

То есть asio::ssl.

Проблема следующая.
Использую версию TLS 1.2 и пытаюсь приконнектится к серверу с поддержкой только TLS 1.0.

В этом случае вылетает исключение с кодом 336130315.
Путем дебага, выяснил как получается описание ошибки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ssl_category : public asio::error_category
{
public:
  const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT
  {
    return "asio.ssl";
  }
 
  std::string message(int value) const
  {
    const char* s = ::ERR_reason_error_string(value);
    return s ? s : "asio.ssl error";
  }
};
В качестве value передается как раз это число 336130315.
Но мне не удалось найти какую-нибудь константу, описывающую эту ошибку.
Т.к. ненадежно полагаться на это число, необходимо решить проблему.

Кто сталкивался с подобным? В документации ничего найти не удалось. Возможно плохо искал.

Заранее всем спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2018, 12:56
Ответы с готовыми решениями:

Не могу понять, почему программа работает неправильно( Знаю, что где-то ошибки, но не могу найти
{Ввести последовательность натуральных чисел Aj j=1...n (n<=1000). Упорядочить последовательность...

Програма не может найти тип данных, ошибки
Взял исходники программы С#, она также использует язык R для вычисления статистических данных...

Тип запись. не могу найти ошибку
у меня такая проблема...я не могу найти ошибку в своем коде.во время компиляции мне говорят что...

Недопустимый неполный тип, не могу найти ошибку
#include<iostream> #include<locale> #include<string> #include<iomanip> #include<fstream> ...

6
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,967
16.10.2018, 13:11 2
ASCII, Это код ошибки с описанием: "wrong version number".
1
98 / 69 / 13
Регистрация: 15.12.2013
Сообщений: 455
16.10.2018, 13:16  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# define ERR_PACK(l,f,r)         (((((unsigned long)l)&0xffL)*0x1000000)| \
                                ((((unsigned long)f)&0xfffL)*0x1000)| \
                                ((((unsigned long)r)&0xfffL)))
# define ERR_GET_LIB(l)          (int)((((unsigned long)l)>>24L)&0xffL)
# define ERR_GET_FUNC(l)         (int)((((unsigned long)l)>>12L)&0xfffL)
# define ERR_GET_REASON(l)       (int)((l)&0xfffL)
# define ERR_FATAL_ERROR(l)      (int)((l)&ERR_R_FATAL)
 
const char *ERR_reason_error_string(unsigned long e)
{
    ERR_STRING_DATA d, *p = NULL;
    unsigned long l, r;
 
    err_fns_check();
    l = ERR_GET_LIB(e);
    r = ERR_GET_REASON(e);
    d.error = ERR_PACK(l, 0, r);
    p = int_err_get_item(&d);
    if (!p) {
        d.error = ERR_PACK(0, 0, r);
        p = ERRFN(err_get_item) (&d);
    }
    return ((p == NULL) ? NULL : p->string);
}
 
static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *d)
{
    ERR_STRING_DATA *p;
    LHASH_OF(ERR_STRING_DATA) *hash;
 
    err_fns_check();
    hash = ERRFN(err_get) (0);
    if (!hash)
        return NULL;
 
    CRYPTO_r_lock(CRYPTO_LOCK_ERR);
    // сюда прилетает вызов
    p = lh_ERR_STRING_DATA_retrieve(hash, d);
    CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
 
    return p;
}
Далее нашел такую штуку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
static ERR_STRING_DATA SSL_str_functs[] = {
   
    // тут куча структур
    // похоже что надо, но нет!
    {ERR_REASON(SSL_R_WRONG_VERSION_NUMBER), "wrong version number"},
 
 
    {ERR_REASON(SSL_R_X509_LIB), "x509 lib"},
    {ERR_REASON(SSL_R_X509_VERIFICATION_SETUP_PROBLEMS),
     "x509 verification setup problems"},
    {0, NULL}
};
Добавлено через 1 минуту
DrOffset, ну да, но только я не хочу впиливать в код число 336130315, потому что переехав на другую версию OpenSSL, как я могу быть уверен, что оно не изменится?

Поэтому и хочу найти константу из исходников библиотеки, которая описывала бы эту ошибку.
0
765 / 366 / 75
Регистрация: 10.06.2014
Сообщений: 2,408
16.10.2018, 13:18 4
необходимо решить проблему.
А понизить версию клиента не пробовали?
Тогда этой проблемы быть не должно и решать уже будет нечего
1
98 / 69 / 13
Регистрация: 15.12.2013
Сообщений: 455
16.10.2018, 13:20  [ТС] 5
Undisputed, Да это понятно, я сейчас так и делаю.
Проблема в другом.

А именно в том, что я не могу найти константу, описывающую эту ошибку в библиотеке OpenSSL.

Вот как сейчас выглядит код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include "stdafx.h"
#include <Engine/OpenSslConnection.h>
#include <Engine/OpenSslHelpers.h>
#include <Engine/CertificateVerifier.h>
#include <Engine/SslHandshakeErrors.h>
#include <EventLog/LogException.h>
 
using namespace engine;
 
namespace
{
    // TODO: вытащить эту ошибку из asio, этот способ ненадежный
    constexpr int WRONG_TLS_VERSION_NUMBER_ERROR = 336130315;
}
 
OpenSslConnection::OpenSslConnection() :
    _tlsSocket(vpn2::ssl::context()),
    _useCrl(false),
    _crlWorkAfterNextUpdateDays(0),
    _needCheckServerCertFingerprint(false)
{
}
 
void OpenSslConnection::connect()
{
    performConnection();
}
 
void OpenSslConnection::anonymousConnect()
{
    performConnection(ConnectionTypeOnlyAnonymous);
}
 
void OpenSslConnection::connectWithClientCertificate(const CertInfo& certInfo)
{
    connectWithClientCertificate(findCertificate(certInfo));
}
 
void OpenSslConnection::connectWithClientCertificate(const std::shared_ptr<crypt::Certificate>& clientCertificate)
{
    if (!clientCertificate)
    {
        throw RUNTIME_ERROR("Передан несуществующий сертификат");
    }
 
    performConnection(ConnectionTypeCanUseCertificateIfNeeded, clientCertificate);
}
 
void OpenSslConnection::setCrlWorkAfterNextUpdateDays(uint32_t days)
{
    _crlWorkAfterNextUpdateDays = days;
}
 
void OpenSslConnection::setCheckServerCertFingerprint(bool value)
{
    _needCheckServerCertFingerprint = value;
}
 
void OpenSslConnection::setUseCrl(bool value)
{
    _useCrl = value;
}
 
size_t OpenSslConnection::write(const uint8_t* data, size_t size)
{
    return _tlsSocket.write(data, size);
}
 
size_t OpenSslConnection::readSome(uint8_t* data, size_t size)
{
    return _tlsSocket.readSome(data, size);
}
 
size_t OpenSslConnection::read(uint8_t* data, size_t size)
{
    return _tlsSocket.read(data, size);
}
 
void OpenSslConnection::performConnection(ConnectionType connectionType, const std::shared_ptr<crypt::Certificate>& clientCertificate)
{
    std::shared_ptr<crypt::Certificate> serverCertificate;
 
    initializeTlsSocketBeforeConnection(asio::ssl::context_base::tlsv12,
        clientCertificate, serverCertificate, connectionType);
 
    do
    {
        try
        {
            _tlsSocket.handshake();
            saveClientSideCertificate(clientCertificate);
 
            AbstractSslConnection::compareCertificatesSignatures(serverCertificate, clientCertificate);
 
            setConnectionEstablished(true);
            break;
        }
        catch (const std::system_error& systemError)
        {
            LOG_INFO << systemError.code().message();
 
            _tlsSocket.breakTcpConnection();
 
            if (systemError.code().category() == std::system_category() &&
                systemError.code().value() == WRONG_TLS_VERSION_NUMBER_ERROR)
            {
                initializeTlsSocketBeforeConnection(asio::ssl::context_base::tlsv1,
                    clientCertificate, serverCertificate, connectionType);
            }
            else
            {
                throw;
            }
        }
    }
    while (!isConnectionEstablished());
}
 
void OpenSslConnection::initializeTlsSocketBeforeConnection(asio::ssl::context_base::method method,
    const std::shared_ptr<crypt::Certificate>& clientCertificate,
    std::shared_ptr<crypt::Certificate>& serverCertificate,
    ConnectionType connectionType)
{
    // TODO: эта функция должна быть разбита на части.
    // Слишком вариативное у нее поведение в зависимости от входных параметров. Дурной тон.
    // Тяжело читать такой код.
 
    tcpClient().connectToHost(hostForTcpConnect(), remotePort());
 
    _tlsSocket = vpn2::TlsSocket(std::move(tcpClient().handle()), std::move(OpenSslHelpers::createContext(method, clientCertificate)));
 
    _tlsSocket.setTlsExtHostName(hostForHandshake());
 
    if (isVerifyServerCertificate())
    {
        _tlsSocket.setVerifyCallback(OpenSslHelpers::makeVerificationCallback(_useCrl,
            _needCheckServerCertFingerprint, _crlWorkAfterNextUpdateDays, serverCertificate));
    }
    else
    {
        _tlsSocket.setVerifyMode(asio::ssl::verify_none);
    }
 
    _tlsSocket.setCipherList("HIGH");
 
    if (!clientCertificate && connectionType == ConnectionTypeCanUseCertificateIfNeeded)
    {
        OpenSslHelpers::ClientCertificateProvider::setConnectionObject(this);
 
        SSL_CTX_set_client_cert_cb(_tlsSocket.nativeContext(),
            &OpenSslHelpers::ClientCertificateProvider::clientCertificateRequestCallback);
    }
}
0
765 / 366 / 75
Регистрация: 10.06.2014
Сообщений: 2,408
16.10.2018, 13:27 6
Лучший ответ Сообщение было отмечено ASCII как решение

Решение

ASCII,
Буст походу используют не собственные коды ошибок
https://stackoverflow.com/ques... error-code
0
98 / 69 / 13
Регистрация: 15.12.2013
Сообщений: 455
16.10.2018, 13:35  [ТС] 7
Все, разобрался.

Проверять надо так:

C++
1
2
3
4
5
6
// systemError - это исключение типа std::system_error
 
if(ERR_GET_REASON(systemError.code().value()) == SSL_R_WRONG_VERSION_NUMBER)
{
// wrong version number
}
Спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2018, 13:35
Помогаю со студенческими работами здесь

не могу ошибки найти
Рассчитайте величину функции y=f(x) для десяти значений x с шагом h и различными значениями а для...

Не могу найти ошибки
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int _tmain(int argc, _TCHAR*...

Не могу найти ошибки
Не очень понимаю,где ошибки Задача: Имеются два кувшина вместимостью 8 и 5 л, и необходимо...

Не могу найти ошибки
Не знаю в чём дело, я не могу найти или компилятор, что-то иное имеет введу, но на код:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru