具有错误的Cpp OpenSSL服务器的源

时间:2012-04-02 03:08:11

标签: c++ ssl tcp openssl

我对OpenSSL和Cpp的一些源代码有疑问。由于某种原因它运行正常,但没有打开套接字!当我尝试使用s_client连接到它时,我得到“连接:没有错误”。当我运行netstat时,我没有打开端口。它应该在12120上打开一个端口。我甚至暂时禁用了我的防火墙,它没有帮助!BTW我正在使用Windows 7.感谢您的考虑!我的程序只是说每一件事都很好,它会在第二个开始阻塞* BIO_do_accept(abio); *

#include "stdio.h"
#include "string.h"

#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"

int password_callback(char *buf, int size, int rwflag, void *userdata)
{
    /* For the purposes of this demonstration, the password is "dw" */

    printf("*** Callback function called\n");
    strcpy(buf, "dw");
    return 1;
}

int main()
{
    SSL_CTX *ctx;
    SSL *ssl;
    BIO *bio, *abio, *out, *sbio;

    int (*callback)(char *, int, int, void *) = &password_callback;

    printf("Secure Programming with the OpenSSL API, Part 4:\n");
    printf("Serving it up in a secure manner\n\n");

    SSL_load_error_strings();
    ERR_load_BIO_strings();
    SSL_library_init();
    ERR_load_SSL_strings();
    OpenSSL_add_all_algorithms();

    printf("Attempting to create SSL context... ");
    ctx = SSL_CTX_new( SSLv23_server_method() );
    if(ctx == NULL)
    {
        printf("Failed. Aborting.\n");
        return 0;
    }

    printf("\nLoading certificates...\n");
    SSL_CTX_set_default_passwd_cb(ctx, callback);
    if(!SSL_CTX_use_certificate_file(ctx, "certificate.pem", SSL_FILETYPE_PEM))
    {
        ERR_print_errors_fp(stdout);
        SSL_CTX_free(ctx);
        return 0;
    }
    if(!SSL_CTX_use_PrivateKey_file(ctx, "private.key", SSL_FILETYPE_PEM))
    {
        ERR_print_errors_fp(stdout);
        SSL_CTX_free(ctx);
        return 0;
    }

    printf("Attempting to create BIO object... ");
    bio = BIO_new_ssl(ctx, 0);
    if(bio == NULL)
    {
        printf("Failed. Aborting.\n");
        ERR_print_errors_fp(stdout);
        SSL_CTX_free(ctx);
        return 0;
    }

    printf("\nAttempting to set up BIO for SSL...\n");
    BIO_get_ssl(bio, &ssl);
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

    abio = BIO_new_accept("12120");
    BIO_set_accept_bios(abio, bio);

    printf("Waiting for incoming connection...\n");

    if(BIO_do_accept(abio) <= 0)
    {
        ERR_print_errors_fp(stdout);
        SSL_CTX_free(ctx);    SSL_library_init();
        BIO_free_all(bio);
        BIO_free_all(abio);
        return 0;
    }

    if(BIO_do_accept(abio) <= 0)
    {
        ERR_print_errors_fp(stdout);
        SSL_CTX_free(ctx);
        BIO_free_all(bio);
        BIO_free_all(abio);
        return 0;
    }

    out = BIO_pop(abio);

    if(BIO_do_handshake(out) <= 0)
    {
        printf("Handshake failed.\n");
        ERR_print_errors_fp(stdout);
        SSL_CTX_free(ctx);
        BIO_free_all(bio);
        BIO_free_all(abio);
        return 0;
    }

    BIO_puts(out, "Hello\n");
    BIO_flush(out);

    BIO_free_all(out);
    BIO_free_all(bio);
    BIO_free_all(abio);

    SSL_CTX_free(ctx);
}

2 个答案:

答案 0 :(得分:0)

你到底在想什么?您应该看到端口12120处于LISTENING状态。然后您的客户应该能够连接。然后,您的服务器会执行另一次接受,这将阻止它读取接受端口上的任何I / O,并最终阻止您的客户端。我不知道你为什么要连续两次接受,但这是你的代码。

答案 1 :(得分:0)

来自BIO_do_accept()的OpenSSL文档:

  

BIO_do_accept()有两个功能。首次调用时,之后   接受BIO已设置,它将尝试创建接受   套接字并绑定一个地址。第二次及以后的电话   BIO_do_accept()将等待传入连接,或请求重试   在非阻塞模式下。