SSL 프로그래밍 관련...
글쓴이: pchero / 작성시간: 수, 2008/07/23 - 7:54오후
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); }
Forums:
해결했습니다.
해결했습니다. 질문올린게 부끄러워지는구요..
OpenSSL_add_all_algorithms(); 함수를 SSLeay_add_ssl_algorithms(); 로 변경하니 잘 되네요.
그런데, 위 두개의 함수의 차이점이 뭔가요?
---------------------------------
제일 왼쪽이 저입니다 :)
---------------------------------
제일 왼쪽이 저입니다 :)
truststore
TrustStore 가 뭔가요?
댓글 달기