다음을 통해 공유


맬웨어 방지 서비스 보호

Windows 8.1에는 맬웨어 방지 서비스를 보호하기 위한 새로운 보호 서비스 개념이 도입되었으며, 이는 맬웨어에 의한 공격의 빈번한 대상입니다.

AM(맬웨어 방지) 사용자 모드 서비스 보호 및 맬웨어 방지 서비스에 이 기능을 포함하도록 선택하는 방법에 대해 알아봅니다.

이 정보는 다음 운영 체제 및 후속 운영 체제에 적용됩니다.

  • Windows 8.1
  • Windows Server 2012 R2

여기에 설명된 참조 및 리소스는 이 항목의 끝에 나와 있습니다.

소개

대부분의 맬웨어 방지 솔루션에는 시스템에서 맬웨어를 감지하고 제거하는 특수 작업을 수행하는 사용자 모드 서비스가 포함됩니다. 이 사용자 모드 서비스는 최신 바이러스 정의 및 서명 다운로드를 자주 담당합니다. 이 사용자 모드 서비스는 시스템에서 보호를 사용하지 않도록 설정하는 단일 실패 지점이므로 맬웨어의 빈번한 대상이 됩니다. 사용자 모드 서비스에 대한 공격 방지를 위해 맬웨어 방지 공급업체는 소프트웨어에 많은 기능과 추론을 추가해야 합니다. 그러나 이러한 기술은 완전히 완벽하지 않으며 Windows가 서비스에서 수행하는 기능을 식별하고 해당 기능을 선택적으로 사용하도록 설정해야 하기 때문에 오류가 발생하기 쉽습니다.

Windows 8.1에서는 맬웨어 방지 사용자 모드 서비스를 보호된 서비스로 시작할 수 있도록 보호된 서비스의 새로운 개념이 도입되었습니다. 서비스가 보호된 서비스로 시작된 후 Windows는 코드 무결성을 사용하여 신뢰할 수 있는 코드만 보호된 서비스에 로드하도록 허용합니다. 또한 Windows는 이러한 프로세스를 코드 삽입 및 기타 공격으로부터 관리 프로세스로부터 보호합니다.

이 문서에서는 ELAM(조기 실행 맬웨어 방지) 드라이버를 사용하는 맬웨어 방지 공급업체가 이 기능을 옵트인하고 보호된 서비스로 맬웨어 방지 서비스를 시작하는 방법을 설명합니다.

시스템 보호 프로세스

Windows 8.1부터 시스템에 중요한 구성 요소에 대한 악의적인 공격을 더 잘 방어하기 위해 커널에 새로운 보안 모델이 적용되었습니다. 이 새로운 보안 모델은 DRM 콘텐츠 재생과 같은 특정 시나리오에 사용된 보호된 프로세스 인프라 이전 버전의 Windows를 타사 맬웨어 방지 공급업체에서 사용할 수 있는 범용 모델로 확장합니다. 보호된 프로세스 인프라는 신뢰할 수 있는 서명된 코드만 로드할 수 있으며 코드 삽입 공격에 대한 기본 제공 방어 기능을 제공합니다.

참고 항목

다음 스크립팅 DLL은 AuthentiCodescrobj.dlljscript9.dllscrrun.dlljscript.dllvbscript.dll를 통해 스크립트 서명을 검사 위해 WinVerifyTrust 또는 WinVerifyTrustEx를 통해 보호된 프로세스(직접 또는 간접적으로 로드되었는지 여부) 내에서 CodeIntegrity에서 사용할 수 없습니다.

보호된 프로세스에 대한 자세한 내용은 Windows Vista의 보호된 프로세스를 참조하세요.

새 보안 모델은 시스템 보호 프로세스라는 보호 프로세스 인프라의 약간 다른 변형을 사용하며, DRM 콘텐츠를 별도로 유지하므로 이 기능에 더 적합합니다. 각 시스템 보호 프로세스에는 프로세스 내에서 로드할 수 있는 서명된 코드의 서명 정책을 나타내는 연결된 수준 또는 특성이 있습니다. 맬웨어 방지 서비스가 보호된 서비스 모드로 옵트인된 후에는 맬웨어 방지 공급업체의 인증서로 서명된 Windows 서명 코드 또는 코드만 해당 프로세스에서 로드할 수 있습니다. 마찬가지로 보호되는 다른 프로세스 수준에는 Windows에서 적용하는 다른 코드 정책이 있습니다.

