2012-04-02 12 views
4

Ich muss einen TLS-Handshake-Prozess mithilfe der SSPI-Schnittstelle implementieren.
Meine App implementiert die Client-Seite, und wie ich von here sah die allgemeine Strömung:TLS Handshake-Prozess von InitializeSecurityContext (Schannel)

  1. InitializeSecurityContext - erster Aufruf einen Zeiger auf eine SecBufferDesc Struktur zurück.
  2. Anruf an senden (= WinSock API) -Funktion mit den Ausgabepuffern.
  3. Aufruf der Recv-Funktion
  4. Rufen Sie InitializeSecurityContext erneut mit den Puffern auf.

Die MSDN Erklärung über diese Puffer:

„Auf Anrufe an diese Funktion nach dem ersten Anruf, muss es zwei Puffer sein Der erste Typ SECBUFFER_TOKEN und enthält das Token aus dem empfangenen. Server. Der zweite Puffer hat den Typ SECBUFFER_EMPTY; setzen Sie die pvBuffer und cbBuffer Mitglieder auf Null. "

Meine Fragen:

  1. Ich brauche etwas mehr Erklärung: Was ist die Bedeutung der Puffer? Was enthält der zweite Puffer? Wofür sind sie?
  2. In der MSDN geschrieben, dass die TargetDataRep Eingabeparameter der Funktion InitializeSecurityContext Nuss für Schannel verwendet wird, aber viele Beispiele, die ich gesehen habe, setzen Sie es auf SECURITY_NATIVE_DREP. Was ist das SECURITY_NATIVE_DREP Flag? Warum sagt das MSDN, es auf Null zu setzen?

Ich werde wirklich jede Hilfe zu schätzen wissen.
Danke !.

Antwort

3

1. SChannel bietet Ihnen eine Abstraktionsebene, um Datenpuffer über sichere Kanäle übertragen zu können. Die API ist so konzipiert, dass Sie beim Senden von Daten zwei Datenpuffer bereitstellen - die eigentlichen Daten (Payload) und den zweiten Puffer, der den sicheren Kanal-Token/-Kontext enthält. Es wird angenommen, dass Sie diesen Puffer an jeden Nutzlastpuffer anhängen, den Sie gerade durchlaufen, z. weil die API nicht dafür ausgelegt ist, diese Daten intern z.B. mit einem Griff.

2.InitializeSecurityContext gilt nicht nur für SChannel-Paket, in anderen Szenarien wird dieser Parameter verwendet und vielleicht Beispielcode hatten Sie eine Chance zu sehen, was zu einem anderen Paket verwandt oder von dort kopiert oder gilt für beide.

+0

danke !. 1. Kannst du mir bitte ein Beispiel für den Inhalt dieser Puffer während der Handshake-Schleife geben? (Beispiel zu was der Inhalt an einem bestimmten Punkt im Prozess wird groß sein). 2. In [diesem] (http://msdn.microsoft.com/en-us/library/aa918273.aspx) MSDN SSPI (Schannel) Codebeispiel wird das SECURITY_NATIVE_DREP festgelegt. ist es ein Fehler? (Sie finden dies durch eine schnelle Suche nach SECURITY_NATIVE_DREP Flagge auf dieser Seite) – RRR

+0

1 - Auf den ersten 'InitializeSecurityContext' Aufruf geben Sie eine Ausgabe leer' SECBUFFER_TOKEN' Puffer, um das Token zu halten.Wenn Sie "SEC_I_CONTINUE_NEEDED" empfangen haben, senden Sie die Daten, die Sie im Token-Ausgabepuffer haben, an die entfernte Partei, Sie erhalten Daten als Antwort zurück und führen einen weiteren "InitializeSecurityContext" -Aufruf durch, der den Puffer "SECBUFFER_TOKEN" mit empfangenen Daten versorgt. Wenn Sie das Ergebnis "SEC_I_CONTINUE_NEEDED" erneut erhalten, wiederholen Sie das Ganze - Sie senden Token-Daten an die Gegenstelle, erhalten eine Antwort und geben sie erneut in die SChannel-API ein, um die Initialisierung fortzusetzen. –

+0

2 - Ich bin mir nicht sicher, ob 'SECURITY_NATIVE_DREP' ein Fehler ist oder nicht. Es sieht so aus, als wäre dieses Flag nicht erforderlich und API ignoriert es. Ich würde mich an die Dokumentation halten und sie aus echtem Code entfernen. –