OPENSL: 키 교환 알고리즘 선택

8390 단어
1. OPENSL 악수 과정 부터
암호 화 연결 을 시도 할 때 먼저 클 라 이언 트 와 서버 간 에 암호 화 세트 협상 과 세 션 키 협상 을 해 야 합 니 다. 불행 하 게 도 이 과정 은 복잡 하고 공격 을 받 기 쉬 우 므 로 한 사용자 가 제3자 라 이브 러 리 를 사용 하지 않 는 상황 에서 암호 화 연결 을 만 들 기 어렵 습 니 다.다행히 TLS / SSL 프로 토 콜 족 은 우리 에 게 충분 한 안전 한 해결 방안 을 제공 해 주 었 고 OPENSL 은 가장 널리 알려 진 것 이자 가장 자주 사용 하 는 TLS / SSL 실현 방안 도 인터넷 에서 광범 위 하 게 응용 되 었 다.TLS / SSL 은 악수 (handshake) 라 는 단 어 를 사용 하여 클 라 이언 트 와 서버 가 세 션 키 (session key) 를 협상 하 는 과정 을 표현 합 니 다. 이 과정 에서 쌍방 이 정 보 를 교환 하고 정보 에서 같은 암호 화 세트 와 세 션 키 를 얻 습 니 다.이 과정 은 일반적으로 클 라 이언 트 가 시작 하면 클 라 이언 트 는 클 라 이언 트 - hello 정 보 를 감청 중인 서버 에 보 내 고 서버 는 이 정 보 를 받 은 후 server - hello 등 정 보 를 되 돌려 악수 과정 을 시작한다.암호 화 세트 (cipher - suite) 는 클 라 이언 트 - 서버 가 사용 하 는 키 교환 알고리즘, 인증 알고리즘, 데이터 암호 화 알고리즘, 요약 알고리즘 의 조합 입 니 다. 암호 화 세트 는 openssl 소스 코드 에 있 는. / ssl / s3 lib. c 에서 정의 합 니 다. 그 중에서 세 번 째 암호 화 세트 는 다음 과 같 습 니 다.
{
1,
SSL3_TXT_RSA_RC4_40_MD5,        
SSL3_CK_RSA_RC4_40_MD5,
SSL_kRSA,                                    //       RSA
SSL_aRSA,                                    //       RSA
SSL_RC4,                                     //     RC4
SSL_MD5,                                     //     MD5
SSL_SSLV3,
SSL_EXPORT|SSL_EXP40,
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
40,
128,
}

키 협상 알고리즘 을 통 해 암호 화 알고리즘 에 사용 할 키 를 얻 을 수 있 습 니 다. SSL / TLS 를 실행 하 는 과정 에서 client - hello 정보 에는 클 라 이언 트 가 지원 하 는 암호 화 세트 목록 이 포함 되 고 서버 는 client - hello 정 보 를 받 는 과정 에서 자신 도 지원 하 는 암호 화 세트 를 선택 하여 이번 세 션 에 사용 할 암호 화 세트 로 선택 하고 server - hello 정보 에서 되 돌려 줍 니 다.자신 이 선택 한 암호 화 키 트 입 니 다. 현재 문제 가 발생 했 습 니 다. 서버 는 암호 화 키 트 를 어떻게 선택 합 니까? 구현 방안 에 따라 선택 하 는 방식 이 다 릅 니 다. OPENSL 에서 암호 화 키 트 의 선택 은 서버 가 가지 고 있 는 인증서 형식, 임시 공개 키 설정 상황, client 가 제공 하 는 암호 화 키 트 의 순서 와 관련 이 있 습 니 다.
2. OPENSL 은 어디에서 암호 화 세트 를 선 택 했 습 니까?
server 에서 SSL accept 함 수 를 시작 하여 감청 한 후 전체 프로그램 이 유한 상태 기 와 유사 한 과정 에 들 어가 모든 상태 와 상태 가 s3 srvr. c 의 ssl 3 accept () 로 전 이 됩 니 다.함수 에서 정의 합 니 다. client - hello 정 보 를 받 은 후에 server 호출 함수 ssl 3 get client hello 는 client - hello 의 정 보 를 읽 고 해당 하 는 암호 화 세트 를 선택 합 니 다. 구체 적 인 암호 화 세트 선택 함 수 는 ssl 3 choose cipher (s3 lib. c 에서 정의) 입 니 다.선택 한 암호 화 세트 로 되 돌아 갑 니 다. 이 함 수 는 ssl 3 get client hello 에서 호출 되 었 습 니 다. 이 함수 에 들 어간 후에 우 리 는 순환 에서 다음 과 같은 코드 를 볼 수 있 습 니 다.
ssl_set_cert_masks(cert,c);
mask_k = cert->mask_k;
mask_a = cert->mask_a;
emask_k = cert->export_mask_k;
emask_a = cert->export_mask_a;