요구 사항

맬웨어 방지 사용자 모드 서비스를 보호된 서비스로 실행하려면 맬웨어 방지 공급업체에 WINDOWS 컴퓨터에 ELAM 드라이버가 설치되어 있어야 합니다. 기존 ELAM 드라이버 인증 요구 사항 외에도 드라이버에는 사용자 모드 서비스 이진 파일에 서명하는 데 사용되는 인증서의 정보가 포함된 포함된 리소스 섹션이 있어야 합니다.

Important

Windows 8.1에서 인증 체인은 드라이버 확인에 의해 결정된 알려진 루트이거나 루트 인증서를 포함해야 합니다.

부팅 프로세스 중에 이 리소스 섹션은 ELAM 드라이버에서 추출되어 인증서 정보의 유효성을 검사하고 맬웨어 방지 서비스를 등록합니다. 이 문서의 뒷부분에 설명된 대로 특수 API를 호출하여 맬웨어 방지 소프트웨어 설치 프로세스 중에 맬웨어 방지 서비스를 등록할 수도 있습니다.

리소스 섹션이 ELAM 드라이버에서 성공적으로 추출되고 사용자 모드 서비스가 등록된 후 서비스는 보호된 서비스로 시작할 수 있습니다. 보호된 서비스로 서비스를 시작한 후에는 시스템의 보호되지 않는 다른 프로세스에서 스레드를 삽입할 수 없으며 보호된 프로세스의 가상 메모리에 쓸 수 없습니다.

또한 보호된 프로세스에 로드되는 비 Windows DLL은 적절한 인증서로 서명되어야 합니다.

ELAM 드라이버에 대한 자세한 내용은 맬웨어 방지 조기 시작을 참조하세요.

맬웨어 방지 서비스 서명 요구 사항

보호됨으로 시작해야 하는 사용자 모드 서비스는 유효한 인증서로 서명해야 합니다. 서비스 EXE는 페이지 해시에 서명되어야 하며, 서비스에 로드되는 비 Windows DLL도 동일한 인증서로 서명해야 합니다. 이러한 인증서의 해시는 ELAM 드라이버에 연결되는 리소스 파일에 추가되어야 합니다.

참고 항목

SHA256 파일/페이지 해시를 사용해야 하지만 인증서는 SHA1일 수 있습니다.

맬웨어 방지 공급업체는 기존 Authenticode 인증서를 사용하여 맬웨어 방지 서비스 이진 파일에 서명하고 이 Authenticode 인증서의 해시를 리소스 섹션에 포함하여 서비스 이진 파일에 서명하는 데 사용되는 인증서를 나타내는 것이 좋습니다. 이 인증서를 업데이트하는 경우 업데이트된 인증서 해시를 사용하여 최신 버전의 ELAM 드라이버를 릴리스해야 합니다.

보조 서명(선택 사항)

맬웨어 방지 공급업체에는 프라이빗 CA를 설정하고 이 CA의 인증서를 사용하여 맬웨어 방지 서비스 이진 파일을 보조 서명으로 코드 서명하는 옵션이 있습니다. 프라이빗 CA를 사용하는 기본 장점은 공급업체가 특수한 EKU 속성으로 인증서를 만들 수 있다는 것입니다. 이 속성을 사용하여 동일한 공급업체의 여러 제품을 구분할 수 있습니다. 또한 프라이빗 CA 인증서는 일반적으로 만료 날짜가 길기 때문에 인증서 만료로 인해 ELAM 드라이버를 업데이트할 필요가 줄어듭니다.

서비스 이진 파일이 프라이빗 CA 인증서로 서명된 경우 이진 파일도 기존 Authenticode 인증서로 이중 서명되어야 합니다. 잘 알려진 신뢰할 수 있는 CA(예: VeriSign)에서 이진 파일에 서명하지 않은 경우 컴퓨터 사용자는 프라이빗 CA를 신뢰할 수 없으므로 이진 파일에 대한 신뢰도가 없습니다. 또한 기존 Authenticode 인증서를 사용하여 이진 파일을 이중 서명하면 하위 수준 운영 체제에서 이진 파일을 실행할 수 있습니다.

