Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

openSSL
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16620
Страница 1 от 1

Автор:  TheWizard [ Вто Юни 25, 2019 7:10 pm ]
Заглавие:  openSSL

как да разбера колко байта имам приети?
SSL_pending(...) ми връща постоянно 0 а ги има
като го прескоча чете ама ми трябват колко има налични за четене


Код:
[APP] Connecting: tlstest.paypal.com
[SSL] Socket
[SSL] GetHostByName: tlstest.paypal.com
[SSL] Host IP: 23.223.123.34 : 443
businessCategory=Private Organization/jurisdictionC=US/jurisdictionST=Delaware/s
erialNumber=3014267, C=US, ST=California, L=San Jose, O=PayPal, Inc., OU=CDN Sup
port, CN=tlstest.paypal.com

[APP] Connected
[APP] Sent
GET / HTTP/1.1
Host:tlstest.paypal.com

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 20
Date: Tue, 25 Jun 2019 16:07:16 GMT
Connection: keep-alive

PayPal_Connection_OK

Автор:  miro_atc [ Вто Юни 25, 2019 7:20 pm ]
Заглавие:  Re: openSSL

https://stackoverflow.com/questions/661 ... eturn-zero

Автор:  TheWizard [ Вто Юни 25, 2019 7:32 pm ]
Заглавие:  Re: openSSL

аз минах през много такива постове ( знам че SSL_pending() връща колко остават от текущия read )
аз питам без SSL_read() има ли начин

Автор:  miro_atc [ Вто Юни 25, 2019 7:55 pm ]
Заглавие:  Re: openSSL

във втория отговор обясняваха,че може да видиш хендъла. Но това си зависи от конкретната платформа. Не си казал на какво го ползваш.

Автор:  TheWizard [ Вто Юни 25, 2019 8:01 pm ]
Заглавие:  Re: openSSL

в момента Windows после Linux/Mac... то разлика мноо нема
абе правя ... нема са хилиш ... Windows(в смисъл PC) като Arduino ... ClientSecured библиотеката
то повече за симулации и за обучение - без платка ... реално сорса трябва да работи и на платка ако спазвам "закона"

Автор:  TheWizard [ Вто Юни 25, 2019 8:11 pm ]
Заглавие:  Re: openSSL

ей нящо такова като на шота
Arduino base core
принтва в конзолата и на Ком Портовете
TCP-то е готово, ся са тормозя със SSL-ла .... int ClientSecured::available() сигурно и peek()

компилира до EXE на компа

Прикачени файлове:
0.png
0.png [ 61.49 KiB | Прегледано 7768 пъти ]

Автор:  TheWizard [ Сря Юни 26, 2019 8:45 am ]
Заглавие:  Re: openSSL

"тъпо", но работи :)

Код:
int ClientSecure::peek()
{
    char b;
    return SSL_peek(sslclient.ssl, &b, 1) > 0 ? b : -1;
}

int ClientSecure::available()
{
    char buf[256];
    int rc = SSL_peek(sslclient.ssl, buf, sizeof(buf));
    return (rc > 0) ? rc: 0;
}


Прикачени файлове:
Untitled.png
Untitled.png [ 11.9 KiB | Прегледано 7731 пъти ]

Автор:  TheWizard [ Чет Юни 27, 2019 3:59 pm ]
Заглавие:  Re: openSSL

какво трябва да означава
Код:
[SSL] USE CERTIFICATE
[SSL] USE PRIVATE KEY
[ERROR] SSL_connect()
5492:error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate::0:SSL alert number 42


device_cert и private_key са верни:
openssl s_client -connect akc28iu7dn5ra-ats.iot.us-east-2.amazonaws.com:8883 -cert dev-certificate.pem -key dev-private.pem
казва бла бла... :SSL handshake has read 5400 bytes and written 1619 bytes
Verification: OK

Автор:  miro_atc [ Чет Юни 27, 2019 5:07 pm ]
Заглавие:  Re: openSSL

оpenssl ми е ревал така, когато сертификата не е за целта която искаш. В случая обаче щом от конзола работи значи не е от това.

По-скоро виж дефаулт настройките. Когато го викаш в конзола примерно -certform по дефаулт е РЕМ и затова ти работи без да си го казал. Не е ясно като викаш като библиотека какво подаваш и какво е дефаулт. Виж и за кий формата, докъде да проверява чейна със сертификати и т.н.

Автор:  TheWizard [ Чет Юни 27, 2019 6:38 pm ]
Заглавие:  Re: openSSL

баси - то няма нищо интересно...
връзка до Amazon - CA_LIST не се ползва - само клиент церт и привате, бай дефол чиперите са всички
гърми на хенд-шека (до гугъл и ажур бачка ама те са само с CA)

Код:

