ASP.NET


Jag har tidigare skrivit om det här felet som uppstår om man skall kommunicera med en server via SSL och det certifikat som servern använder på något sätt inte är gilltigt. Antigen litar maninte på utfärdaren, det kan vara spärrad, ingen spärrlistainformation finns med, något är fel med datumen eller någonting annat.

I mitt förra inlägg skrev jag exempel på hur man i kod kan undvika kontroll av sådana SSL-certifikat. Nu är det ju inte alltid man vill eller kan ändra koden, så hur gör man om man annars då? Jo, först och främst kan man se om man inte kan installera root-certifikatet till den som har utfärdat SSL-certifikatet. Det bör man kunna göra även om man har ett internt certifikat. Har man använt SelfSSL eller liknande kan det uppstå problem, men skapar man det på den dator som skall ta emot responsen borde även det fungera eftersom det då blir den datorn (klienten) som har utfärdat certifikatet (detta har jag dock inte provat!).

Men sen kan man ha flera problem, exempelvis att certifikatet inte innehåller någon revocation-information eller att namnet inte stämmer med de anrop du gör. Detta löser man genom att i machine.config ändra värden i servicePointManager. Om man inte vill göra något namn- eller revokeringskontroll ställer man in den enligt följande:

<servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" />

Enda nackdelen är väl att man sätter delar av säkerheten ur spel, så gör det här endast i utvecklings- och testmiljöer!

Du kan hitta mera info om detta på MSDN

Annonser

Microsoft har släppt en ny site som omhandlar IIS, och speciellt i syfte att nå ut med IIS 7.0 som kommer med Vista och Longhorn Server. Du hittar den på http://www.iis.net

Om du använder ett certifikat som på något sätt är felaktigt eller kommer från en utfärdare som du inte litar på, får du upp en dialog som frågar om du vill lita på certifikatet. Alltså om du surfar med en webbläsare. Om du använder en egenutvecklad klient så får du troligen ett exception i koden:

An unhandled exception of type 'System.Net.WebException' occurred in system.dll

Additional information: The underlying connection was closed: Could not establish trust relationship with remote server.

För att komma runt det här måste du i koden skapa din egen klass som skall implementera ICertificatePolicy. I ICertificatePolicy finns en funktion som du måste överlagra, CheckValidationResult.

Den returnerar true eller false, beroende på om du i din kod vill lite på certifikatet. Här kan man u då välja om man vill göra någon kontroll av certifikatet eller bara släppa det rakt genom.

public class CertificatePolicy : System.Net.ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
  {
    return true;
  }
}

För att din applikation skall använda klassen är det bara att ange detta i koden genom att skapa en instansav den och tilldela instansen till CertificatePolicy:

System.Net.ServicePointManager.CertificatePolicy = new CertificatePolicy();

Vill man göra en kontroll av certifikatet görs det i funktionen CheckValidationResult. Då kan man exempelvis titta på utfärdare:

string strIssuer = cert.GetIssuerName(); 

Eller men kan titta på från vilken IP anropet kom:

string strIP = req.RequestUri.Host 

Jon Galloway  har listat sina tio favoritbloggar. Eller egentligen är det de bloggar som har mest träffar och som håller sig till de ämnen de utger sig för att handla, alltså .Net. De skall också a RSS-feeds.

Det finns en förvånande mängd design exempel för webbapplikationer att tillgå ute på nätet. Blandet med lite länkar som har information om CSS'er finns även en del länkar där man kan hitta många snygga templates som man kan ladda ner om man skall skapa en webbsite.