인증 기관을 설정하고 설치하는 방법에 대한 자세한 내용은 인증 기관 설정 및 인증 기관 설치를 참조하세요.

참고 항목

Windows Vista 또는 Windows XP(또는 SHA2 패치가 없는 Windows 7)와의 호환성을 위해 SHA256 파일/페이지 해시를 사용하여 SignTool.exe이진 파일에 서명할 때 "/as" 스위치를 사용할 수 있습니다. 그러면 서명이 파일에 보조 서명으로 추가됩니다. WINDOWS XP, Windows Vista 및 Windows 7에는 첫 번째 서명만 표시되므로 SHA1에서 먼저 파일에 서명합니다.

DLL 서명 요구 사항

앞에서 멘션 보호된 서비스에 로드되는 모든 비 Windows DLL은 맬웨어 방지 서비스에 서명하는 데 사용된 것과 동일한 인증서로 서명되어야 합니다.

카탈로그 서명

맬웨어 방지 공급업체는 이진 서명을 업데이트하지 않고도 다른 회사에서 개발한 패키지를 포함할 수 있습니다. 이 작업은 다음 단계를 수행하여 Authenticode 인증서로 서명된 카탈로그에 이진 파일을 포함하여 수행할 수 있습니다.

  1. MakeCat을 사용하여 카탈로그 생성
  2. 카탈로그에 적절한 서명 없이 모든 이진 파일 추가
  3. 다른 이진 파일과 마찬가지로 Authenticode 인증서를 사용하여 카탈로그에 서명
  4. 카탈로그 추가 함수를 사용하여 애플리케이션에 카탈로그를 포함합니다.

적절한 서명이 없는 패키지에서 코드 무결성이 제공되면 승인된 서명이 있는 카탈로그를 검색합니다. 이러한 단계를 수행하고 애플리케이션과 함께 설치되는 한 이 카탈로그를 찾을 수 있습니다.

리소스 파일 정보

리소스 파일을 만들고 ELAM 드라이버에 연결해야 합니다. 다른 인증서 정보와 함께 인증서의 해시를 리소스 파일에 추가해야 합니다.

이진 이미지에서 리소스를 성공적으로 추출하고 포함된 인증서 정보의 유효성을 검사하려면 시스템에서 리소스 섹션이 다음 레이아웃에 있어야 합니다.

MicrosoftElamCertificateInfo  MSElamCertInfoID
{
      3, // count of entries
      L”CertHash1\0”,
      Algorithm,
      L”EKU1\0”,
      L”CertHash2\0”,
      Algorithm,
      L”\0”, //No EKU for cert hash 2
      L”CertHash3\0”,
      Algorithm,
      L”EKU3a;EKU3b;EKU3c\0”,  //multiple EKU entries supported (max: 3)
}

사용자 정의 리소스 파일에 대한 자세한 내용은 사용자 정의 리소스를 참조 하세요.

CertHash

맬웨어 방지 서비스에 서명하는 데 사용되는 인증서의 해시입니다. Windows SDK에 제공되는 CertUtil.exe 도구를 사용하여 해시를 가져올 수 있습니다.

certutil.exe –v <path to the signed file>

예시:

anti-malware protected service certificate hash (certhash)

알고리즘

알고리즘 값은 인증서의 알고리즘을 나타냅니다. 다음 알고리즘 값이 지원됩니다.

0x8004 – SHA1 0x800c – SHA256 0X800d – SHA384 0x800e – SHA512

알고리즘의 실제 이름이 아닌(위와 같이) 알고리즘의 값을 포함해야 합니다. 예를 들어 인증서가 SHA256 알고리즘을 기반으로 하는 경우 리소스 섹션에 0x800c 포함합니다.

EKU

