.net verbindingen
Jan Reilink

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 over hoe wij dit beter voor je instellen.

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! Vevida vindt veiligheid belangrijk. Dat is één van de reden van een gratis SSL-certificaat in ons Veilige Hosting pakket. En omdat wij veiligheid zo belangrijk vinden forceren wij vanaf februari 2019 het gebruik van TLS 1.2 als standaard versleutelingsprotocol voor uitgaande ASP.NET verbindingen.

Met deze serverbrede wijziging nemen wij jou de zorg voor het goed instellen van deze beveiliging weg. Wij zorgen ervoor dat de gebruikte TLS-versie en cryptografie zo hoog mogelijk is. Hiermee maken wij ASP.NET hosting weer een beetje veiliger, want ASP.NET probeert eerst TLS-versie 1.2 en valt terug op 1.1 als deze niet beschikbaar is.

Deze wijziging is nodig omdat ASP.NET vaak nog TLS 1.0 als het standaard versleutelingsprotocol voor uitgaande verbindingen gebruikt, tenzij anders is opgegeven in de scripting door de programmeur.

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;

Gebruik 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), of om een bepaalde versie in te stellen.

Dit is dus niet meer nodig.

Als je om wat voor reden dan ook liever een uitgaande verbinding met TLS 1.1 versleuteling maakt, dan kun je die nog steeds instellen. Maar realiseer je dat dit geen goede versleuteling is. Ook bestaat de kans dat jouw website niet automatisch de voordelen van nieuwe, toekomstige, TLS versies gebruikt, zoals TLS 1.3.

Indien nodig zou je TLS 1.1 nog kunnen forceren met:

System.Net.ServicePointManager.SecurityProtocol = 
	SecurityProtocolType.Tls11;

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 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.1, liever TLS 1.2 en laat bij voorkeur onze servers de versie kiezen. Dan gebruikt jouw code automatisch TLS 1.3 zodra die beschikbaar komt in Windows Server.

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.

Jan Reilink Systeembeheerder

Jan Reilink is ruim 10 jaar in dienst bij Vevida als systeembeheerder. Zijn specialiteiten zijn Windows Server, IIS, PHP, websites, optimalisatie en beveiliging. Daarnaast houdt Jan al jaren een technisch blog saotn.org bij met nieuws en artikelen over deze onderwerpen.