2017-09-14 21 views
1

openssl 라이브러리를 사용하여 암호화 된 통신 (TLSv1.2)을 구현하는 클라이언트/서버 아키텍처가 있습니다. "자체 서명 된"인증서를 사용하고 있기 때문에 서버의 ID를 확인하기 위해 클라이언트 측에 서버의 공개 키 (server_public_key.pem)의 실제 복사본을 넣은 다음 그 인증서가 TLS의 핸드 셰이크 단계에서 수신되었습니다. 지금Openssl X509 cert는 사람이 읽을 수있는 문자열을 얻습니다.

X509 *cert = SSL_get_peer_certificate(ssl); 

나는이 객체에 포함 된 공개 키의 사람이 읽을 수있는 문자열을 추출합니다 : 클라이언트에

, 나는 후자를 검색 할 수 있습니다.

은 내가 이런 식으로 인쇄 할 수 있다는 사실을 알고 :

EVP_PKEY *pkey = X509_get_pubkey(cert); 
PEM_write_PUBKEY(stdout, pkey); 

하지만 문자열로 유지 (대신에 표준 출력으로 전송) 할 필요가있다. 어떻게해야합니까?

답변

1

BIO_new()을 사용하여 내부 메모리 버퍼 (초기 상태는 비어 있음)로 백업 된 BIO을 새로 만듭니다.

그런 다음 을 사용하여 공개 키를 BIO에 쓰십시오.이 시점에서 BIO의 매뉴얼 페이지에 설명 된 기능을 사용하여 공개 키를 검색하십시오.

BIO을 작성한 다음 그것에 읽는 간단한 예제는 인용 된 문서를 참조하십시오. 샘플 쓰기 작업을 PEM_write_bio_PUBKEY()으로 바꾸면 충분합니다.

+0

작동합니다! 고맙습니다 ! – stackpic91

+0

다른 질문이 있습니다. 내가 "char buff [size];" 그런 다음 "BIO_read (mem, buff, size)"여기서 mem는 BIO 객체이고 "size"는 읽어야 할 바이트 수이며, buff의 끝에는 이상한 문자가 있습니다. 내가 메모리 할당에 몇 가지 오류를하고있는 것 같아요. 어떠한 제안 ? 이 방법으로 버퍼를 초기화하면 "char buff [] =" ""이 오류가 발생합니다. "*** 스택 스매싱 감지 *** :" – stackpic91

+0

해결되었습니다. 나는 버프의 끝에 0을 넣는 것을 잊었다.) – stackpic91