EKU 개체는 인증서의 단일 EKU(확장 키 사용) 속성을 나타냅니다. 이는 선택 사항이며 인증서와 연결된 EKU가 없는 경우 "\0"을 지정해야 합니다. 동일한 시스템에서 실행되는 단일 맬웨어 방지 공급업체의 여러 제품 및 서비스가 있는 경우 맬웨어 방지 공급업체는 프라이빗 CA 인증서의 EKU 속성을 사용하여 한 서비스를 다른 서비스와 구별할 수 있습니다. 예를 들어 동일한 맬웨어 방지 공급업체에서 시스템에서 실행되고 동일한 CA에서 서명된 두 개의 서비스가 있는 경우 보호된 것으로 시작해야 하는 서비스는 특별한 EKU가 포함된 CA에서 발급한 인증서로 서명할 수 있습니다. 이 EKU는 리소스 섹션에 추가해야 합니다. 그러면 EKU가 시스템에 의해 등록되고 인증서 해시와 쌍을 이루어 서비스의 유효성을 검사하고 보호된 서비스로 시작합니다.

인증서 체인에는 코드 서명 EKU(1.3.6.1.5.5.7.3.3)가 포함되어야 하지만 이 EKU는 ELAM 드라이버의 리소스 섹션에 포함되어서는 안 됩니다.

참고 항목

EKU 정보가 ELAM 드라이버의 인증서 정보에 포함된 경우 이진 파일에 서명할 때 동일한 EKU를 사용해야 합니다.

참고 항목

EKU의 OID에 대한 Windows 코드 무결성의 문자열 표현은 종료 문자 0을 포함하여 최대 길이가 64자입니다.  

참고 항목

여러 EKU를 지정하면 논리를 사용하여 AND 평가됩니다. 최종 엔터티 인증서는 지정된 항목에 대해 ELAM 리소스 섹션에 지정된 모든 EKU를 충족해야 합니다.

Count

맬웨어 방지 서비스 이진 파일이 Authenticode 인증서와 프라이빗 CA 인증서로 서명된 경우 리소스 섹션에 프라이빗 CA 인증서 정보만 추가해야 합니다.

보호된 맬웨어 방지 서비스 시작

서비스 등록

맬웨어 방지 서비스를 보호된 서비스로 시작하려면 먼저 시스템에 등록해야 합니다. 맬웨어 방지 소프트웨어를 설치하는 동안 설치 관리자는 ELAM 드라이버를 설치하고 시스템을 다시 부팅하여 서비스를 자동으로 등록할 수 있습니다. 시스템은 ELAM 드라이버에 연결된 afore멘션ed 리소스 파일에서 인증서 정보를 추출하여 부팅 시 서비스를 등록합니다.

설치 단계에서는 ELAM 드라이버가 로드되고 시스템 상태의 유효성을 검사하기 위해 시스템을 다시 시작하는 것이 좋습니다. 그러나 다시 부팅을 피해야 하는 경우 Windows는 맬웨어 방지 설치 관리자가 API를 사용하여 보호된 서비스로 등록하는 메커니즘도 노출합니다.

시스템을 다시 부팅하지 않고 서비스 등록

설치하는 동안 맬웨어 방지 소프트웨어 설치 관리자는 InstallELAMCertificateInfo API를 호출하고 ELAM 드라이버 파일에 대한 핸들을 제공할 수 있습니다. 시스템에서 ELAM 드라이버를 열고 내부 루틴을 호출하여 ELAM 드라이버가 제대로 서명되었는지 확인하고 ELAM 드라이버와 연결된 리소스 섹션에서 인증서 정보를 추출합니다. 함수 구문은 InstallELAMCertificateInfo를 참조하세요.

코드 예제:

HANDLE FileHandle = NULL;

FileHandle = CreateFile(<Insert Elam driver file name>,
                        FILE_READ_DATA,
                        FILE_SHARE_READ,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL
                        );

if (InstallElamCertificateInfo(FileHandle) == FALSE)
{
    Result = GetLastError();
    goto exitFunc;
}

보호된 서비스 시작

