[난치병] 시스템 시간이 잘못되어 SSL 연결이 실패했습니다.

4738 단어 작업 노트

문제 설명


우리 안드로이드 박스의 클라이언트는 매번 첫 번째 서버에 연결할 때마다 ssl 오류가 발생하여 연결이 실패합니다. openssl이 되돌아오는 오류는 다음과 같습니다.
SSL_connect error:00000001:lib(0):func(0):reason(1)
네트워크 pcap 패키지를 캡처했는데 ssl에서 악수를 할 때 클라이언트가 서버의 인증서를 받았을 때 인증서가 무효라고 생각했지만 같은 인증서는 이따가 다시 연결되고 연결을 만들 수 있습니다.이 문제는 특정 모델의 상자에서만 발생합니다

문제 분석


인증서의 인증 과정을 분석한 결과 인증서의 유효 시간, 쌍방이 지원하는 암호화 형식 등을 판단한 결과 안드로이드 측의 시간에 문제가 있다는 것을 발견했다. 시스템은 시간을 저장하지 않고 인터넷을 켜서 교정할 때마다 교정이 지연되고 심지어 교정이 실패할 때 2014년의 초기 시간을 가지고 인증서를 검사하는 시간이 있기 때문에 인증서가'기한이 지났다'고 인정했다.
이곳의 구덩이는 상자 위에 데스크톱 앱이 얻는 시간입니다. 베이스 시스템의 시간이 아닙니다. 베이스 시스템의 시간은 셸에서date 명령을 통해 볼 수 있습니다.
또 다른 구덩이, Openssl의 오류 정보는 한 번에 get이 끝날 수 있습니다. get이 여러 번 있어야 모든 정보를 출력할 수 있습니다. 잘못된 정보를 출력하는 코드를 수정했습니다.
                char error_str[256];
                while (rc != 0) {
                    ERR_error_string_n(rc, error_str, sizeof(error_str));
                    g_warning("%s: SSL_connect %s", c->name, error_str);
                    rc = ERR_get_error();
                }

따라서 문제의 완전한 오류 정보는 다음과 같다.
SSL_connect error:00000001:lib(0):func(0):reason(1) SSL_connect error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

문제 해결


제3자 응용 개발자로서androidrom의 버그에 대해 어쩔 수 없이 일반 응용 프로그램은 시스템 설정 시간의 권한도 없다.물론 인증서의 유효기간을 2014년부터 회피할 수 있다는 것은 좋은 방법이 아니다.
비교적 합리적인 방법은 우리 앱을 통해 정확한 시간을 얻은 다음에 이 시간을 가지고 교정하는 것이지 오픈스슬이 시스템을 사용하여 되돌아오는 시간이 아니다.
openssl의 라이브러리를 수정하여 openssl에서 교정 시간을 설정할 수 있는 인터페이스를 제공합니다.
int SSL_connect_ptime(SSL *s, time_t ptime)
{
    if (ptime)
        X509_VERIFY_PARAM_set_time(s->param, ptime);

    return SSL_connect(s);
}

ssl을 사용한 학생은 이것SSL_connect()을 익혀야 합니다. 오픈슬의 인터페이스를 추가하려면 util/libssl.num 파일에 함수 이름을 붙여야 합니다. 뒤에 있는 번호와 버전 번호를 주의하십시오.
 SSL_COMP_get_id                         412	1_1_0d	EXIST::FUNCTION:
 SSL_COMP_get0_name                      413	1_1_0d	EXIST::FUNCTION:
+SSL_connect_ptime                       414	1_1_0d	EXIST::FUNCTION:

업데이트


사실 뒤에 openssl의api를 보면 openssl의 원본 코드를 변경할 필요가 없습니다.
	X509_VERIFY_PARAM_set_time(SSL_get0_param(c->ssl), ssl_time);

FIXED & END

좋은 웹페이지 즐겨찾기