Totalcmd und Clientzertifikate
Moderators: Hacker, Stefan2, white
Totalcmd und Clientzertifikate
Hallo, ich benutze den Totalcmd mit dem WebDav Plugin über eine SSL Verbindung die auch gut funktioniert. Aus Sicherheitsgründen musste ich zusätzlich Clientzertifikate einführen womit die Verbindung nicht mehr geht da Totalcmd bei Clientzertifikate nicht den Zertifikatsspeicher von Windows nutzt (im Gegensatz zur SSL Verschlüsslung).
Wird dies noch integriert oder gibt es eine Möglichkeit die ich übersehen habe?
Helge
Wird dies noch integriert oder gibt es eine Möglichkeit die ich übersehen habe?
Helge
- ghisler(Author)
- Site Admin
- Posts: 50532
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Leider muss ich da passen, ich wuesste schlicht nicht, wie man so etwas einbaut. Wenn jemand Beispielcode für mich hat, werde ich das aber gerne einbauen.
Das Plugin ist übrigens Open Source (vor allem aus Sicherheitsgründen), so dass jeder das bei Bedarf einbauen könnte...
Das Plugin ist übrigens Open Source (vor allem aus Sicherheitsgründen), so dass jeder das bei Bedarf einbauen könnte...
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
Ggf. hilft dir dieses Beispiel weiter:ghisler(Author) wrote:Wenn jemand Beispielcode für mich hat
http://www.codeproject.com/KB/IP/wininet_ssl___certificate.aspx
Gruß
CoolWater
- ghisler(Author)
- Site Admin
- Posts: 50532
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Danke für den Link, sieht ziemlich einfach aus, das einzubauen. Jetzt fehlt mir nur noch eine Funktion zum Auflisten aller Client-Zertifikate, damit der User eines auswählen kann im Verbindungsdialog...
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
Das ist ja klasse hier
, nützt eventuell das hier was?
Anzeigen des Zertifikats-Auswahldialogs (z.B. damit ein Benutzer ein passendes Zertifikat aus dem Speicher auswählen kann)
X509Certificate2Collection certs =
X509Certificate2UI.SelectFromCollection(store.Certificates,
"Ihre Zertifikate",
"Bitte auswählen",
X509SelectionFlag.SingleSelection);
ist ein Ausschnitt aus dem Link den ich erst Morgen (3. Tag) reinsetzen kann
Gruß Helge

Anzeigen des Zertifikats-Auswahldialogs (z.B. damit ein Benutzer ein passendes Zertifikat aus dem Speicher auswählen kann)
X509Certificate2Collection certs =
X509Certificate2UI.SelectFromCollection(store.Certificates,
"Ihre Zertifikate",
"Bitte auswählen",
X509SelectionFlag.SingleSelection);
ist ein Ausschnitt aus dem Link den ich erst Morgen (3. Tag) reinsetzen kann

Gruß Helge
- ghisler(Author)
- Site Admin
- Posts: 50532
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Leider nein, das ist .Net, ich brauche eine Windows API-Funktion. Es wird wohl auf CertEnumCertificatesInStore hinauslaufen. Leider liefert das direkt das komplette Zertifikat zurück - das lässt sich weder als Name anzeigen, noch speichern...
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
Schau mal hier: http://msdn.microsoft.com/en-us/library/aa382363(VS.85).aspxghisler(Author) wrote:Leider nein, das ist .Net, ich brauche eine Windows API-Funktion. Es wird wohl auf CertEnumCertificatesInStore hinauslaufen. Leider liefert das direkt das komplette Zertifikat zurück - das lässt sich weder als Name anzeigen, noch speichern...
Code: Select all
while(pCertContext = CertEnumCertificatesInStore(hCertStore, pCertContext))
{
if(CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, pszNameString, 128))
printf("\nCertificate for %s \n",pszNameString);
else
fprintf(stderr,"CertGetName failed. \n");
}
Oder statt des ErrorDlgs folgendes:
Code: Select all
DWORD dwCert = 0;
InternetSetOption(m_hRequest, INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT, &dwCert, sizeof(dwCert));
Geht doch alles

Gruß
CoolWater
- ghisler(Author)
- Site Admin
- Posts: 50532
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Danke, sieht gut aus! Die Frage ist nur, ob CERT_NAME_SIMPLE_DISPLAY_TYPE das Zertifikat eindeutig identifiziert, oder ob es mehrere Zertifikate mit demselben Namen geben kann. Das Plugin würde den Namen dann in den settings speichern, und genau diesen Namen bei der Verbindung zum Laden des Zertifikats verwenden.
INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT geht laut Microsoft nicht, siehe:
http://support.microsoft.com/?scid=kb%3Ben-us%3B224282&x=11&y=17
Ja, das habe ich bei MSDN auch gesehen, ist aber echt mühsam, wenn man bei jeder Verbindung das Zertifikat erneut wählen muss...Alternativ kannst du auch GetLastError() aufrufen wenn HttpSendRequest nicht erfolgreich war... Ist GetLastError() == ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED, dann mit InternetErrorDlg das Fenster zur Zertifikatsauswahl anzeigen und fertig.
INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT geht laut Microsoft nicht, siehe:
http://support.microsoft.com/?scid=kb%3Ben-us%3B224282&x=11&y=17
The INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT option to select a particular client certificate is not supported and should not be used. The result is unpredictable if the client has more than one client certificate on the computer.
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
Dann speicher doch zusätzlich noch den Issuer und die SerialNumber aus der CERT_INFO-Struktur. Mit diesen beiden Werten kannst du dann CertFindCertificateInStore aufrufen und als dwFindType CERT_FIND_SUBJECT_CERT nehmen. Das zusammen ist dann eindeutig genugghisler(Author) wrote:Das Plugin würde den Namen dann in den settings speichern, und genau diesen Namen bei der Verbindung zum Laden des Zertifikats verwenden.

Gruß
CoolWater
- ghisler(Author)
- Site Admin
- Posts: 50532
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Gute Idee - würden der Name und die Serial Number zusammen auch reichen?
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
- ghisler(Author)
- Site Admin
- Posts: 50532
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Den von CERT_NAME_SIMPLE_DISPLAY_TYPE zurückgelieferten - keine Ahnung, welcher das dann ist...
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
Hmm, das kann unterschiedlich sein, siehe:ghisler(Author) wrote:Den von CERT_NAME_SIMPLE_DISPLAY_TYPE zurückgelieferten - keine Ahnung, welcher das dann ist...
http://msdn.microsoft.com/en-us/library/aa376086(VS.85).aspx
Gruß
CoolWater