3

私は最近、BSD ソケットを使用して独自のクライアント サーバー システムを構築したいと考えていました。ある時点で、データ転送を暗号化するために SSL を含めたいと思いました。このチュートリアルに従ったところ、コードは 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 Deployment Target を 10.7 以降に設定してコンパイルすると、実際にはいくつかの警告が表示されます。これは、この SSL のすべてが非推奨として表示されるためです。SSL でソケットを保護するための推奨される代替方法はありますか?

4

1 に答える 1

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;
}
于 2012-09-03T23:12:02.610 に答える