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.