3 Stimmen

Wie automatisiere ich den Zugriff auf eine IIS-Website mit der Option "Client-Zertifikate erforderlich"?

Ich arbeite an einer IIS6/ASP.NET-Website, die "Client-Zertifikate" in Form einer Smartcard erfordern muss (insbesondere eine Gemeinsame Zugangskarte ). Ich muss ein paar Dienste erstellen, um auf verschiedene URLs zuzugreifen, um Dinge wie die Aktualisierung von Suchindizes, das Aufwärmen von Sharepoint-Seiten und andere Aufgaben zu erledigen.

Wie kann dies geschehen, da die Website den Zugang nur mit einem Zertifikat erlaubt, das sich auf der Smartcard befindet? Ich habe versucht, das Zertifikat (.cer) zu laden und es wie folgt einzulesen:

HttpWebRequest request = (HttpWebRequest)
            WebRequest.Create("https://.../someURL.html");

const string certFilename = @"my.cer";
var cert = X509Certificate2.CreateFromCertFile(certFilename);
cert.Import(certFilename, "my pin", X509KeyStorageFlags.Exportable);
request.ClientCertificates.Add(cert);
HttpWebResponse response = (HttpWebResponse)
       request.GetResponse();

Aber ich erhalte eine 403 Forbidden.

1voto

PerlDev Punkte 437

Sie können Ihr Zertifikat wie folgt aus Ihrem persönlichen Speicher laden:

 System.Security.Cryptography.X509Certificates.X509Certificate cert = FindCertByName(PART_AFTER_CN_IN_CERT_SUBJECT);
request.ClientCertificates.Add(cert);

..

        private System.Security.Cryptography.X509Certificates.X509Certificate FindCertByName(string simpleName)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            foreach (X509Certificate cert in store.Certificates)
            {
                if( cert.Subject.Contains("CN="+simpleName))
                {
                    return cert;
                }
            }

            string msg = "The '" + simpleName + "' security certificate is not installed on this system!";
            throw new ApplicationException(msg);
        }

1voto

Spencer Punkte 451

Dies ist keine Antwort, aber ich habe nicht genug Ansehen, um einen Kommentar abzugeben. Die .cer-Datei enthält nicht den privaten Schlüssel, sondern nur das öffentliche Zertifikat, so dass Sie dieses nicht verwenden können. Sie müssen den privaten Schlüssel direkt von der Smartcard laden. Ich glaube, dazu müssen Sie CSP-Parameter mit dem CSP-Namen des Smartcard-Lesegeräts erstellen und dann das x509-Zertifikat mit dem privaten Schlüssel direkt von der Karte laden. Soweit ich weiß, wird der private Schlüssel nicht automatisch in den MY-Speicher des aktuellen Benutzers oder des aktuellen Rechners installiert, so dass Sie ihn nicht von dort laden können. Ich habe leider keinen Code.

0voto

Ryan Hayes Punkte 5301

Wenn Sie SharePoint 2010 verwenden:

  1. Gehen Sie zur SharePoint-Zentralverwaltung
  2. Gehen Sie zu Anwendungsmanagement > Webanwendungen verwalten
  3. Heben Sie Ihre vordere SharePoint-Website hervor.
  4. Wählen Sie "Erweitern" aus dem oberen Menü.

Dabei wird eine separate SharePoint-Website erstellt, die genau dieselbe Konfiguration und dieselben Inhaltsdatenbanken verwendet, aber an einem anderen Ort gehostet und separat gesichert werden kann. Auf diese Weise können Sie Ihre normale, sichere SharePoint-Instanz einrichten, die vollständig gesperrt ist, aber gleichzeitig eine andere Version davon an einem anderen Ort hosten, die eine andere Sicherheit hat, auf die Sie anderen Zugriff geben können, nämlich Ihrem Dienst, der Indizes oder andere Aufgaben ausführen muss.

0voto

Jason M Punkte 514

Haben Sie versucht, die X509 zum Cache der Anmeldeinformationen hinzuzufügen? Beispiel:

X509Certificate cert = new X509Certificate("sslCert.txt"); X509CertificateCollection certColl = new X509CertificateCollection(); certColl.Add(cert); CredentialCache credCache = new CredentialCache(); credCache.Add(new Uri(string.Concat(outputReport.reportURI)), "Basic", new NetworkCredential(NexConfig.User, NexConfig.Pass)); wr.AllowAutoRedirect = false; wr.ClientCertificates = certColl; wr.Credentials = credCache; HttpWebResponse resp = (HttpWebResponse)wr.GetResponse();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X