Abrufen von Schannel-Anmeldeinformationen

Im folgenden Beispiel wird veranschaulicht, wie ein typischer Client Schannel-Anmeldeinformationen abrufen würde. Im Beispiel wird empfohlen, die Systemstandardeinstellungen für Verschlüsselungen und Verschlüsselungsstärken zu verwenden. Dadurch kann das Schannel-Paket die bestmöglichen Algorithmen verwenden, um den Kanal zu schützen.

#include <windows.h>
#include <ntsecapi.h>
#include <stdio.h>
#include <sspi.h>
#include <schnlsp.h>

void getSchannelClientHandle(PCredHandle ppClientCred)
{
  SECURITY_STATUS SecStatus;
  TimeStamp Lifetime;
  CredHandle hCred;
  SCHANNEL_CRED credData;

  ZeroMemory(&credData, sizeof(credData));
  credData.dwVersion = SCHANNEL_CRED_VERSION;

  //-------------------------------------------------------
  // Specify the TLS V1.0 (client-side) security protocol.
  credData.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT; 
    
  SecStatus = AcquireCredentialsHandle (
       NULL,                  // default principal
       UNISP_NAME,            // name of the SSP
       SECPKG_CRED_OUTBOUND,  // client will use the credentials
       NULL,                  // use the current LOGON id
       &credData,             // protocol-specific data
       NULL,                  // default
       NULL,                  // default
       &hCred,                // receives the credential handle
       &Lifetime              // receives the credential time limit
  );
  printf("Client credentials status: 0x%x\n", SecStatus);
  // Return the handle to the caller.
  if(ppClientCred != NULL)
      *ppClientCred = hCred;

  return;
  //-------------------------------------------------------
  // When you have finished with this handle,
  // free the handle by calling the 
  // FreeCredentialsHandle function.
}

Der Hauptunterschied zwischen der clientseitigen und serverseitigen Anforderung für Anmeldeinformationen besteht darin, dass der Server ein Zertifikat mithilfe einer CERT _ CONTEXT-Struktur wie folgt bereitstellen muss:

  PCCERT_CONTEXT serverCert; // server-side certificate
  //-------------------------------------------------------
  // Get the server certificate. 

  if (! (serverCert = getServerCertificate())) return;

  // getServerCertificate is a placeholder function.
  credData.paCred = &serverCert;

Die Beispielfunktion getServerCertificate ist eine Platzhalterfunktion für diese anwendungsspezifische Aktivität. Ein Beispiel für die Implementierung der getServerCertificate-Funktion finden Sie unter Abrufen eines Zertifikats.

Hinweis

Ändern Sie beim Anfordern von Anmeldeinformationen, die vom Server verwendet werden sollen, den dritten Parameter (fCredentialUse) der AcquireCredentialsHandle-Funktion von SECPKG _ CRED _ OUTBOUND in SECPKG _ CRED _ INBOUND.