이 과정 에서 ssl set cert masks () 를 먼저 호출 했 습 니 다.함수, 이 함수 의 역할 은 인증서 와 임시 공개 키 의 설정 상황 에 따라 마스크 를 설정 하 는 것 입 니 다. 즉, mask 입 니 다. mask 에는 이번 연결 에서 지원 하 는 키 교환 알고리즘 과 인증 알고리즘 에 대한 정보 가 포함 되 어 있 습 니 다. 그 다음 문 구 는 방금 설정 한 마스크 를 읽 습 니 다. 앞의 두 가 지 는 정상 적 인 마스크 이 고 뒤의 두 가 지 는 수출 제한 과 관련 이 있 습 니 다. 우 리 는 여기 서 일반적인 상황 에 만 관심 을 가지 고 있 습 니 다.다음 마스크 입 니 다. 서버 쪽 의 모든 암호 화 세트 (함수 매개 변수 중의 c) 에 대해 openSSL 은 이러한 절 차 를 한 번 실행 해 야 합 니 다. 이것 은 바로 밖 에 감 싸 여 있 는 순환 의 의미 입 니 다. 다음 프로그램의 실행 절 차 는 다음 과 같 습 니 다.
alg_k=c->algorithm_mkey;
alg_a=c->algorithm_auth;
......          
if (SSL_C_IS_EXPORT(c))
{
    ok = (alg_k & emask_k) && (alg_a & emask_a);
......
}
else
{
    ok = (alg_k & mask_k) && (alg_a & mask_a);
.......
}

이 코드 에서 현재 순환 하 는 암호 화 세트 에 있 는 키 교환 알고리즘 (alg k) 과 인증 알고리즘 (alg a) 을 먼저 가 져 왔 습 니 다. openSSL 에서 모든 키 교환 알고리즘 (인증 알고리즘) 은 한 자리 로 표 시 됩 니 다. 구체 적 으로 다음 과 같 습 니 다 (원본 파일 ssl / ssl locl. h 중).
#define SSL_kRSA        0x00000001L /* RSA key exchange */
#define SSL_kDHr        0x00000002L /* DH cert, RSA CA cert */         
#define SSL_kDHd        0x00000004L /* DH cert, DSA CA cert */      
#define SSL_kEDH        0x00000008L /* tmp DH key no DH cert */
#define SSL_kKRB5       0x00000010L /* Kerberos5 key exchange */
#define SSL_kECDHr      0x00000020L /* ECDH cert, RSA CA cert */
#define SSL_kECDHe      0x00000040L /* ECDH cert, ECDSA CA cert */
#define SSL_kEECDH      0x00000080L /* ephemeral ECDH */
#define SSL_kPSK        0x00000100L /* PSK */
#define SSL_kGOST       0x00000200L /* GOST key exchange */
#define SSL_kSRP        0x00000400L /* SRP */

