SSL_CTX_use_certificate_file因EXC_BAD_ACCESS而失败

时间:2012-09-03 21:42:36

标签: c xcode ssl openssl exc-bad-access

我最近想通过使用BSD套接字构建自己的客户端 - 服务器系统。在某些时候我想包括SSL来加密数据传输。我按照this教程编写了代码并使用Xcode编译好了(添加了链接器标志:-lssl -lcrypto),但是一旦程序到达EXC_BAD_ACCESS调用,我就会一直得到SSL_CTX_use_certificate_file()。您可以在下面看到使用过的代码。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

int main(int argc, const char * argv[])
{
    SSL_METHOD *method = NULL;
    SSL_CTX *ctx = NULL;
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
    method = SSLv2_server_method();
    ctx = SSL_CTX_new(method);

    SSL_CTX_use_certificate_file(ctx, "/Users/steve/certificate.pem", SSL_FILETYPE_PEM);
    SSL_CTX_use_PrivateKey_file(ctx, "/Users/steve/key.pem", SSL_FILETYPE_PEM);

    printf("Hello, World!\n");
    return EXIT_SUCCESS;
}

如果程序在指定的路径找不到证书,它不会崩溃,但我当然不会有任何SSL加密。证书本身可能有问题吗?我只是使用以下命令使用openssl生成一个:

# generate the key
$ openssl genrsa -out key.pem 1024

# generate request
$ openssl req -new -key key.pem -out request.pem
# fill in all the stuff ...

# generate certificate
$ openssl x509 -req -days 30 -in request.pem -signkey key.pem -out certificate.pem

有什么想法吗?

更新:在将OS X部署目标设置为10.7或更高版本进行编译时,实际上会出现一些警告,因为所有这些SSL内容都显示为已弃用。是否有任何建议的替代做法来使用SSL保护套接字?

1 个答案:

答案 0 :(得分:5)

问题是你需要调用SSL_library_init,看看代码中的修改(总是处理我们调用的函数中的错误也是一个很好的做法: - ):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

int main(int argc, const char * argv[])
{
    //SSL_METHOD *method = NULL;
    SSL_CTX *ctx = NULL;
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
    //method = SSLv2_server_method();
    //ctx = SSL_CTX_new(method);

    /* Without this line you got an error when calling SSL_CTX_new */
    SSL_library_init();
    ctx = SSL_CTX_new(SSLv2_server_method());
    if(!ctx) 
    {
        fprintf (stderr, "SSL_CTX_new ERROR\n");
        ERR_print_errors_fp(stderr);
        return EXIT_FAILURE;
    }

    if (!SSL_CTX_use_certificate_file(ctx, "/Users/steve/certificate.pem", SSL_FILETYPE_PEM))
    {
        fprintf (stderr, "SSL_CTX_use_certificate_file ERROR\n");
        ERR_print_errors_fp(stderr);

        return EXIT_FAILURE;
    }
    SSL_CTX_use_PrivateKey_file(ctx, "/Users/steve/key.pem", SSL_FILETYPE_PEM);

    printf("Hello, World!\n");
    return EXIT_SUCCESS;
}