설치 관리자는 다음 단계에 따라 보호된 서비스를 만들고 구성하고 시작할 수 있습니다.

  1. CreateService API를 호출하여 서비스 개체를 만들고 SCM(서비스 제어 관리자) 데이터베이스에 추가합니다.

  2. SetServiceObjectSecurity API를 호출하여 1단계에서 만든 서비스 개체의 보안 설명자를 설정합니다.

  3. ChangeServiceConfig2 API를 호출하여 서비스를 보호된 것으로 표시하고 Winsvc.h에 추가된 새 SERVICE_CONFIG_LAUNCH_PROTECTED 열거형 값을 지정합니다(Windows 8.1 기준).

    코드 예제:

    SERVICE_LAUNCH_PROTECTED_INFO Info;
    SC_HANDLE hService;
    
    Info.dwLaunchProtected = SERVICE_LAUNCH_PROTECTED_ANTIMALWARE_LIGHT;
    
    hService = CreateService (/* ... */);
    
    if (ChangeServiceConfig2(hService,
                             SERVICE_CONFIG_LAUNCH_PROTECTED,
                             &Info) == FALSE)
    {
        Result = GetLastError();
    }
    
  4. StartService API를 호출하여 서비스를 시작합니다. 보호된 서비스로 서비스를 시작할 때 SCM은 CI(코드 무결성) 하위 시스템을 검사 인증서 정보의 유효성을 검사합니다. CI에서 인증서 정보의 유효성을 검사한 후 SCM은 보호된 서비스를 시작합니다.

    1. InstallELAMCertificateInfo API를 호출하여 서비스를 등록하지 않은 경우 이 단계가 실패합니다.
    2. 시스템 시작 단계에서 서비스가 자동으로 시작되도록 구성된 경우 이 단계를 방지하고 시스템을 다시 부팅하기만 하면 됩니다. 다시 부팅하는 동안 시스템은 자동으로 서비스를 등록하고(ELAM 드라이버가 성공적으로 시작되는 경우) 보호 모드에서 서비스를 시작합니다.
    3. 서비스가 시작되지 않으면 코드 무결성 이벤트 로깅 및 시스템 감사 및 다음 항목에서 정보를 참조하세요. 여기에서 코드 무결성 시스템이 서비스를 시작하지 못하게 한 이유를 설명하는 더 자세한 오류 메시지를 찾을 수 있습니다. 이러한 로그는 서비스가 로드하려고 했지만 로드할 수 없는 DLL을 식별하는 데 도움이 될 수도 있습니다.

보호된 자식 프로세스 시작

또한 새 보안 모델을 사용하면 맬웨어 방지 보호 서비스가 보호된 자식 프로세스를 시작할 수 있습니다. 이러한 자식 프로세스는 부모 서비스와 동일한 보호 수준에서 실행되며 해당 이진 파일은 ELAM 리소스 섹션을 통해 등록된 것과 동일한 인증서로 서명되어야 합니다.

맬웨어 방지 보호 서비스가 자식 프로세스를 보호된 것으로 시작하도록 허용하려면 새 확장 특성 키인 PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL 노출되었으며 UpdateProcThreadAttribute API와 함께 사용해야 합니다. PROTECTION_LEVEL_SAME 특성 값에 대한 포인터는 UpdateProcThreadAttribute API에 전달되어야 합니다.

참고:

  • 이 새 특성을 사용하려면 서비스에서 CreateProcess 호출의 프로세스 생성 플래그 매개 변수에 CREATE_PROTECTED_PROCESS 지정해야 합니다.
  • 알려진 CA에 연결하는 교차 인증서를 포함하려면 /ac 스위치를 사용하여 서비스 이진 파일에 서명해야 합니다. 알려진 루트 CA에 대한 적절한 연결 없이 자체 서명된 인증서는 작동하지 않습니다.

코드 예제:

DWORD ProtectionLevel = PROTECTION_LEVEL_SAME;
SIZE_T AttributeListSize;

STARTUPINFOEXW StartupInfoEx = { 0 };

StartupInfoEx.StartupInfo.cb = sizeof(StartupInfoEx);

if (InitializeProcThreadAttributeList(NULL,
                                      1,
                                      0,
                                      &AttributeListSize) == FALSE)
{
    Result = GetLastError();
    goto exitFunc;
}

StartupInfoEx.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST) HeapAlloc(
    GetProcessHeap(),
    0,
    AttributeListSize
    );

if (InitializeProcThreadAttributeList(StartupInfoEx.lpAttributeList,
                                      1,
                                      0,
                                      &AttributeListSize) == FALSE)
{
    Result = GetLastError();
    goto exitFunc;
}

if (UpdateProcThreadAttribute(StartupInfoEx.lpAttributeList,
                              0,
                              PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL,
                              &ProtectionLevel,
                              sizeof(ProtectionLevel),
                              NULL,
                              NULL) == FALSE)
{
    Result = GetLastError();
    goto exitFunc;
}

