Environment
- SSL : PolarSSL-1.3.8
- RTOS : FreeRTOS-8.1.2
- Network Stack : Lwip-1.4.1
- MCU : RealTek RTL8195a
문제
Wi-Fi 모듈에서 SKT ThingPlug에 SSL 연결을 위한 기능을 구현 하는 중, SSL 연결이 되지 않는 문제가 발생 하였다.
원인 분석
정확한 원인을 분석하기 위하여 Wi-Fi 모듈과 ThingPlug 간에 주고 받는 패킷을 캡쳐 하였다. 패킷 분석 결과, SSL 서버와 Hand Shake 과정이 정상적으로 완료 되지 않는 것을 확인 하였다.
SKT ThingPlug Server와 정상적인 통신 패킷을 확인 해 보기 위해, PC에서 SSL 연결을 시도 해 보았다.
연결이 성공 하는 경우, 아래 그림과 같이 Client Hello -> Server Hello 이후 SSL 서버가 Certificate를 송신하는 과정을 볼 수 있다.
Certificate 과정의 패킷을 보면, 4개의 인증서를 송신하는 것을 볼 수 있다. 인증서는 1개의 sktiot.com 인증서와 sktiot.com의 신뢰성을 보장해 주는 상위 기관 인증서 3개를 송신 한다.
위의 4개의 인증서를 수신하기 위해서는 5410bytes 이상의 메모리가 필요 할 것으로 보이며, 위에서 발생한 “bad message length” 에러도 Wi-Fi 모듈에서 SSL 인증서를 처리 하기 위한 메모리가 부족하거나 설정이 작은 값으로 되어 있는 것으로 판단 된다.
문제 해결
“bad message length” Error
Wi-Fi 모듈에서 에러를 출력하는 부분을 확인해 보면, 아래와 같이 수신된 ssl message length가 SSL_MAX_CONTENT_LEN 값 보다 크면 해당 에러를 출력하는 코드를 볼 수 있다. 현재 SSL_MAX_CONTENT_LEN 값이 4096으로 되어 있어서 그보다 더 큰 Contents를 수신하지 못 했던 것으로 판단 되며, 값을 6144( 6Kbytes )로 수정 하였다.
if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
{
SSL_DEBUG_MSG( 1, ( "bad message length" ) );
return( POLARSSL_ERR_SSL_INVALID_RECORD );
}
“malloc failed” Error
SSL_MAX_CONTENT_LEN 값을 수정 하고 테스트 해 보니, 이번에는 malloc failed 에러가 발생 하였다.
위는 Heap 메모리가 부족해서 출력된 에러로 판단 되며, FreeRTOSConfig.h의 configTOTAL_HEAP_SIZE의 값을 (70 1024) —> ( 80 1024 )로 수정 후 정상적으로 SKT ThingPlug에 SSL 연결이 되는 것을 확인 하였다.