모든 키 교환 알고리즘 은 서로 다른 위 치 를 차지 하고 있 습 니 다. mask 에 서 는 인증서 와 임시 공개 키 의 설정 상황 에서 어떤 키 교환 알고리즘 을 사용 할 수 있다 면 이 자 리 는 1 을 설정 합 니 다. 위의 코드 의 ok 도 1 이 되 어 키 교환 알고리즘 을 사용 할 수 있 음 을 표시 합 니 다. 이후 openSSL 은 ok 을 1 로 하 는 암호 화 세트 에 대해 다른 검 사 를 진행 하지만 암호 화 되 어 있 습 니 다.세트 (키 교환 알고리즘) 의 선택 방식 의 핵심 부분 은 바로 여기에 있 습 니 다.
3. ssl set cert masks 함수
따라서 그 중에서 결정적 인 역할 을 하 는 것 은 ssl set cert masks 입 니 다. 이 함수 에 대한 깊 은 이 해 는 SSL / TLS 프로 토 콜 족 을 더욱 이해 하 는 데 도움 이 되 고 실제 적 으로 DH \ EC - DH 일족의 키 교환 알고리즘 을 우리 자신의 프로 토 콜 에 응용 하 는 데 도움 이 됩 니 다. (현재 인터넷 에서 openSSL 을 어떻게 사용 하 는 지 가 르 치 는 과정 에서 인증 서 는 일반적으로 RSA 인증 서 를 예 로 들 고 있 습 니 다). 세심 한 학생 들 도 위 에 있 는 openSSL 이 키 교환 알고리즘 에 대한 분류 에서 DH (Diffie - Hellman) 프로 토 콜 과 타원 곡선 버 전 EC - DH 에 세 가지 변종 이 있다 는 것 을 알 고 있 을 것 입 니 다. 여기 서 먼저 설명 할 수 있 습 니 다. kDHr (및 kECDHr) 를 사용 합 니 다.의 경우: 서버 측 에서 공개 키 를 DH 매개 변수 로 사용 하 는 공개 키, 즉 g ^ x 입 니 다. 그 중에서 x 는 지수, 즉 비밀 키 입 니 다. 서버 측의 인증 서 는 이 공개 키 를 대상 으로 하 는 것 이 고 이 인증서 에 서명 한 인증서 (상급 CA) 입 니 다.RSA 비밀 키 를 사용 하여 서명 한 것 입 니 다. 이에 대응 하여 kdhd / kECDHd 를 사용 하 는 경우 상급 CA 는 DSA / ECDSA 비밀 키 를 사용 하여 서버 의 공개 키 인증서 에 서명 하지만 인증서 자체 가 인증 한 공개 키 는 DH / EC - DH 공개 키 입 니 다. 이 두 가지 키 교환 알고리즘 에 있어 서버 측 이 키 교환 에 참가 하 는 인 자 는 모두 인증서 자체 에 의 해 제 공 됩 니 다. 그러나, 인증서 자체 가 인증 한 공개 키 는 DH / EC - DH 공개 키 입 니 다.세 번 째 유형, 즉 kEDH / kEECDH 의 경우 서버 에서 키 교환 에 참여 하 는 데 이 터 는 인증서 가 제공 하 는 것 이 아니 라 미리 설 정 된 임시 (ephemeral) 매개 변수 에 의 해 제 공 됩 니 다. 그 다음 에 ssl set cert masks (소스 코드 는 ssl lib. c 에서) 라 는 함수 에 들 어가 서 상기 메커니즘 의 실현 을 살 펴 보 겠 습 니 다. 먼저 이러한 코드 입 니 다.
rsa_tmp = (c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
......
dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
......
have_ecdh_tmp = (c->ecdh_tmp || c->ecdh_tmp_cb || c->ecdh_tmp_auto);

상기 코드 의 목적 은 통신 하기 전에 임시 공개 키 가 존재 하 는 지 확인 하 는 것 입 니 다. 임시 공개 키 의 존재 경 로 는 두 가지 가 있 습 니 다. 아니면 실제 적 인 특정한 수 를 임시 공개 키 로 설정 한 것 입 니 다. 또 하 나 는 리 셋 함수 로 임시 파 라 메 터 를 생 성 하 는 것 입 니 다. 만약 에 이런 경로 중 하나 가 성립 되면 이번 협의 악수 과정 에서 임시 공개 키 가 존재 하고 해당 하 는 tmp 변수 가 존재 하 는 것 으로 간주 합 니 다.1. 임시 공개 키 의 존재 성 을 보면 다음 코드 가 나타 납 니 다.
cpk = &(c->pkeys[SSL_PKEY_RSA_ENC]);//           RSA  
rsa_enc = cpk->valid_flags & CERT_PKEY_VALID;
//      , RSA_ENC   1,           RSA     
rsa_enc_export = (rsa_enc && EVP_PKEY_size(cpk->privatekey) * 8 <= kl);
cpk = &(c->pkeys[SSL_PKEY_RSA_SIGN]);
rsa_sign = cpk->valid_flags & CERT_PKEY_SIGN;//    RSA     
cpk = &(c->pkeys[SSL_PKEY_DSA_SIGN]);
dsa_sign = cpk->valid_flags & CERT_PKEY_SIGN;//  DSA     
cpk = &(c->pkeys[SSL_PKEY_DH_RSA]);
dh_rsa = cpk->valid_flags & CERT_PKEY_VALID;
//    CA  RSA       DH  
dh_rsa_export = (dh_rsa && EVP_PKEY_size(cpk->privatekey) * 8 <= kl);
cpk = &(c->pkeys[SSL_PKEY_DH_DSA]);
dh_dsa = cpk->valid_flags & CERT_PKEY_VALID;
//    CA  DSA       DH  
dh_dsa_export = (dh_dsa && EVP_PKEY_size(cpk->privatekey) * 8 <= kl);
cpk = &(c->pkeys[SSL_PKEY_ECC]);
#ifndef OPENSSL_NO_EC
have_ecc_cert = cpk->valid_flags & CERT_PKEY_VALID;
//       ECC  (          g^x)
#endif

인증서 의 pkeys 는 하나의 배열 입 니 다. 위의 SSL PKEY RSA ENC 등 숫자 는 바로 이 배열 의 색인 에 대해 저 장 된 각종 유형의 공개 키 를 표시 합 니 다. 위의 프로그램 목적 은 인증서 구조의 공개 키 를 읽 고 공개 키 의 합 법성 을 인증 하 는 것 입 니 다.
if(rsa_enc || (rsa_tmp && rsa_sign))    //        RSA        RSA    
    mask_k |= SSL_kRSA;                  //     kRSA        
......
if (dh_tmp)                              //    DH    
    mask_k |= SSL_kEDH;                  //    kEDH      
if (dh_rsa)                              //     RSA     DH     
    mask_k |= SSL_kDHr;                  //    kDHr      
......
if (dh_dsa)                              //     DSA     DH     
    mask_k |= SSL_kDHd;                  //    kDHd      

다음은 ECDH 키 교환 알고리즘 에 대한 설정 과정 도 위 와 유사 하 며, 이후 마스크 는 인증서 데이터 구조 (즉 코드 의 변수 c) 로 설 정 됩 니 다.ssl 3 choose cipher 함 수 는 이 마스크 를 읽 고 현재 암호 화 세트 에 사용 되 고 있 는 키 교환 알고리즘 이 인증서 의 요구 에 부합 되 는 지 확인 합 니 다. 암호 화 세트 를 사용 하 는 지 확인 할 수 있 습 니 다. 이 제 는 위의 분석 에 따라 우리 가 작성 한 프로그램 에 DH / EC - DH 키 교환 알고리즘 이 있 는 암호 화 세트 를 도입 하 는 조건 을 정리 할 수 있 습 니 다.: 서버 쪽 SSL 구조 에 임시 DH / EC - DH 인 자 를 추가 하거나 서버 쪽 에서 상급 CA 를 거 쳐 RSA / DSA / EC - DSA 알고리즘 으로 서명 한 DH / EC - DH 공개 키 인증 서 를 사용 한 후 해당 하 는 암호 화 세트 를 사용 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기