Ich verstehe PKI aus konzeptioneller Sicht ziemlich gut - dh private Schlüssel / öffentliche Schlüssel - die Mathematik dahinter, die Verwendung von Hash & Verschlüsselung zum Signieren eines Zertifikats, das digitale Signieren von Transaktionen oder Dokumenten usw. Ich habe auch an Projekten gearbeitet, in denen openssl C-Bibliotheken wurden mit Zertifikaten zur Sicherung der Kommunikation und Authentifizierung verwendet. Ich bin auch sehr vertraut mit OpenSSL-Kommandozeilen-Tools.
Ich habe jedoch sehr wenig Erfahrung mit webbasierten PKI-fähigen Projekten und versuche daher, ein persönliches Projekt zu entwerfen und zu programmieren, um dies besser zu verstehen.
Die Anforderungen
Dies ist die Website für eine Bank. Alle Internet-Banking-Benutzer dürfen alle Zertifikate verwenden, die von einigen bekannten Zertifizierungsstellen ausgestellt wurden (Verisign, Thawte, Vertrauen usw.). Die Bank ist nicht für die Beschaffung von Zertifikaten für den Benutzer verantwortlich. Diese Zertifikate werden zur Authentifizierung gegenüber der Bank-Website verwendet. Die Plattformen / OS usw. sind noch nicht behoben.
Design
Ich habe mich gefragt, wie ich am besten authentifizieren kann.
Ich habe gesehen, dass Apache eine Möglichkeit bietet, 2-Wege-SSL zu aktivieren. In diesem Fall würde der Benutzer bei der Navigation zur Website automatisch nach einem Zertifikat gefragt. Ich bin mir jedoch nicht sicher, ob dies ausreicht, da anscheinend nur überprüft wird, ob ein Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle signiert ist und möglicherweise auch in eine weiße Liste mit Betreffzeilen der Zertifikate usw. fällt. Dies ist jedoch nicht ausreichend für einen Bankfall, weil Sie in der Lage sein müssen, eine Bankbenutzer-ID mit einem Zertifikat zu verknüpfen.
IIS scheint eine Möglichkeit zu haben, mit der ich ein Zertifikat für jeden Benutzer in Active Directory speichern kann. Das habe ich verstanden, als ich einige MSDN-Artikel gelesen habe. Sie aktivieren 2-Wege-SSL in IIS. Wenn der Benutzer versucht, zur Website zu navigieren, sendet IIS eine Anforderung mit einer Liste der genehmigten Zertifizierungsstellen an den Browser. Der Browser lässt den Benutzer ein geeignetes Zertifikat aus seinem Zertifizierungsspeicher auswählen und sendet es zum Backend. Ich gehe davon aus, dass IIS zwei Dinge tun wird
- Stellen Sie sicher, dass der Benutzer über den privaten Schlüssel verfügt, der dem Zertifikat entspricht (im Rahmen der Deckungsverhandlungen).
- Basierend auf der AD User-Cert-Zuordnung meldet IIS den Benutzernamen an die Anwendung.
Führen Sie die Authentifizierung explizit durch, indem Sie Kryptofunktionen aufrufen, je nachdem, welcher Webserver dies ausführt.
- Zeigen Sie einen Benutzerbildschirm an, auf dem er ein Zertifikat hochlädt und die Anwendung sicherstellt, dass der Benutzer über den dem Zertifikat entsprechenden privaten Schlüssel verfügt (indem Sie das Front-End auffordern, eine Zeichenfolge mit dem Zertifikat zu signieren).
- Die Anwendung verfügt über eine Datenbank, in der einige Daten gespeichert sind, die es jedem Benutzer ermöglichen, seiner Benutzer-ID zugeordnet zu werden. Das mag sein
- Das gesamte Zertifikat, das jeder Benutzer-ID entspricht
- Die Seriennummer der Zertifizierungsstelle und des Zertifikats für jede Benutzer-ID.
Ich habe mich gefragt, welche Methode am häufigsten angewendet wird. Was sind die Best Practices? Wenn ich mit # 3 gehen sollte, was sind die besten Möglichkeiten, dies zu tun?
Etwas, das auch mit Smartphone-Apps problemlos funktioniert, ist ein zusätzlicher Bonus.
Aktualisieren
Lassen Sie mich meine Aussage "den Authentifizierungsteil selbst codieren" klarstellen, da einige der Antworten darauf hindeuten, dass er missverstanden wurde - mein Nachteil, dass ich nicht klar bin.
Das heißt nicht, dass ich selbst Kryptomaterial schreibe. Es bedeutet nur, dass ich Kryptoroutinen explizit aufrufen werde, anstatt dies implizit abhängig von IIS oder einem anderen Webserver zu tun.