如何使用内存BIO OpenSSL完成TLS握手

时间:2020-08-01 13:33:27

标签: c++ ssl openssl

我知道这是一个重复的问题:OpenSSL EAP-TLS handshake using BIO。但是似乎没有答案。我还使用BIO_s_mem()来启动TLS(v1.2)连接,这是我用来进行带注释的握手的代码:

void handshake() {
    u_long mode = 1;
    struct fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sfd, &fds);
    ioctlsocket(sfd, FIONBIO, &mode); //Make the socket non-blocking

    int n, s;
    char buf[DEFAULT_BUFFER_SIZE];
    SSL_do_handshake(pSSL); //This gives 2 (SSL_ERROR_WANT_READ) with SSL_get_error 
    do {
        n = BIO_read(wbio, buf, sizeof(buf)); // Copy SSL's generated encrypted
        if (n > 0) queueEncryptedBytes(buf, n);  // ClientHello message
        else if (!BIO_should_retry(wbio)) {
            std::cout << "Initiate handshake failed...\n";
            break;
        }
    } while (n > 0);
    send(sfd, eBuffer, eLen, 0); //Send it to the socket
    eBuffer = (char*) realloc(eBuffer, 0);
    eLen = 0;
    select(0, &fds, NULL, NULL, NULL); //Wait for ServerHello response
    memset(buf, 0, sizeof(buf));
    do {
        n = recv(sfd, buf, sizeof(buf), 0);
        if (n > 0) BIO_write(rbio, buf, n); //Write to the rbio (use SSL_read to later received decrypted message)
    } while (n > 0);
    SSL_do_handshake(pSSL); //I tried to call handshake again but still gives SSL_ERROR_WANT_READ
}

这是ServerHello加密的消息,我认为这表明我的方向是正确的:

201126235959Z0&1$0"Ussl764977.cloudflaressl.com0Y0*åH╬=*åH╬=BU Ç0U 0tp://crt.comodoca4.com/COMODOECCDomainValidationSecureServerCA2.crt+0åhttp://ocsp.comodoca4.com0é
+╓yü⌡ü≥░7~b√Ä╔aä±Ω{7╦V&[≤α≤K≥ATnÅ·t╬ΣÇ)X∙ì<∙ater Manchester10USalford10U
COMODO CA Limited1806U/COMODO ECC Domain Validation Secure Server CA 20Y0*åH╬=*åH╬=B@       ag≡╝âqO▐,o╘╘+v=û0U å0U 0 MODOECCAddTrustCA.crt+0åhttp://ocsp.comodoca4.com0
*åH╬=hater Manchester10USalford10U
281231235959Z0üà10     UGB10Greater Manchester10USalford10U
COMODO CA Limited1+0)U"COMODO ECC Certification A╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╔t░Futhority0v0*åH╬=+ü<╡kÆΓ K╦⌡■T#┬p/ì(╚╘Wⁿ;╩∙      *~╘-Θ]Åß─rîë'XΦ¿sπ@im▓yª¥¿ûy    okÉö▄╤`Véçpp.comodoca.com0
╟║╥

但是我无法继续,因为它仍在阻塞,我需要满足基础的BIO才能继续。任何帮助表示赞赏。

0 个答案:

没有答案