Als je vanuit ASP.NET een externe webservice aanspreekt, dan doe je dat bij voorkeur beveiligd: je versleutelt de verbinding met TLS. Maar helaas is de TLS-versie van de uitgaande .NET verbinding niet altijd veilig genoeg ingesteld. In dit artikel vind je daarom aanvullende informatie hoe je dit beter kunt instellen en gebruiken in je .NET webapplicatie.
Daar waar we het over TLS hebben bedoelen we vaak de verbinding van de computer (de client) naar webserver en website, over het Transport Layer Security (TLS) protocol. Zoals je wellicht weet is TLS de opvolger van SSL.
Maar, als een ASP.NET-website verbinding maakt met een externe endpoint (website, service, API, en dergelijke), dan is die ASP.NET-website de client. En ook dan is sterke cryptografie belangrijk! Hier laat ik je in het kort zien hoe je het gebruik van TLS 1.2 of zelfs TLS 1.3 kunt forceren voor uitgaande ASP.NET verbindingen.
Je kunt in jouw .NET code een bepaalde TLS-versie forceren met het SecurityProtocolType enum type, zoals hier weergegeven als voorbeeld:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls12;
Dit forceert TLS 1.2, je gebruikt hier de SecurityProtocolType enumeratie om de TLS-versie te bepalen als je HTTP-API’s in het .NET Framework gebruikt, zoals WebClient, HttpWebRequest, HttpClient en SmtpClient (bij gebruik van TLS – SMTP e-mail versturen met .NET), of om een bepaalde versie in te stellen. Dit is een vaste lijst van TLS-versleutelingsprotocollen.
Maar in plaats van een vaste lijst met protocollen op te geven, kun je bepaalde protocollen die je belangrijk vindt in- of uitschakelen, terwijl je de anderen laat zoals ze zijn. Schakel TLS 1.2 en TLS 1.1 in, zonder andere versleutelingsprotocollen te beïnvloeden:
System.Net.ServicePointManager.SecurityProtocol |=
SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
Let op dat hier de C# operator |=
wordt gebruikt om Tls-flags in te schakelen zonder andere versies uit te schakelen. Met dergelijke operators kun je bijvoorbeeld ook SSL3 uitschakelen, weer zonder andere versies te beïnvloeden:
System.Net.ServicePointManager.SecurityProtocol &=
~SecurityProtocolType.Ssl3;
Maar hier moet worden gezegd: gebruik minstens TLS 1.2 en TLS 1.3 als die beschikbaar is. TLS versies 1.1, 1.0 en SSL 3 zijn hopeloos verouderd en onveilig.
Een klein C# HttpWebRequest-voorbeeld ter illustratie:
<%@ Page Language="C#" Debug="False" %>
<%@ Import Namespace="System.Net"%>
<%
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
WebRequest request = System.Net.WebRequest.Create( "https://www.howsmyssl.com/" );
try {
WebResponse response = request.GetResponse();
System.IO.Stream dataStream = response.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader( dataStream );
string responseFromServer = reader.ReadToEnd();
Response.Write( responseFromServer );
reader.Close();
response.Close();
} catch ( WebException e ) {
Response.Write( String.Concat( e.Message, e.StackTrace ) );
}
%>
Deze code maakt een HTTPS HttpWebRequest naar de website https://www.howsmyssl.com/. Die site geeft als resultaat o.a terug welke versie van TLS werd gebruikt, en of dat veilig genoeg is.
In dit voorbeeld wordt SecurityProtocolType.SystemDefault
gebruikt om aan te geven dat ASP.NET de standaard versie van het TLS versleutelingsprotocol en cryptografie van de server moet gebruiken. Je kunt deze regel vervangen door de verschillende TLS-versies en het verschil in de response zien.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
Als je geïnteresseerd bent geraakt in deze materie, dan vind je hier alle technische informatie: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls.
Systeembeheerders kunnen twee registerwaarden zetten om het .NET-Framework altijd de hoogst beschikbare TLS-versie te laten gebruiken. Dit zijn de SchUseStrongCrypto en SystemDefaultTlsVersions waarden. Sla de volgende code op als een .reg-bestand en importeer deze.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
Pst, wil je weten hoe je een stil een .reg-bestand importeert in het Windows register? Zie dan de post “Silently import .reg file in your Windows registry” op Saotn.org.
With the release of Windows Server 2022, there is now native support for hosting HTTP/3 services in IIS 10.0. Jeej! In short, here are the…