Berechtigung für IUSR für CertOpenSystemStore()

Berechtigung für IUSR für CertOpenSystemStore()

Meine CGI-Anwendung versucht, mithilfe von SSPI Schannel eine TLS-Verbindung mit einem anderen Server herzustellen. http://www.coastrd.com/c-schannel-smtp

Der Handshake-Prozess beginnt mit der Überprüfung auf ein Zertifikat im Zertifikatsspeicher „MY“ http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx

Diese Funktion gibt Null zurück und GetLastError gibt auch Null zurück!? Ich gehe davon aus, dass dies ein Berechtigungsproblem ist. Wie bekomme ich dies zum Laufen, ohne beispielsweise IUSR zum Administrator zu machen?

HINZUGEFÜGT

Für den Zugriff auf Benutzerzertifikate ist die Ausführung als der jeweilige Benutzer erforderlich. Für den Zugriff auf den privaten Schlüssel des Benutzers ist entweder erforderlich, dass sich der Benutzer lokal mit dem Kennwort angemeldet hat oder dass der Server für die Delegierung aktiviert ist.

Maschinenzertifikate sind für jeden lesbar, für den Zugriff auf den privaten Schlüssel sind jedoch Administratorrechte (oder ein lokaler Benutzer) erforderlich, sofern Sie die ACL nicht anpassen.

HINZUGEFÜGT

In dieser Situation gibt es keine Beschränkungen bezüglich der Zertifikate, aber „MEIN“ Zertifikatsspeicher ist leer und ich möchte nicht extra dafür ein Zertifikat kaufen.

Ich verwende derzeit WS2003. Der Server, mit dem ich mich verbinde, ist gmail.com, um E-Mails mit TLS zu senden. Mein Code kann nach einem Zertifikat suchen, aber ich habe keins. Nach allem, was ich gelesen habe, scheint es ein riesiger Aufwand zu sein, ein Zertifikat zu erhalten, mit Registrierung, Kauf und Installation, ansonsten bekommt man nur eine vorübergehende Lösung, die keine Hilfe ist. Sofern Sie keinen einfachen Weg kennen, ein Zertifikat zu erhalten, ist dies viel mehr Aufwand, als ich mir machen möchte, nur um E-Mails von einer CGI-App aus zu senden. Gibt es IRGENDEINE andere Möglichkeit?

Ich bin SEHR dankbar für deine Hilfe, Joe, aber 30 $/Jahr x nServers ist einfach keine Option. Ich frage mich, ob es eine Möglichkeit gibt, die Aufgabe an einen anderen Prozess zu übergeben, der mit Administratorrechten ausgeführt wird, wie vielleicht einen Dienst? Ich könnte sogar eine Anwendung erstellen, die so geplant ist, dass sie aus einem bestimmten Ordner liest und alle dort gefundenen E-Mails sendet. Ansonsten müsste ich versuchen, der CGI-Anwendung Administratorrechte zu verleihen.

HINZUGEFÜGT

Goyuix, danke für die Vorschläge. Die Herausforderung besteht darin, eine eigenständige Lösung bereitzustellen, ohne auf andere Bibliotheken wie .NET (60 MB) oder ASP mit den damit verbundenen Problemen zurückgreifen zu müssen.

Sie haben Recht, ich brauche nur die Serverauthentifizierung. Mir war nicht bewusst, dass es möglich ist, nur eine Seite zu authentifizieren. Ihre Aussage: „Kein Client-Zertifikat zu haben, sollte Sie nicht daran hindern, einen sicheren Kanal für SMTP einzurichten. Möglicherweise müssen Sie nur diesen Teil des Handshakes codieren.“ stellte sich als die Lösung heraus.

Das erinnert mich an den alten Klempnerwitz. Der Klempner wird gerufen, um den Abfluss zu entstopfen. Er wirft einen Blick darauf, holt einen Hammer heraus und schlägt einmal auf das Rohr. Er verlangt 180 $ für 5 Minuten Arbeit, aufgeschlüsselt nach 30 $ Anfahrtskosten und 150 $, um herauszufinden, wo das Rohr getroffen werden muss.

Vielen Dank euch beiden. Das war ein LANGER, harter Kampf.

Antwort1

Der einzige Grund, warum der Schannel-Code versucht, den „MY“-Speicher zu knacken, ist die Suche nach einem möglichen Zertifikat, das als Teil des anfänglichen Handshakes zur Client-Authentifizierung verwendet werden kann. In Ihrem Beispiel würde ich mir vorstellen, dass Sie sich wirklich nur um die Server-Authentifizierung kümmern (z. B. sicherstellen, dass Ihr Client mit dem Server kommuniziert, mit dem er es zu tun glaubt). Dass Sie kein Client-Zertifikat haben, sollte Sie nicht davon abhalten, einen sicheren Kanal für SMTP einzurichten. Möglicherweise müssen Sie nur diesen Teil des Handshakes codieren.

