Openssl 관련 소스 에러입니다. 고수분들 꼭 도움주세요
글쓴이: hopeful1213 / 작성시간: 목, 2006/01/05 - 5:11오후
안녕하세요 얼마전부터 openssl 을 공부하고 있습니다.
코딩을 하다가 이해할수 없는 에러가 자꾸납니다.
SSL_CTX * CClientSSL::setup_client_ctx(CString CERTFILE, CString PASSWORD) { common.init_OpenSSL(); SSL_CTX *ctx2 = NULL; ctx2 = SSL_CTX_new(SSLv23_method()); char pass[150] = "\0"; sprintf(pass,"%s", (LPCTSTR)PASSWORD); // CString -> char * SSL_CTX_set_default_passwd_cb_userdata(ctx2,pass); if (SSL_CTX_use_certificate_chain_file(ctx2, CERTFILE) != 1){ int_error("Error loading certificate from file"); SSL_CTX_free(ctx2); return NULL; } if (SSL_CTX_use_PrivateKey_file(ctx2, CERTFILE,SSL_FILETYPE_PEM) != 1){ int_error("Error loading private key from file"); SSL_CTX_free(ctx2); return NULL; } return ctx2; }
이 부분은 인증서를 로드해서 비밀번호를 대조하여 성공하면 ctx2 를 리턴하는 부분인데요. 일단 처음은 잘 됩니다.
문제는 처음에 인증서 파일을 로드해서 알맞게 패스워드를 넣어 성공한다음 다시 이 함수를 호출해서 인증 실패가 되도록 해보았습니다. 당연히 실패가 되고 return NULL이 되었고요. 이경우 디버그 결과 SSL_CTX_use_PrivateKey_file에서 예외처리가 되었습니다.
그런데 그 다음 다시 이 함수를 호출하여 파일을 로드하고 알맞게 비밀 번호를 넣었는데 실패한 결과가 나옵니다. 이경우는 SSL_CTX_use_certificate_chain_file 부분에서 예외처리가 되더군요.
저는 이함수를 로그인 부분으로 넣으려고 하는데 재로그인 하는 경우를 배제할 수 없어서 이 문제를 꼭 해결해야 합니다.
고수분들 꼭 도움주시길 바랍니다.
Forums:
여기를 참고해보세요.
자료 찾으러 왔다가 이 글을 보게 되었습니다. 혹시나 보실 분이 있으실지 모르겠네요.
아래 링크에 가셔서 살펴보시면 답이 나오지 않을까 합니다.
http://www.openssl.org/docs/ssl/SSL_CTX_set_default_passwd_cb.html
님의 소스를 보면, SSL_CTX_set_default_passwd_cb()를 호출해주는 부분이 없는데,
userdata를 처리할 pem_passwd_cb() 콜백 함수를 등록해줘야 하는것 같네요..
#include <openssl/ssl.h>
void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); // 콜백함수 등록
void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); // 콜백함수 파라미터 등록
int pem_passwd_cb(char *buf, int size, int rwflag, void *userdata); // 콜백함수
님의 소스에서 userdata로 char* 를 넘겨주었으므로, pem_passwd_cb()는 다음과 같이 구현하면 되겠네요.
아래 소스는 위 링크 페이지에서 발췌한 것입니다.
int pem_passwd_cb(char *buf, int size, int rwflag, void *password)
{
strncpy(buf, (char *)(password), size);
buf[size - 1] = '\0';
return(strlen(buf));
}
댓글 달기