티스토리 뷰
void SSL_load_error_strings(void);
void OpenSSL_add_all_algorithms(void);
void ERR_load_BIO_strings(void);
이 함수들은 OpenSSL 초기화와 관련된 함수들입니다.
OpenSSL은 통신에 관련된 모든 함수들을 포함하고 있기 때문에 비 보안 연결을 위한 통신 역시 연관된 함수들을 사용할 수 있습니다.
연결 관련 함수
비 보안 연결을 위한 함수로는 BIO_new_connect() 함수와 BIO_new_accept() 함수가 있습니다. connect 함수는 연결을 시도하는 함수이고, accept() 함수는 listen을 하는 함수로 보입니다.
두 함수의 원형은 아래와 같습니다.
#include <openssl/bio.h>
BIO *BIO_new_connect(char *hostinfo);
BIO *BIO_new_accept(char *hostinfo);
이 함수가 성공하면 BIO 구조체의 주소값을 리턴하며, 실패하면 NULL을 리턴합니다. 이 함수들로 BIO 객체를 생성했다면 BIO_do_connect(), BIO_do_accept() 함수를 호출합니다.
#include <openssl/bio.h>
int BIO_do_connect(BIO *bio):
int BIO_do_accept(BIO *bio);
읽기/쓰기 함수
#include <openssl/bio.h>
int BIO_read(BIO *b, void *buf, int len);
int BIO_write(BIO *b, const void *buf, int len);
int BIO_gets(BIO *b, char *buf, int size);
int BIO_puts(BIO *b, const char *buf);
위 함수들은 read(), write(), gets(), puts() 함수와 동일한 방법으로 사용됩니다. 에러가 발생한다면 0이나 -1을 리턴하고, select(), poll()과 같은 입출력 다중화 함수와 함께 사용이 가능합니다.
보안 연결을 위한 추가 함수
보안 연결을 하기 위해서는 몇 가지 추가적인 작업이 필요합니다.
#include <openssl/ssl.h>
SSL_CTX *SSL_CTX_new(SSL_METHOD *method);
int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath);
SSL_CTX_new는 TLS/SSL 연결을 할 수 있는 SSL_CTX 객체를 생성합니다. 연결 방식은 method 변수에 의해 결정됩니다. SSLv2와 SSLv3를 모두 사용하기 위해서는 SSLv23_client_method(void), 서버에서는 SSLv23_server_method(void)를 사용하면 됩니다. SSLv2는 SSLv2_client_method(void)/SSLv2_server_method(void)를 사용할 수 있습니다. TLS를 이용하려 한다면 SSL부분을 TLS로 변경하면 됩니다.
SSL_CTX_load_verify_locations() 함수는 CTX 객체에서 참조할 CA 증명서 파일의 위치를 알려주기 위해 사용합니다. CAfile은 파일의 이름이고 CApath는 경로입니다. 일반적으로 /usr/share/ssl/ 의 경로에 사용가능한 CA 파일이 존재합니다.
CTX객체를 로드하고 성공적으로 CAfile을 로드했으면, ctx를 이용해서 ssl 연결을 생성해야 합니다. 이를 위해서 BIO_new_ssl_connect() 함수를 사용합니다.
BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
마지막으로 ssl 연결 모드를 설정해 주면 됩니다.
BIO_get_ssl(BIO *b, SSL *ssl);
BIO_set_mode(SSL *ssl, MODE mode);
출처 : http://egloos.zum.com/hermes2/v/701011
'C++' 카테고리의 다른 글
[C++] getline 함수에 대해서. (0) | 2017.12.07 |
---|---|
[C++] OpenSSL을 이용한 간단한 echo 프로그래밍 (0) | 2017.11.27 |
[C++] IP주소 및 포트 정보관련 시스템 함수 (0) | 2017.11.27 |
[C++11] std::regex를 사용해 보자. (0) | 2017.11.27 |
윈속 초기화 WSAStartup (0) | 2017.11.27 |