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://learn.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.
ViewState versleutelen in ASP.NET
Naast de uitgaande verbindingen kun je ook de gegevens die je ASP.NET-webapplicatie naar de bezoeker stuurt beter beveiligen. Voor beveiliging en/of privacy kan het belangrijk zijn dat jij jouw ASP.NET ViewState versleutelt. In een notendop is de ASP.NET view state een techniek om wijzigingen in de staat van WebForms bij te houden voor postbacks. Je kunt je voorstellen dat hier belangrijke bezoekersinformatie in opgeslagen kan zitten. Dat moet dus versleuteld en beveiligd worden.
Met de volgende regel in het web.config-bestand wordt de ASP.NET ViewState versleuteld:
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="AES" decryption="Auto" />
Let wel, dit zijn standaard waarden. Plaats dit voorbeeld in de <system.web>-node van het web.config-bestand.
Gevorderde ASP.NET-programmeurs kunnen hier eigen instellingen gebruiken. Via Microsofts .NET Web Development and Tools Blog vind je hierover meer informatie: Cryptographic Improvements in ASP.NET 4.5, pt. 2 en MachineKeyValidation Enum.
HMACSHA512 in plaats van AES
Als je wilt overstappen van standaard AES-versleuteling naar HMACSHA512, dan neem je het volgende op in web.config:
<machineKey decryption="Auto" decryptionKey="AutoGenerate,IsolateApps" validation="HMACSHA512" validationKey="AutoGenerate,IsolateApps" />

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…