SSL 프로그래밍 관련...

pchero의 이미지


SSL 프로그래밍을 공부중인데....궁금한점이 있어서 글을 올립니다.

http://www.ibm.com/developerworks/kr/library/l-openssl3.html에서 예제를 보고 그대로 실행중인데...

자꾸 에러가 발생합니다. 슈퍼유저 학습 서버(레드햇 7.0)에서 테스트를 해봤는데 잘되더군요. 하지만 제 PC(우분투 8.04)에서는 에러가 발생합니다.

첫번째 예제는 세그멘테이션 폴트가 발생하고,

두번째 예제는...
Secure Programming with the OpenSSL API, Part 4:
Serving it up in a secure manner

Attempting to create SSL context... Failed. Aborting.
이라는 메시지가 나오면서 종료됩니다...

이상하네요... 무엇이 문제인가요?

#include "openssl/ssl.h"
#include "openssl/bio.h"
#include "openssl/err.h"
 
#include "stdio.h"
#include "string.h"
 
int main()
{
    BIO * bio;
    SSL * ssl;
    SSL_CTX * ctx;
 
    int p;
 
    char * request = "GET / HTTP/1.1\x0D\x0AHost: <a href="http://www.verisign.com" rel="nofollow">www.verisign.com</a>\x0D\x0A\x43onnection: Close\x0D\x0A\x0D\x0A";
    char r[1024];
 
    /* Set up the library */
 
    ERR_load_BIO_strings();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();
 
    /* Set up the SSL context */
 
    ctx = SSL_CTX_new(SSLv23_client_method());
 
    /* Load the trust store */
 
    if(! SSL_CTX_load_verify_locations(ctx, "TrustStore.pem", NULL))
    {
        fprintf(stderr, "Error loading trust store\n");
        ERR_print_errors_fp(stderr);
        SSL_CTX_free(ctx);
        return 0;
    }
 
    /* Setup the connection */
 
    bio = BIO_new_ssl_connect(ctx);
 
    /* Set the SSL_MODE_AUTO_RETRY flag */
 
    BIO_get_ssl(bio, & ssl);
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
 
    /* Create and setup the connection */
 
    BIO_set_conn_hostname(bio, "www.verisign.com:https");
 
    if(BIO_do_connect(bio) <= 0)
    {
        fprintf(stderr, "Error attempting to connect\n");
        ERR_print_errors_fp(stderr);
        BIO_free_all(bio);
        SSL_CTX_free(ctx);
        return 0;
    }
 
    /* Check the certificate */
 
    if(SSL_get_verify_result(ssl) != X509_V_OK)
    {
        fprintf(stderr, "Certificate verification error: %i\n", SSL_get_verify_result(ssl));
        BIO_free_all(bio);
        SSL_CTX_free(ctx);
        return 0;
    }
 
    /* Send the request */
 
    BIO_write(bio, request, strlen(request));
 
    /* Read in the response */
 
    for(;;)
    {
        p = BIO_read(bio, r, 1023);
        if(p <= 0) break;
        r[p] = 0;
        printf("%s", r);
    }
 
    /* Close the connection and free the context */
 
    BIO_free_all(bio);
    SSL_CTX_free(ctx);
    return 0;
}

#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 "ibmdw" */
 
    printf("*** Callback function called\n");
    strcpy(buf, "ibmdw");
    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();
    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("4422");
    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);
        BIO_free_all(bio);
        BIO_free_all(abio);
        return;
    }
 
    if(BIO_do_accept(abio) <= 0)
    {
        ERR_print_errors_fp(stdout);
        SSL_CTX_free(ctx);
        BIO_free_all(bio);
        BIO_free_all(abio);
        return;
    }
 
    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;
    }
 
    BIO_puts(out, "Hello\n");
    BIO_flush(out);
 
    BIO_free_all(out);
    BIO_free_all(bio);
    BIO_free_all(abio);
 
    SSL_CTX_free(ctx);
}
pchero의 이미지

해결했습니다. 질문올린게 부끄러워지는구요..

OpenSSL_add_all_algorithms(); 함수를 SSLeay_add_ssl_algorithms(); 로 변경하니 잘 되네요.

그런데, 위 두개의 함수의 차이점이 뭔가요?

---------------------------------
제일 왼쪽이 저입니다 :)

---------------------------------
제일 왼쪽이 저입니다 :)

vmfvmfc의 이미지

TrustStore 가 뭔가요?