2017-09-17 1 views
1

KontextWie kann ich Vertrauen nur ein bestimmtes Zertifikat (meine eigenen) unter Verwendung von Code, in ServerCertificateValidationCallback

Die Client-Code implementieren muß einen Remote-Web-api verbinden. SSL ist obligatorisch, weil vertrauliche Informationen auf der Leitung ausgetauscht werden. Wir haben unser selbst ausgestelltes Zertifikat a In dem Projekt gibt es derzeit nicht, was richtig in der Remote-IIS konfiguriert ist, und alles getestet OK, außer das Zertifikat ist nicht vertrauenswürdig.

Ich weiß, ich kann das Zertifikat auf dem lokalen Computer installieren und darauf vertrauen. Aus bestimmten Gründen (zum Beispiel gibt es Xamarin Android-Clients) ist es jedoch keine geeignete Lösung.

Aktuelle Abhilfe ist einfach das Zertifikat Fehler im Code zu ignorieren, die sowohl auf dem Desktop sowohl auf Android Xamarin arbeiten:

ServicePointManager.ServerCertificateValidationCallback = 
(s, certificate, chain, sslPolicyErrors) => 
{ 
    // Here I would like to check against that the certificate 
    // is the specific one I issued, and only that case return with true 

    // if (what is the most suitable to write here?) 
    return true; 
}; 

Frage

Hinweis: Dies ist eine Entwicklung/Testphase. In der Produktion wird ein Zertifikat installiert, das von einer vertrauenswürdigen Zertifizierungsstelle erstellt wurde.

Jetzt habe ich ein schlechtes Gefühl etwas zu akzeptieren, also möchte ich es eingrenzen. So überprüfen Sie, ob das Zertifikat das spezifische ist, das ich ausgestellt habe, und nur dieser Fall wird mit true zurückgegeben. Ist das eine funktionierende Idee, den Code auszuführen, einen Haltepunkt zu setzen und das Zertifikat zu bekommen. Thumbprint, dann schreibe ein if, um dagegen zu prüfen?

(bearbeiten) ... oder besser ... die PublicKeyString und überprüfen Sie dagegen?

+0

Sie können die Zertifikatserweiterung [Subject Key Identifier] (https://knowledge.symantec.com/support/registrar-name/index?page=content&actp=CROSSLINK&id=SO18140#SKI) überprüfen und nur bestimmte Werte zulassen. –

+0

Mit Daumenabdruck können Sie es auf nur ein Zertifikat eingrenzen. Mit dem öffentlichen Schlüssel oder dem Schlüssel-Identifikator des Betreffs werden Sie auf dasselbe Schlüsselpaar, aber nicht auf dasselbe Zertifikat beschränkt. – pepo

+0

Sobald Sie einen Bezeichner fest codieren, betten Sie einfach das gesamte Zertifikat als 'byte []' ein und vergleichen Sie das mit 'cert.RawData'. – bartonjs

Antwort

1

Überprüfung gegen Fingerabdruck ist IMHO eine OK-Option. Mit dem Fingerabdruck können Sie die Vertrauensstellung auf genau ein Zertifikat eingrenzen.

Die Überprüfung gegen den öffentlichen Schlüssel oder die Objektschlüsselkennung ist ebenfalls in Ordnung, aber Sie erweitern die Vertrauensstellung auf das gleiche Schlüsselpaar. Es können mehrere Zertifikate für denselben öffentlichen Schlüssel (mit oder ohne denselben Distinguished Name) ausgestellt werden.

Wie @bartonjs sagte eine andere Option ist, Rohdaten zu überprüfen. Dieser Ansatz hat die gleiche Wirkung wie die Überprüfung gegen den Fingerabdruck. Der Vorteil davon wäre IMO, dass, wenn Sie den Code in einem Jahr betrachten, Sie immer noch wissen, welches Zertifikat Sie vertrauen :)

Wie auch immer, wenn Sie gegen das genaue Zertifikat überprüfen, denken Sie daran, dass das Zertifikat eines Tages ablaufen wird Lassen Sie uns ein 3-Monats-Zertifikat verschlüsseln, wenn ich mich richtig erinnere) und Ihre Anwendung muss mit einer neuen Zertifikatsüberprüfung neu implementiert werden. Sie müssen das Ablaufdatum des Zertifikats verfolgen.

Verwandte Themen