【问题标题】:SSL_write default behaviorSSL_write 默认行为
【发布时间】:2021-08-07 18:50:39
【问题描述】:

目前我正在研究一些基本的 OpenSSL。我对 SSL_write 和 SSL_read 的基本行为感到困惑。在文档中没有清楚地解释数据是如何加密/解密的。我的意思是? SSL_write,一旦设置了 SSL_CTX 并分配了文件描述符,默认情况下加密数据或调用加密函数,还是必须手动完成?我必须明确调用一些加密函数吗? SSL_read 也一样吗?我需要更深入地了解 SSL_write / read 自动执行的操作和不自动执行的操作,或者如果我遇到问题可以回退到的来源。

这是我正在使用的一个示例。

例子:

    SSL *ssl;

    int client = accept(server, (struct sockaddr*)&addr, &len);  /* accept connection as usual */
    printf("Connection: %s:%d\n",inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
    ssl = SSL_new(ctx);              /* get new SSL state with context */
    SSL_set_fd(ssl, client);      /* set connection socket to SSL state */
    Servlet(ssl);         /* service connection */

Servlet 调用

void Servlet(SSL* ssl) 
{
    char buf[1024];
    char reply[1024];
    int sd, bytes;
    const char* HTMLecho="<html><body><pre>%s</pre></body></html>\n\n";

    if ( SSL_accept(ssl) == FAIL )     /* do SSL-protocol accept */
        ERR_print_errors_fp(stderr);
    else
    {
        ShowCerts(ssl);        /* get any certificates */
        bytes = SSL_read(ssl, buf, sizeof(buf)); /* get request */
        if ( bytes > 0 )
        {
            buf[bytes] = 0;
            printf("Client msg: \"%s\"\n", buf);
            sprintf(reply, HTMLecho, buf);   /* construct reply */
            SSL_write(ssl, reply, strlen(reply)); /* send reply */
        }
        else
            ERR_print_errors_fp(stderr);
    }
    sd = SSL_get_fd(ssl);       /* get socket connection */
    SSL_free(ssl);         /* release SSL state */
    close(sd);          /* close connection */
}

【问题讨论】:

    标签: ssl encryption openssl


    【解决方案1】:

    我是否必须显式调用一些加密函数,SSL_read 是否也是如此?

    没有。加密在SSL_write 中自动处理,SSL_read 中的解密也是如此。两者都使用 SSL 结构,该结构在 TLS 握手完成后包含必要的加密密钥。

    ...如果我遇到问题可以求助的来源

    这取决于您遇到的问题。 SSL_read 和 SSL_write 都有文档。也有很容易找到的例子。能够使用搜索引擎也有助于找到更多信息。如果事情没有按预期工作,StackOverflow 是一个寻求帮助的好地方。

    【讨论】:

    • 好的,明白了,基本上一切都归结为使用适当的键以正确的方式设置 SSL 上下文,它应该可以工作。
    • @MarkoBencik:是的,使用证书和私钥设置上下文。 OpenSSL 库透明地处理身份验证、密钥交换和加密。
    猜你喜欢
    • 2019-07-29
    • 2017-05-03
    • 2014-10-03
    • 1970-01-01
    • 2021-09-11
    • 2017-04-05
    • 2015-05-28
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多