【问题标题】:OpenSSL: Trying to use keying material obtain by handshake to locally encrypt dataOpenSSL:尝试使用通过握手获得的密钥材料本地加密数据
【发布时间】:2011-09-06 15:56:28
【问题描述】:

这是代码:

bool EncoderTLS::handshake()
{
    int sock = getSocket();
    SSL *ssl = SSL_new(ctx);
    BIO *sbio = BIO_new_socket(sock, BIO_NOCLOSE);
    SSL_set_bio(ssl, sbio, sbio);
    int r;
    int i = 0;
    while(i < ATTEMPTS)
    {
        int s;
        if((r = ((isServer) ? SSL_accept(ssl) :SSL_connect(ssl)) )<=0)
        {
            s = SSL_get_error(ssl,r);
            if (SSL_get_error(ssl,r) == SSL_ERROR_SYSCALL)
            {
                if (errno == 0) break;
                printf("errno = %d\n",errno);
                perror("Syscall error");
            }
        }
        if (s == SSL_ERROR_WANT_READ || s == SSL_ERROR_WANT_WRITE) usleep(10);
        else 
        {
            logger->log(Level::WARNING, "SSL handshake failed");
            return false;
        }
        i++;
    }
    if (!isServer && SSL_get_verify_result(ssl) != X509_V_OK) //Server authentication
    {
        logger->log(Level::WARNING, "couldn't verify certificate");
        printf("Error: %s\n", ERR_reason_error_string(ERR_get_error()));
        return false;
    }
    BIO *test = BIO_new(BIO_s_mem());
    SSL_set_bio(ssl, test, test);
    SSL_write(ssl, "blablablablabla", 10);
    char **p;
    int length = BIO_get_mem_data(test,p);
    printf("Printing encoding of 'blablablab', of length %d:\n", length);
    for(int j=0; j<length; j++)
        printf("%c", p[j]);
    printf("\n");
    return true;
}

我希望 SSL_write 在最后写入的数据会进入 BIO 并进入内存。但是,当我尝试从 BIO 中获取数据时,它告诉我它的长度为 0。

我做错了什么?

【问题讨论】:

    标签: c++ ssl openssl


    【解决方案1】:

    检查SSL_write() 返回的内容。也许是SSL_ERROR_WANT_READ,在这种情况下,您必须首先从您的 SSL 连接中读取数据并将读取的数据提供给您的SSL 对象。如果您在第二个 SSL_set_bio() 之前调用它,SSL_read() 将为您完成。

    但是,当您成功使用 SSL_write() 时 - 请注意,它不仅是您的 mem BIO 中的加密数据。协议相关的数据也将在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2013-04-08
      • 2014-01-06
      • 1970-01-01
      相关资源
      最近更新 更多