2015-01-30 3 views
1

내 응용 프로그램에 openssl을 추가하고 있지만 지금까지는 암호화되거나 인증서를 확인하지 않고 데이터를 보내고받을 수 있습니다.X509_NAME - 실제 버퍼를 얻는 방법?

X509 *gCert = NULL; 
X509_NAME *gCertName = NULL; 

gCert = SSL_get_peer_certificate(sslConnection.ssl); 

gCertName = X509_NAME_new(); 
gCertName = X509_get_subject_name(gCert); 

certNameLen = strlen(gCertName); 
memcpy(write_buffer, gCertName, certNameLen); 

그런 다음 나는 SSL 소켓에 write_buffer 쓰기하지만 내가 다른 쪽 끝에서받을 것은 단지 횡설수설입니다 :

나는으로 서버 인증서를 얻을.

어떻게하면 X509_NAME을 사용할 수 있습니까? strlen이 작동하지 않는 것 같습니까? 내가 생각하는 포인터 크기 인 길이 4가 버퍼 크기가 아닌 ... 그리고 X509_NAME은 어떤 인코딩입니까? 그것은 utf - 8처럼 보이지 않습니다 ...

그냥 내가 0xAA 또는 0XBB를 버퍼에 넣으면 다운 스트림 작품을 보내는 것이고, 다른 쪽 끝에서 정확하게 수신됩니다.

답변

1

당신은 상당히 가깝습니다. 그러나 X509_get_name은 사람이 읽을 수있는 문자열로 캐스팅해야하는 X509_NAME 구조체를 반환합니다 (또는 상세하고보다 안전한 비교를 위해 '있는 그대로'사용). 일반 ASCII를 구문 분석/비교하는 것은 약간 위험하므로 영리한 공격자는 'C = '실제 텍스트).

제비의 가장 쉬운

당신에게 C의 \ 0 종료 문자열로 한 줄 근사 그물

X509 * gCertName =SSL_get_peer_certificate(con); 
    // if null - error out 
    const char * buf = X509_NAME_oneline(gCertName, 0, 0); 
    // if null - release memory and error out 
    printf("Client\t: %s\n", buf); 
    OpenSSL_free(buf); 
    X509_free(gCertName); 

입니다. _oneline 함수는 depricated입니다. UTF8과 멀티 라인 안전 인 텍스트 변환을 얻는 좀 더 정교한 방법은 openssl의 맨 페이지를보십시오. 하지만 위의 코드는 단순한 ASCII westerncharset 도메인 이름과 같은 단순한 것 (대안/변형)이 없어도 괜찮습니다.

관련 문제