Wenn Sie auch eine Client-Authentifizierung benötigen, müssen Sie wahrscheinlich Folgendes tun:

  • Erhöhen Sie die Rechte des IUSR-Kontos und installieren Sie ein Zertifikat im Computerspeicher.
  • Ändern Sie den APP-Pool, sodass er als anderer Benutzer ausgeführt wird, und bekämpfen Sie das

Was das Korrigieren des verknüpften Codes angeht … nun – ich würde vorschlagen, den SmtpClient-Code auszuprobieren, der mit dem .NET-Framework geliefert wird, wenn das eine Option ist. Er unterstützt verschlüsselte Kommunikation und sollte theoretisch „einfach funktionieren“. Ist verwaltetes C++ überhaupt eine Option? Oder noch besser, schreiben Sie einfach einen ASP.NET-Handler dafür?

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx

Sie können auch versuchen, einige verwandte Codefragen zu stellen aufStackOverflow.com, die Leute dort können vielleicht auch helfen.

Antwort2

Die beste OptionICHSie können ein Maschinenzertifikat verwenden und dem IUSR-Konto die Berechtigung erteilen, den privaten Schlüssel des Zertifikats zu lesen. Dies ist ein manueller Schritt, aber ein sehr einfacher, der nur einmal ausgeführt werden muss.

Gibt es in Ihrer Situation andere Anforderungen, die eine Änderung der Zertifikatsberechtigungen verhindern würden?


Anweisungen für den Einstieg

Zuerst benötigen Sie ein Zertifikat. Sie können Ihr eigenes erstellen, aber je nachdem, wie Sie es verwenden möchten und von wem es validiert wird, müssen Sie möglicherweise eines kaufen. Ich werde nicht darauf eingehen, wie man ein Zertifikat erstellt. Wenn Sie noch nie mit Zertifikaten und Zertifizierungsstellen gearbeitet haben, empfehle ich Ihnen, sich zuerst damit vertraut zu machen.

Sofern Sie keine anders lautenden Kommentare abgeben, gehe ich davon aus, dass Sie Windows Server 2003 verwenden.

1) Installieren Sie das Zertifikat im Computerspeicher. Gehen Sie zu Start | Ausführen und geben Sie MMC ein, um eine leere MMC-Konsole zu erhalten. Gehen Sie zu Datei | Snap-In hinzufügen/entfernen. Klicken Sie auf die Schaltfläche Hinzufügen, um das Snap-In auszuwählen. Wählen Sie Zertifikate aus der Liste und klicken Sie auf Hinzufügen. Wählen Sie die Option Computerkonto, dann Weiter, Fertig stellen, Schließen und schließlich OK.

2) Importieren Sie das Zertifikat in den Computerspeicher. Erweitern Sie den Baum und wählen Sie den persönlichen Ordner. Klicken Sie mit der rechten Maustaste auf „Persönlich“ und wählen Sie „Alle Aufgaben“, „Importieren“. Folgen Sie dem Assistenten, um den Vorgang abzuschließen. Das Zertifikat sollte sich jetzt im Computerspeicher befinden.

3) Anpassen der Berechtigungen für den privaten Schlüssel. Unter Windows 2008 wird dies der GUI des Certificate Managers hinzugefügt. Unter Windows 2003 müssen Sie dieWindows Server 2003 Resource Kit-Tools. Verwenden Sie zum Festlegen von Berechtigungen das folgende Befehlsformat:

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

Dabei ist „LOCAL_MACHINE\My“ der persönliche Zertifikatspeicher auf dem lokalen Computer, „mycert“ der Name Ihres Zertifikats und USER_ACCOUNT das Konto, dem Leseberechtigungen für den privaten Schlüssel erteilt werden. Sie können das IUSR-Konto ausprobieren, müssen aber möglicherweise den „NETWORK SERVICE“ verwenden, je nachdem, in welchem ​​genauen Kontext Ihre CGI-App ausgeführt wird. Sie müssen IIS neu starten, damit die Änderungen wirksam werden.Dokumentation für WinHttpCertCfgdeckt ab, was es tut.

Sie sollten nun über die Berechtigung zum Zugriff auf den privaten Schlüssel verfügen. Sie verwenden weiterhin CertOpenSystemStore mit dem Flag MY.

Hoffentlich hilft das.


Bearbeitung 2:

Ein Zertifikat einer anerkannten Stelle kann man ganz einfach bei GoDaddy erwerben. Für 30 $ bekommt man ein SSL-Zertifikat mit einer Gültigkeit von 1 Jahr. Wenn man ein bisschen herumsucht, gibt es auch andere Anbieter, die vielleicht billiger sind. Das ist nicht allzu schwierig. Die meisten Websites sind sehr benutzerfreundlich und machen den Kauf eines Zertifikats einfach.

Da Sie eine gegenseitige Authentifizierung durchführen, benötigen Sie ein Zertifikat mit einer gültigen Autorität und nicht nur ein selbstsigniertes Zertifikat, das Sie selbst erstellen können, da der Gmail-Server keine Möglichkeit hätte, es zu überprüfen.

verwandte Informationen