IBackgroundCopyServerCertificateValidationCallback::ValidateServerCertificate-Methode (bits10_3.h)
Eine Rückrufmethode, die Sie implementieren, die aufgerufen wird, damit Sie die beim Öffnen einer HTTPS-Verbindung gesendeten Serverzertifikate überprüfen können.
Syntax
HRESULT ValidateServerCertificate(
IBackgroundCopyJob *job,
IBackgroundCopyFile *file,
DWORD certLength,
const BYTE [] certData,
DWORD certEncodingType,
DWORD certStoreLength,
const BYTE [] certStoreData
);
Parameter
job
Typ: IBackgroundCopyJob*
Der Auftrag.
file
Typ: IBackgroundCopyFile-*
Die Datei, die übertragen wird.
certLength
Typ: DWORD-
Die Länge in Byte der Zertifikatdaten.
certData
Typ: BYTE- []
Ein Array von Bytes, die die Zertifikatdaten enthalten. Die Anzahl der Bytes muss certLength
übereinstimmen.
certEncodingType
Typ: DWORD-
Der Zertifikatcodierungstyp.
certStoreLength
Typ: DWORD-
Die Länge in Byte der Zertifikatspeicherdaten.
certStoreData
Typ: BYTE- []
Ein Array von Bytes, die die Zertifikatspeicherdaten enthalten. Die Anzahl der Bytes muss certStoreLength
übereinstimmen.
Rückgabewert
Geben Sie S_OK zurück, um anzugeben, dass das Zertifikat akzeptabel ist. Geben Sie andernfalls HRESULT-Fehlercode zurück,, um anzugeben, dass das Zertifikat nicht akzeptabel ist.
Bemerkungen
Die Zertifikatüberprüfung erfolgt in zwei Phasen. Die erste Phase ist die Betriebssystemphase (Betriebssystem), in der das Betriebssystem einen Standardsatz von Überprüfungen für das Zertifikat durchführt. Danach wird ihr Rückruf aufgerufen, wenn die Betriebssystemphase das Zertifikat übergibt, um eine zusätzliche Überprüfung durchzuführen.
Implementieren Sie diese Überprüfungsmethode, wenn Sie eigene Prüfungen für das Serverzertifikat durchführen möchten. Ihre eigenen Prüfungen sind zusätzlich zu den normalen Überprüfungen der Betriebssystemzertifikate.
Wenn die Validierungsmethode das Zertifikat ablehnt, wechselt der Auftrag mit einem Auftragsfehlerkontext von BG_ERROR_CONTEXT_SERVER_CERTIFICATE_CALLBACK zu BG_JOB_STATE_TRANSIENT_ERROR und der Fehler HRESULT- aus dem Rückruf. Wenn Ihr Rückruf nicht aufgerufen werden konnte (z. B. weil BITS zum Überprüfen eines Serverzertifikats nach dem Beenden des Programms erforderlich ist), wird der Auftragsfehlercode BG_E_SERVER_CERT_VALIDATION_INTERFACE_REQUIRED. Wenn die Anwendung als nächstes ausgeführt wird, kann dieser Fehler behoben werden, indem sie den Überprüfungsrückruf erneut festlegen und den Auftrag fortsetzen.
BITS ruft diese Rückrufmethode nur auf, wenn Sie die IBackgroundCopyServerCertificateValidationCallback Schnittstelle implementieren und an IBackgroundCopyJobHttpOptions3::SetServerCertificateValidationInterfaceübergeben.
Die Überprüfungsschnittstelle wird ungültig, wenn die Anwendung beendet wird. BITS verwaltet keinen Datensatz der Überprüfungsschnittstelle. Daher sollte der Initialisierungsprozess Ihrer Anwendung SetServerCertificateValidationInterface für diese vorhandenen Aufträge aufrufen, für die Sie Zertifikatüberprüfungsanforderungen erhalten möchten.
Wenn mehrere Anwendungen SetServerCertificateValidationInterface aufrufen, um die Benachrichtigungsschnittstelle für den Auftrag festzulegen, wird die letzte Anwendung aufgerufen, die Benachrichtigungen empfängt. Die anderen Anwendungen erhalten keine Benachrichtigungen.
Hier sind die allgemeinen Schritte zum Überprüfen eines Zertifikats. Beachten Sie, dass diese Schritte nur ein Beispiel sind. Die tatsächliche Überprüfung befindet sich unter Ihrer Kontrolle. Außerdem sind die Schritte 5-7 weitgehend identisch mit der Funktionsweise des Betriebssystems während des Betriebssystemüberprüfungsschritts.
Rufen Sie CertCreateCertificateContext mit
certEncodingType
,certData
undcertLength
auf, um eine CERT_CONTEXTabzurufen.Deklarieren und initialisieren Sie eine CRYPT_DATA_BLOB-Struktur (definiert in
wincrypt.h
), wobei das serialisierte Speicher-BLOB übercertStoreLength
undcertStoreData
übergeben wird.
DATA_BLOB storeData{};
storeData.cbData = certStoreLength;
storeData.pbData = const_cast<PBYTE>(certStoreData);
- Rufen Sie ein Handle für die Zertifikatkette ab, indem Sie CertOpenStore- mit CERT_STORE_PROV_SERIALIZED, 0, nullptr, Flags und einem Zeiger auf die CRYPT_DATA_BLOB aus Schritt 2 aufrufen.
- Rufen Sie einen Zeiger auf einen Zertifikatkettenkontext ab, indem Sie CertGetCertificateChain mit nullptr,
certContext
, nullptr, dem Handle aus Schritt 3, Kettenparametern, Flags und Nullptr aufrufen. - Erstellen Sie die Zertifikatüberprüfungsrichtlinie.
CERT_CHAIN_POLICY_PARA policyParams{};
policyParams.cbSize = sizeof(policyParams);
policyParams.dwFlags =
CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG |
CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG |
CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG |
CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG;
- Rufen Sie CertVerifyCertificateChainPolicy mit Richtlinientyp, Kettenkontext, Richtlinienparametern und Richtlinienstatus auf.
- Konvertieren Sie den Win32-Fehler (
policyStatus.dwError
) in ein HRESULT, und geben Sie diesen zurück.
Eine Beschreibung des BitS-Überprüfungszwischenspeicherungsverhaltens folgt. BITS verwaltet einen Cache pro Auftrag von Zertifikaten, die eine benutzerdefinierte Überprüfung bestanden haben. Dies besteht darin, redundante und potenziell teure erneute Überprüfungen über die Lebensdauer des Auftrags zu vermeiden. Der Cache besteht aus <Serverendpunkt, Zertifikathash-> Tupel, wobei Endpunkt- als Servername:portdefiniert ist. Wenn ein Auftrag bereits ein bestimmtes Zertifikat von einem bestimmten Endpunkt zugelassen hat, wird der Rückruf nicht erneut aufgerufen.
Natürlich muss das Zertifikat die Betriebssystemüberprüfungslogik für jeden Verbindungsversuch durchlaufen (Sie können die Betriebssystemüberprüfungslogik mit einem Aufruf von IBackgroundCopyJobHttpOptions::SetSecurityFlags) anpassen, in dem zeitempfindliche Eckfälle behandelt werden, z. B. wann das Zertifikat in letzter Zeit (in Bezug auf Sekunden) gültig war, aber jetzt abgelaufen ist.
BITS speichert keine Zertifikate zwischen, die vom von der App bereitgestellten Überprüfungsrückruf als ungültig eingestuft werden. Es ist wichtig, dass Sie alle erfolglosen Verbindungsversuche kennen, damit Sie schädliche Bereitstellungen auf App-Ebene erkennen können. Beispielsweise ist ein einmaliges fehlerhaftes Zertifikat viel weniger betroffen als Tausende von ungültigen Zertifikaten vom selben Server.
Der Zertifikatcache eines Auftrags wird für jeden Aufruf von SetServerCertificateValidationInterfacegelöscht, da die Logik für die Serverzertifikatüberprüfung der App geändert wurde.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 10, Version 1809 [nur Desktop-Apps] |
mindestens unterstützte Server- | Windows Server 2016 [nur Desktop-Apps] |
Header- | bits10_3.h (bits.h einschließen) |
Library | Bits.lib |
DLL- | Bits.dll |
Siehe auch
IBackgroundCopyJobHttpOptions3::SetServerCertificateValidationInterface