Openssl SSL_CTX_new가 성공했지만 errno를 ENOSYS로 설정했습니다(기능이 구현되지 않음)

Openssl SSL_CTX_new가 성공했지만 errno를 ENOSYS로 설정했습니다(기능이 구현되지 않음)

SSL_CTX_new() 함수는 잘 작동하지만 errno를 ENOSYS로 설정하는 것이 뭔가 이상합니다.

문서에는 이에 대해 아무 말도 나와 있지 않습니다. https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_new.html

#include <errno.h>
#include <openssl/ssl.h>

int main(int argc, char * argv[]){

    SSL_library_init();
    SSL_load_error_strings();

    perror("A");

    SSL_CTX * sslContext = SSL_CTX_new(TLS_server_method());

    if (sslContext == NULL){
        return EXIT_FAILURE;
    }

    perror("B");

    return 0;
}

이 코드는 다음을 반환합니다.

A: Undefined error: 0
B: Function not implemented

내 openssl 버전은 다음과 같습니다. OpenSSL 1.1.1b 2019년 2월 26일

답변1

모든 라이브러리가 errno를 사용하여 상태를 보고하는 것은 아닙니다. 문서에서 이 함수가 errno를 설정한다고 명시적으로 언급하지 않은 경우 값은 다음과 같이 생각하는 것이 가장 좋습니다.한정되지 않은: 함수는 원래 값을 유지하거나 0으로 설정하거나 일부 쓰레기를 남길 수 있습니다.

그리고 실제로 OpenSSL 문서는 errno에 대해 아무 말도 하지 않습니다. 대신 라이브러리에는 다음을 사용하여 액세스할 수 있는 자체 "오류 스택"이 있습니다.ERR_get_error(), 이는 libc에서 제공하는 매우 제한된 세트보다 더 정확한 오류 코드와 메시지를 제공합니다.

따라서 errno에서 찾은 값은 SSL_CTX_new()가 사용한 일부 또는 다른 libc 함수에서 남은 것입니다.내부적으로. (예를 들어, libc getrandom()을 호출하여 RNG를 시드하려고 시도했을 수 있으며 커널 지원 부족으로 인해 ENOSYS를 반환했습니다.)

관련 정보