PROCESS_INFORMATION ProcessInformation = { 0 };

if (CreateProcessW(ApplicationName,
                   CommandLine,
                   ProcessAttributes,
                   ThreadAttributes,
                   InheritHandles,
                   EXTENDED_STARTUPINFO_PRESENT | CREATE_PROTECTED_PROCESS,
                   Environment,
                   CurrentDirectory,
                   (LPSTARTUPINFOW)&StartupInfoEx,
                   &ProcessInformation) == FALSE)
{
    Result = GetLastError();
    goto exitFunc;
}

업데이트 및 서비스

맬웨어 방지 서비스를 보호된 것으로 시작한 후에는 보호되지 않는 다른 프로세스(및 관리자)가 서비스를 중지할 수 없습니다. 서비스 이진 파일 업데이트의 경우 맬웨어 방지 서비스는 서비스를 받을 수 있도록 자체 중지하기 위해 설치 관리자로부터 콜백을 수신해야 합니다. 서비스가 중지된 후 맬웨어 방지 설치 관리자는 업그레이드를 수행한 다음, 서비스 등록 및 보호된 섹션으로 서비스 시작에 설명된 단계에 따라 인증서를 등록하고 보호된 서비스를 시작할 수 있습니다.

서비스는 신뢰할 수 있는 호출자만 서비스를 중지할 수 있도록 해야 합니다. 신뢰할 수 없는 호출자가 이 작업을 수행하도록 허용하면 서비스를 보호하는 목적이 무효화됩니다.

서비스 등록 취소

보호된 서비스를 제거할 때 서비스는 ChangeServiceConfig2 API를 호출하여 자신을 보호되지 않는 것으로 표시해야 합니다. 시스템에서 보호되지 않는 프로세스가 보호된 서비스의 구성을 변경하는 것을 허용하지 않으므로 보호된 서비스 자체에서 ChangeServiceConfig2호출해야 합니다. 서비스가 보호되지 않은 상태로 실행되도록 다시 구성된 후 제거 프로그램은 시스템에서 맬웨어 방지 소프트웨어를 제거하기 위해 적절한 단계를 수행할 수 있습니다.

맬웨어 방지 보호 서비스 디버깅

보호된 프로세스 보안 모델의 일부로 보호되지 않는 다른 프로세스는 스레드를 삽입하거나 보호된 프로세스의 가상 메모리에 쓸 수 없습니다. 그러나 KD(커널 디버거)는 맬웨어 방지 보호 프로세스를 디버깅할 수 있습니다. 또한 KD를 사용하여 맬웨어 방지 서비스가 보호된 것으로 실행되는지 여부를 검사 수 있습니다.

dt –r1 nt!_EPROCESS <Process Address>
+0x67a Protection       : _PS_PROTECTION
      +0x000 Level            : 0x31 '1'
      +0x000 Type             : 0y0001
      +0x000 Signer           : 0y0011

Type 멤버의 값이 0y0001이면 서비스가 보호된 것으로 실행됩니다.

또한 맬웨어 방지 보호 서비스에서는 다음 SC 명령만 허용됩니다.

  • sc config start=Auto
  • sc qc
  • sc start
  • sc interrogate
  • sc sdshow

디버거가 연결된 경우 레지스트리에서 다음 플래그를 사용하여 서명되지 않은(또는 부적절하게 서명된) 이진 파일이 맬웨어 방지 보호 서비스에 로드될 때 디버거를 중단합니다.

Key:   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI
Value: DebugFlags      REG_DWORD

서명 유효성 검사가 실패할 때 디버거에서 중단되도록 값을 00000400 설정합니다.

참고 항목

보호된 프로세스 제한 사항:

  1. 커널이 메모리에서 프로세스를 잠그고 쓰기를 허용하지 않으므로 UI 또는 GUI가 있는 프로세스를 보호할 수 없습니다.
  2. Windows 10 버전 1703(크리에이터스 업데이트) 이전의 보호된 프로세스는 LSA(로컬 보안 기관)와 보호된 프로세스 간의 인증서 공유 제한으로 인해 TLS 또는 SSL 통신 프로토콜을 사용할 수 없습니다.

리소스

자세한 내용은 다음을 참조하세요.

이러한 Windows API 함수는 이 문서에서 참조됩니다.