[OPENSSL-1.0.2] 코드로 알아보는 SSL/TLS 통신이해
1. SSL 통신을 위해 필요한 구조체
1) SSL_CTX(SSL Context)(전역 구조체)
(1) Global context 구조체
(2) SSL_CTX는 SSL 응용프로그램당 1개면 충분합니다.
(3) SSL 구조체들에 대한 기본값을 저장하며, 연결을 위해 만들어집니다.
(4) 연결과 세션에 대한 기본 정보를 갖고 있습니다.
- SSL 연결 개수, 재협상, 세션 재개
(5) ssl.h 에 정의 되어 있습니다.
- 버전별 정의
- OpenSSL_1_0_2
- 선언
- ssl/ssl.h : typedef struct ssl_st SSL;
- OpenSSL_1_1_1-stable cadb6f0e32
- 선언
- include/openssl/ossl_typ.h
- typedef struct ssl_ctx_st SSL_CTX;
- 정의
- ssl/ssl_local.h 에 정의
- struct ssl_ctx_st
2). SSL 구조체
(1) SSL API에서 사용되는 메인 구조체 입니다.
(2) SSL 구조체는 SSL_CTX를 생성 및 설정한후 만들어 져야합니다.
(3) SSL은 SSL_CTX의 기본값을 상속하여 만들어 집니다.
(4) 모든 SSL 연결에서 항상 필요 합니다.
(5) 새로운 SSL 연결 마다 생성 됩니다.
(6) SSL 연결 및 세션에 대한 정보를 가지고 있는 구조체를 갖고 있습니다.
- SSL 구조체 항목
A. SSL_CTX - 미리 생성한 SSL_CTX 정보를 갖고 있습니다.
- SSL_CTX *ctx;
B. SSL_METHOD - SSL Protocol Version
C. SSL_SESSION - SSL 세션 정보
D. SSL_CIPHER - SSL 암호화 정보
E. CERT - x.509 구조의 인증서 정보
F. BIO - SSL 연결 수행은 BIO를 통해서 합니다.
G. ssl.h 에 정의 되어 있습니다.
- ssl/ssl.h : typedef struct ssl_st SSL;
3. SSL_CTX 구조체 VS SSL 구조체
1) SSL_CTX 구조체는 변경되지 않는 설정을 저장합니다.
(1) 키
(2) 인증서
(3) CA
(4) cipherlist(암호화 리스트)
(5) SSL 연결을 위한 공유된 상태(예: 재사용가능한 세션의 cashe)
(6) 기타 등등..
2) 각 SSL 객체(SSL 구조체로 만든것)는 하나의(활성)연결 대한 상태를 처리하고 포함.
(1) TCP 연결을 위한 일시적인 핸드 셰이크 값, nonces, 파생 키, 부분 레코드 버퍼,
시퀀스 카운터, HMAC 상태 및 BIO(s)
4.SSL 구조체 구조 상세 설명
1) SSL_METHOD 구조체
- SSL 라이브러리 함수를 가리킵니다. 이 함수들은 여러 버전으로 구현되어있습니다.
(SSLv2, TLSv1 등)
- SSL_METHOD 구조체는 SSL_CTX를 만들때 필요 합니다.
- ssl.h 에 정의되어 있습니다.
2) SSL_SESSION 구조체
- 한개의 연결에 대한 현재 TLS/SSL 세션의 상세 정보를 갖고 있습니다.
: SSL_CIPERS, client / server 인증서, 키 등
3) CERT/X509 구조체
- 인증을 위한 정보를 x.509 구조체 형태로 가지고 있습니다.
- 인증서 정보블 인증서에서 추출합니다.
4) BIO 구조체
- BIO 구조체는 SSL 애플리케이션의 I / O 스트림 추상화입니다.
- 통신에 대한 세부 정보를 캡슐화합니다.
- TLS / SSL의 밑에 있는 TCP 연결을 다룹니다.
- 클라이언트와 서버 간의 통신이 BIO 구조를 통해 수행됩니다.
- BIO 구조체는 bio.h 에 정의 되어있습니다.
5) SSL_CIPHER 구조체
- 특정의 암호화 알고리즘에 대한 정보를 갖고 있습니다.
- 이용가능한 암호들은 SSL_CTX에 설정되어 있습니다.
- 실제로 사용된 것들은 SSL_SESSION에 있습니다.
4. SSL-server와 SSL-Client 통신 방법
5. OpenSSL 구조체 생성과 종료
- 아래 표를 통해서 구조체별 생성 함수와 파괴 함수를 확인 할수 있다.
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
[byteordering] big endian vs little endian (0) | 2018.11.14 |
---|---|
[OPENSSL-1.0.2] SSL 연결 코드 구현 (0) | 2018.11.13 |
[GDB] 자주 까먹는 GDB 명령어 (0) | 2018.10.04 |
[프로세스간 통신] IPC(inter process communication) 종류 (8) | 2018.09.10 |
[Segfault] Core가 없을때 dmesg로 죽은 원일 분석 하기 (0) | 2018.08.29 |