int ClientSecure::ssl_begin(const char *host, uint32_t port, int vrf)
{
    int rc;
    if (_connected) // allready
        return -1;
    if (ssl_connect_socket(&client, host, port) < 0)
        return -1;

    client.ctx = SSL_CTX_new(SSLv23_method()); // TLSv1_2_method
    client.ssl = SSL_new(client.ctx);

#if 0 // SSL_trace
    static BIO *outbio = BIO_new_fp(stdout, BIO_NOCLOSE);
    SSL_set_msg_callback(client.ssl, msg_cb);
    SSL_set_msg_callback_arg(client.ssl, outbio);
#endif

    //CA_LIST
    if (client.ca_cert)
    {
        rc = SSL_CTX_load_verify_locations(client.ctx, client.ca_cert, 0);
        if (0 == rc)
        {
            DEBUG_SSL("[ERROR] CA_LIST: %d\n", rc);
            return -1;
        }
        DEBUG_SSL("[SSL] USE CA_LIST\n");
    }

    //CLENT CERTIFICATE
    if (client.certificate)
    {
        if (SSL_CTX_use_certificate_file(client.ctx, client.certificate, SSL_FILETYPE_PEM) <= 0)
        {
            ERR_print_errors_fp(stderr);
            return -1;
        }
        DEBUG_SSL("[SSL] USE CERTIFICATE\n");
    }

    //CLENT PRIVATE KEY
    if (client.private_key)
    {
        if (SSL_CTX_use_PrivateKey_file(client.ctx, client.private_key, SSL_FILETYPE_PEM) <= 0)
        {
            ERR_print_errors_fp(stderr);
            return -1;
        }
        DEBUG_SSL("[SSL] USE PRIVATE KEY\n");
    }

    if (client.private_key)
    {
        if (!SSL_CTX_check_private_key(client.ctx))
        {

            ERR_print_errors_fp(stderr);
            return -1;
        }
        DEBUG_SSL("[SSL] PRIVATE KEY IS OK\n");
    }

    //CIPHERS
    if (client.ciphers)
        SSL_set_cipher_list(client.ssl, client.ciphers);

    //SNI
    if (client.sni_host_name)
        SSL_set_tlsext_host_name(client.ssl, client.sni_host_name);

    //SSL_set_verify(client.ssl, SSL_VERIFY_PEER, NULL);
    //SSL_CTX_set_verify_depth(client.ssl, 1);

    //ATTACH SOCKET
    if (SSL_set_fd(client.ssl, client.sock) <= 0)
    {
        DEBUG_SSL("[ERROR] SSL_set_fd()\n");
        return -1;
    }
    //HANDSHAKE
    if (SSL_connect(client.ssl) <= 0)
    {
        DEBUG_SSL("[ERROR] SSL_connect()\n");
        ERR_print_errors_fp(stderr);
        return -1;
    }

    if (vrf && SSL_get_verify_result(client.ssl) != X509_V_OK)
    {
        ERR_print_errors_fp(stderr);
        return -1;
    }

    //DEBUG_SSL("[SSL] Started\n");
    return 0;
}


Автор:  TheWizard [ Пет Юни 28, 2019 7:38 pm ]
Заглавие:  Re: openSSL

намерих проблема :) ( утре ще оправя гита )
докато зареждам SSL_CTX_use_ .... сертификатите в контекста SSL_CTX *ctx
SSL *ssl не трябва да е създаден...

преместих го след зареждането на цертификатите и са конектна mqtt в Amazon (само с client-cert / client-private-key, без ca_file )
client.ssl = SSL_new(client.ctx);

то май имаше алиас SSL_use_ .... ма утре ще пробвам че ми писна

Автор:  TheWizard [ Пет Юни 28, 2019 7:46 pm ]
Заглавие:  Re: openSSL

воаля :)

Прикачени файлове:
wizio-amazon.png
wizio-amazon.png [ 89.62 KiB | Прегледано 7619 пъти ]

Автор:  TheWizard [ Пет Авг 30, 2019 8:47 pm ]
Заглавие:  Re: openSSL

начи тоя дето е заложил .available() и .peek() в основата на класовете е голям джендер
търся "елегантно" решение как да видя колко байта има приети или пииик на първия приет...
SSL_peek() работи "странно" на WIN работи на LIN не с една "педя" обяснения защо не...
накратко ако няма прието и декодирано функцията блокира и чака :)

супер тъпо я разблокирах ама не ми изглежда добре макар че работи като за Ардуино


Код:
int ClientSecure::available()
{
    if (!_connected)
        return 0;
    char buffer[128];
    int flags = fcntl(client.sock, F_GETFL, 0);
    fcntl(client.sock, F_SETFL, flags | O_NONBLOCK);
    int rc = SSL_peek(client.ssl, buffer, sizeof(buffer));
    fcntl(client.sock, F_SETFL, flags & ~O_NONBLOCK);
    return (rc > 0) ? rc : 0;
}


Идеи?

Автор:  TheWizard [ Съб Авг 31, 2019 6:30 pm ]
Заглавие:  Re: openSSL

намерих си един бъг в сетването на SO_RCVTIMEO и беше голям таймаута
setsockopt(client.sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));

преди сокет connect() таймаута е ~10 sec и след handshake го сменям на 10 mSec
да не "блокират" SSL_read() и SSL_peek()

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/