---
title: "Configure ServicePointManager.SecurityProtocol through AppSettings"
excerpt: "Usually .NET automatically finds a security protocol in common, but sometimes you have to update ServicePointManager.SecurityProtocol explicitly."
publishDate: "2020-10-21T00:00:00"
createDate: "2020-10-15T20:52:44.03"
updateDate: "2020-11-08T10:26:23.77"
category: "dotnet"
categoryName: ".NET"
tags: [".NET",".NET Framework","dotnet"]
permalink: "/blog/dotnet/configure-servicepointmanager-securityprotocol-through-appsettings"
canonical: "/blog/dotnet/configure-servicepointmanager-securityprotocol-through-appsettings"
image: null
imageAlt: ""
imageBackgroundColor: "#512bd4"
thumbnailImage: {"src":"/media/z2khm2a1/dotnet-logo.png","focalPoint":{"left":0.5,"top":0.5},"crops":[{"alias":"thumbnail","width":250,"height":250,"coordinates":null}]}
thumbnailImageAlt: ".NET Logo"
metaTitle: "Configure ServicePointManager.SecurityProtocol through AppSettings"
metaDescription: "Usually .NET automatically finds a security protocol in common, but sometimes you have to update ServicePointManager.SecurityProtocol explicitly."
ogTitle: "Configure ServicePointManager.SecurityProtocol through AppSettings"
ogDescription: "Usually .NET automatically finds a security protocol in common, but sometimes you have to update ServicePointManager.SecurityProtocol explicitly."
ogImage: null
ogImageAlt: ""
relatedPostKeys: ["e8911bbfbdfe4c05bd5aaf8040221a7e","482565c0618a450cb89db4ce574a3afe"]
noIndex: false
noFollow: false
sitemapExclude: false
source: {"nodeId":1358,"contentKey":"70714779997949e7930db0ecb2a21f24","sortOrder":59}
---

As time passes, webservers move to newer security protocols and remove deprecated security protocols. This may lead to errors in your application when you make HTTP requests. Usually .NET automatically finds a security protocol in common, but sometimes you have to update `ServicePointManager.SecurityProtocol` explicitly.

You can remove security protocols using a binary AND operator and a Bitwise complement to inverse the bits:

<pre style="color:#d1d1d1;background:#000000;"><span style="color:#9999a9; ">// removes SSL3</span>&#10;ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol &amp;<span style="color:#d2cd86; ">=</span> ~SecurityProtocolType<span style="color:#d2cd86; ">.</span>Ssl3<span style="color:#b060b0; ">;</span>&#10;<span style="color:#9999a9; ">// remove multiple protocols, SSL3 and TLS 1.0</span>&#10;ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol &amp;<span style="color:#d2cd86; ">=</span> ~<span style="color:#d2cd86; ">(</span>SecurityProtocolType<span style="color:#d2cd86; ">.</span>Ssl3 | SecurityProtocolType<span style="color:#d2cd86; ">.</span>Tls<span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;</pre>

You can add security protocols using a Binary OR operator:

<pre style="color:#d1d1d1;background:#000000;"><span style="color:#9999a9; ">// add TLS 1.1</span>&#10;ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol |<span style="color:#d2cd86; ">=</span> SecurityProtocolType<span style="color:#d2cd86; ">.</span>Tls11<span style="color:#b060b0; ">;</span>&#10;<span style="color:#9999a9; ">// add multiple protocols, TLS 1.1 and TLS 1.2</span>&#10;ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol |<span style="color:#d2cd86; ">=</span> SecurityProtocolType<span style="color:#d2cd86; ">.</span>Tls11 | SecurityProtocolType<span style="color:#d2cd86; ">.</span>Tls12<span style="color:#b060b0; ">;</span>&#10;</pre>

Instead of hardcoding the additions/removals into your codebase, you could also use config-files with appSettings. Here's an example of what your configuration file would look like:

<pre style="color:#000000;background:#ffffff;"><span style="color:#7f0055; ">&lt;?</span><span style="color:#7f0055; font-weight:bold; ">xml</span><span style="color:#7f0055; "> </span><span style="color:#7f0055; ">version</span><span style="color:#7f0055; ">=</span><span style="color:#2a00ff; ">"</span><span style="color:#7f0055; font-weight:bold; ">1.0</span><span style="color:#2a00ff; ">"</span><span style="color:#7f0055; "> </span><span style="color:#7f0055; ">encoding</span><span style="color:#7f0055; ">=</span><span style="color:#2a00ff; ">"</span><span style="color:#2a00ff; ">utf-8</span><span style="color:#2a00ff; ">"</span><span style="color:#7f0055; "> </span><span style="color:#7f0055; ">?&gt;</span>&#10;<span style="color:#7f0055; ">&lt;</span><span style="color:#7f0055; ">configuration</span><span style="color:#7f0055; ">&gt;</span>&#10;  <span style="color:#7f0055; ">&lt;</span><span style="color:#7f0055; ">startup</span><span style="color:#7f0055; ">&gt;</span>&#10;    <span style="color:#7f0055; ">&lt;</span><span style="color:#7f0055; ">supportedRuntime</span> version=<span style="color:#2a00ff; ">"</span><span style="color:#2a00ff; ">v4.0</span><span style="color:#2a00ff; ">"</span> sku=<span style="color:#2a00ff; ">"</span><span style="color:#2a00ff; ">.NETFramework,Version=v4.7.2</span><span style="color:#2a00ff; ">"</span> <span style="color:#7f0055; ">/&gt;</span>&#10;  <span style="color:#7f0055; ">&lt;/</span><span style="color:#7f0055; ">startup</span><span style="color:#7f0055; ">&gt;</span>&#10;  <span style="color:#7f0055; ">&lt;</span><span style="color:#7f0055; ">appSettings</span><span style="color:#7f0055; ">&gt;</span>&#10;    <span style="color:#7f0055; ">&lt;</span><span style="color:#7f0055; ">add</span> key=<span style="color:#2a00ff; ">"</span><span style="color:#2a00ff; ">SecurityProtocols.Remove</span><span style="color:#2a00ff; ">"</span> value=<span style="color:#2a00ff; ">"</span><span style="color:#2a00ff; ">Ssl3,Tls</span><span style="color:#2a00ff; ">"</span> <span style="color:#7f0055; ">/&gt;</span>&#10;    <span style="color:#7f0055; ">&lt;</span><span style="color:#7f0055; ">add</span> key=<span style="color:#2a00ff; ">"</span><span style="color:#2a00ff; ">SecurityProtocols.Add</span><span style="color:#2a00ff; ">"</span> value=<span style="color:#2a00ff; ">"</span><span style="color:#2a00ff; ">Tls11,Tls12</span><span style="color:#2a00ff; ">"</span> <span style="color:#7f0055; ">/&gt;</span>&#10;  <span style="color:#7f0055; ">&lt;/</span><span style="color:#7f0055; ">appSettings</span><span style="color:#7f0055; ">&gt;</span>&#10;<span style="color:#7f0055; ">&lt;/</span><span style="color:#7f0055; ">configuration</span><span style="color:#7f0055; ">&gt;</span>&#10;</pre>




In your application, run the following methods `RemoveSecurityProtocols` then `AddSecurityProtocols`:




<pre style="color:#d1d1d1;background:#000000;"><span style="color:#e66170; font-weight:bold; ">private</span> <span style="color:#e66170; font-weight:bold; ">static</span> <span style="color:#e66170; font-weight:bold; ">void</span> RemoveSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span>&#10;<span style="color:#b060b0; ">{</span>&#10;    <span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolsToRemove <span style="color:#d2cd86; ">=</span> ConfigurationManager<span style="color:#d2cd86; ">.</span>AppSettings<span style="color:#d2cd86; ">[</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">SecurityProtocols.Remove</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">]</span>&#10;        ?<span style="color:#d2cd86; ">.</span>Split<span style="color:#d2cd86; ">(</span><span style="color:#00c4c4; ">','</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#d2cd86; ">.</span>Select<span style="color:#d2cd86; ">(</span>o <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">&gt;</span> o<span style="color:#d2cd86; ">.</span>Trim<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#d2cd86; ">.</span>ToArray<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;&#10;    <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>securityProtocolsToRemove <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#e66170; font-weight:bold; ">null</span> || securityProtocolsToRemove<span style="color:#d2cd86; ">.</span>Length <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#008c00; ">0</span><span style="color:#d2cd86; ">)</span>&#10;    <span style="color:#b060b0; ">{</span>&#10;        <span style="color:#e66170; font-weight:bold; ">return</span><span style="color:#b060b0; ">;</span>&#10;    <span style="color:#b060b0; ">}</span>&#10;&#10;    <span style="color:#e66170; font-weight:bold; ">foreach</span> <span style="color:#d2cd86; ">(</span><span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolString <span style="color:#e66170; font-weight:bold; ">in</span> securityProtocolsToRemove<span style="color:#d2cd86; ">)</span>&#10;    <span style="color:#b060b0; ">{</span>&#10;        SecurityProtocolType securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;        <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>Enum<span style="color:#d2cd86; ">.</span>TryParse<span style="color:#d2cd86; ">(</span>securityProtocolString<span style="color:#d2cd86; ">,</span> <span style="color:#e66170; font-weight:bold; ">out</span> securityProtocolEnum<span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#b060b0; ">{</span>&#10;            <span style="color:#9999a9; ">// removes security protocol using binary operation</span>&#10;            ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol &amp;<span style="color:#d2cd86; ">=</span> ~securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;        <span style="color:#b060b0; ">}</span>&#10;    <span style="color:#b060b0; ">}</span>&#10;<span style="color:#b060b0; ">}</span>&#10;&#10;<span style="color:#e66170; font-weight:bold; ">private</span> <span style="color:#e66170; font-weight:bold; ">static</span> <span style="color:#e66170; font-weight:bold; ">void</span> AddSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span>&#10;<span style="color:#b060b0; ">{</span>&#10;    <span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolsAdd <span style="color:#d2cd86; ">=</span> ConfigurationManager<span style="color:#d2cd86; ">.</span>AppSettings<span style="color:#d2cd86; ">[</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">SecurityProtocols.Add</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">]</span>&#10;        ?<span style="color:#d2cd86; ">.</span>Split<span style="color:#d2cd86; ">(</span><span style="color:#00c4c4; ">','</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#d2cd86; ">.</span>Select<span style="color:#d2cd86; ">(</span>o <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">&gt;</span> o<span style="color:#d2cd86; ">.</span>Trim<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#d2cd86; ">.</span>ToArray<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;&#10;    <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>securityProtocolsAdd <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#e66170; font-weight:bold; ">null</span> || securityProtocolsAdd<span style="color:#d2cd86; ">.</span>Length <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#008c00; ">0</span><span style="color:#d2cd86; ">)</span>&#10;    <span style="color:#b060b0; ">{</span>&#10;        <span style="color:#e66170; font-weight:bold; ">return</span><span style="color:#b060b0; ">;</span>&#10;    <span style="color:#b060b0; ">}</span>&#10;&#10;    <span style="color:#e66170; font-weight:bold; ">foreach</span> <span style="color:#d2cd86; ">(</span><span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolString <span style="color:#e66170; font-weight:bold; ">in</span> securityProtocolsAdd<span style="color:#d2cd86; ">)</span>&#10;    <span style="color:#b060b0; ">{</span>&#10;        SecurityProtocolType securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;        <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>Enum<span style="color:#d2cd86; ">.</span>TryParse<span style="color:#d2cd86; ">(</span>securityProtocolString<span style="color:#d2cd86; ">,</span> <span style="color:#e66170; font-weight:bold; ">out</span> securityProtocolEnum<span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#b060b0; ">{</span>&#10;            <span style="color:#9999a9; ">// adds security protocol using binary operation</span>&#10;            ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol |<span style="color:#d2cd86; ">=</span> securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;        <span style="color:#b060b0; ">}</span>&#10;    <span style="color:#b060b0; ">}</span>&#10;<span style="color:#b060b0; ">}</span>&#10;</pre>

Here's a sample .NET Framework console application that sets the available security protocols to SSL3 only. This will intentionally fail to match security protocols when requesting 'swimburger.net':

<pre style="color:#d1d1d1;background:#000000;"><span style="color:#e66170; font-weight:bold; ">var</span> originalSecurityProtocol <span style="color:#d2cd86; ">=</span> ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol<span style="color:#b060b0; ">;</span>&#10;<span style="color:#e66170; font-weight:bold; ">try</span>&#10;<span style="color:#b060b0; ">{</span>&#10;    Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">Request swimburger.net using SSL3, this should fail. Press any key to start request.</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;    Console<span style="color:#d2cd86; ">.</span>ReadKey<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;    ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol <span style="color:#d2cd86; ">=</span> SecurityProtocolType<span style="color:#d2cd86; ">.</span>Ssl3<span style="color:#b060b0; ">;</span>&#10;    await httpClient<span style="color:#d2cd86; ">.</span>GetAsync<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">https://swimburger.net</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;<span style="color:#b060b0; ">}</span>&#10;<span style="color:#e66170; font-weight:bold; ">catch</span> <span style="color:#d2cd86; ">(</span>HttpRequestException ex<span style="color:#d2cd86; ">)</span>&#10;<span style="color:#b060b0; ">{</span>&#10;    Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span>ex<span style="color:#d2cd86; ">.</span>ToString<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;<span style="color:#b060b0; ">}</span>&#10;</pre>

The console output will look like this:

<pre style="color:#000000;background:#ffffff;">Request swimburger<span style="color:#008c00; ">.</span>net using SSL3<span style="color:#808030; ">,</span> this should fail<span style="color:#808030; ">.</span> Press any key to start request<span style="color:#808030; ">.</span>&#10;System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Http<span style="color:#008c00; ">.</span>HttpRequestException<span style="color:#808030; ">:</span> An error occurred while sending the request<span style="color:#808030; ">.</span> <span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">&gt;</span> System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>WebException<span style="color:#808030; ">:</span> The underlying connection was closed<span style="color:#808030; ">:</span> An unexpected error occurred on a receive<span style="color:#808030; ">.</span> <span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">&gt;</span> System<span style="color:#008c00; ">.</span>ComponentModel<span style="color:#008c00; ">.</span>Win32Exception<span style="color:#808030; ">:</span> The client and server cannot communicate<span style="color:#808030; ">,</span> because they do not possess a common algorithm&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>SSPIWrapper<span style="color:#008c00; ">.</span>AcquireCredentialsHandle<span style="color:#808030; ">(</span>SSPIInterface SecModule<span style="color:#808030; ">,</span> String package<span style="color:#808030; ">,</span> CredentialUse intent<span style="color:#808030; ">,</span> SecureCredential scc<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Security<span style="color:#008c00; ">.</span>SecureChannel<span style="color:#008c00; ">.</span>AcquireCredentialsHandle<span style="color:#808030; ">(</span>CredentialUse credUsage<span style="color:#808030; ">,</span> SecureCredential<span style="color:#808030; ">&amp;</span> secureCredential<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Security<span style="color:#008c00; ">.</span>SecureChannel<span style="color:#008c00; ">.</span>AcquireClientCredentials<span style="color:#808030; ">(</span>Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span><span style="color:#808030; ">&amp;</span> thumbPrint<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Security<span style="color:#008c00; ">.</span>SecureChannel<span style="color:#008c00; ">.</span>GenerateToken<span style="color:#808030; ">(</span>Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span> input<span style="color:#808030; ">,</span> Int32 offset<span style="color:#808030; ">,</span> Int32 count<span style="color:#808030; ">,</span> Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span><span style="color:#808030; ">&amp;</span> output<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Security<span style="color:#008c00; ">.</span>SecureChannel<span style="color:#008c00; ">.</span>NextMessage<span style="color:#808030; ">(</span>Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span> incoming<span style="color:#808030; ">,</span> Int32 offset<span style="color:#808030; ">,</span> Int32 count<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Security<span style="color:#008c00; ">.</span>SslState<span style="color:#008c00; ">.</span>StartSendBlob<span style="color:#808030; ">(</span>Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span> incoming<span style="color:#808030; ">,</span> Int32 count<span style="color:#808030; ">,</span> AsyncProtocolRequest asyncRequest<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Security<span style="color:#008c00; ">.</span>SslState<span style="color:#008c00; ">.</span>ForceAuthentication<span style="color:#808030; ">(</span>Boolean receiveFirst<span style="color:#808030; ">,</span> Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span> buffer<span style="color:#808030; ">,</span> AsyncProtocolRequest asyncRequest<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Security<span style="color:#008c00; ">.</span>SslState<span style="color:#008c00; ">.</span>ProcessAuthentication<span style="color:#808030; ">(</span>LazyAsyncResult lazyResult<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>TlsStream<span style="color:#008c00; ">.</span>CallProcessAuthentication<span style="color:#808030; ">(</span>Object state<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Threading<span style="color:#008c00; ">.</span>ExecutionContext<span style="color:#008c00; ">.</span>RunInternal<span style="color:#808030; ">(</span>ExecutionContext executionContext<span style="color:#808030; ">,</span> ContextCallback callback<span style="color:#808030; ">,</span> Object state<span style="color:#808030; ">,</span> Boolean preserveSyncCtx<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Threading<span style="color:#008c00; ">.</span>ExecutionContext<span style="color:#008c00; ">.</span>Run<span style="color:#808030; ">(</span>ExecutionContext executionContext<span style="color:#808030; ">,</span> ContextCallback callback<span style="color:#808030; ">,</span> Object state<span style="color:#808030; ">,</span> Boolean preserveSyncCtx<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Threading<span style="color:#008c00; ">.</span>ExecutionContext<span style="color:#008c00; ">.</span>Run<span style="color:#808030; ">(</span>ExecutionContext executionContext<span style="color:#808030; ">,</span> ContextCallback callback<span style="color:#808030; ">,</span> Object state<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>TlsStream<span style="color:#008c00; ">.</span>ProcessAuthentication<span style="color:#808030; ">(</span>LazyAsyncResult result<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>TlsStream<span style="color:#008c00; ">.</span>BeginWrite<span style="color:#808030; ">(</span>Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span> buffer<span style="color:#808030; ">,</span> Int32 offset<span style="color:#808030; ">,</span> Int32 size<span style="color:#808030; ">,</span> AsyncCallback asyncCallback<span style="color:#808030; ">,</span> Object asyncState<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>TlsStream<span style="color:#008c00; ">.</span>UnsafeBeginWrite<span style="color:#808030; ">(</span>Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span> buffer<span style="color:#808030; ">,</span> Int32 offset<span style="color:#808030; ">,</span> Int32 size<span style="color:#808030; ">,</span> AsyncCallback asyncCallback<span style="color:#808030; ">,</span> Object asyncState<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>PooledStream<span style="color:#008c00; ">.</span>UnsafeBeginWrite<span style="color:#808030; ">(</span>Byte<span style="color:#808030; ">[</span><span style="color:#808030; ">]</span> buffer<span style="color:#808030; ">,</span> Int32 offset<span style="color:#808030; ">,</span> Int32 size<span style="color:#808030; ">,</span> AsyncCallback callback<span style="color:#808030; ">,</span> Object state<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>ConnectStream<span style="color:#008c00; ">.</span>WriteHeaders<span style="color:#808030; ">(</span>Boolean async<span style="color:#808030; ">)</span>&#10;   <span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">-</span> End of inner exception stack trace <span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">-</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>HttpWebRequest<span style="color:#008c00; ">.</span>EndGetResponse<span style="color:#808030; ">(</span>IAsyncResult asyncResult<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Net<span style="color:#008c00; ">.</span>Http<span style="color:#008c00; ">.</span>HttpClientHandler<span style="color:#008c00; ">.</span>GetResponseCallback<span style="color:#808030; ">(</span>IAsyncResult ar<span style="color:#808030; ">)</span>&#10;   <span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">-</span> End of inner exception stack trace <span style="color:#808030; ">-</span><span style="color:#808030; ">-</span><span style="color:#808030; ">-</span>&#10;   at System<span style="color:#008c00; ">.</span>Runtime<span style="color:#008c00; ">.</span>CompilerServices<span style="color:#008c00; ">.</span>TaskAwaiter<span style="color:#008c00; ">.</span>ThrowForNonSuccess<span style="color:#808030; ">(</span>Task task<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Runtime<span style="color:#008c00; ">.</span>CompilerServices<span style="color:#008c00; ">.</span>TaskAwaiter<span style="color:#008c00; ">.</span>HandleNonSuccessAndDebuggerNotification<span style="color:#808030; ">(</span>Task task<span style="color:#808030; ">)</span>&#10;   at System<span style="color:#008c00; ">.</span>Runtime<span style="color:#008c00; ">.</span>CompilerServices<span style="color:#008c00; ">.</span>TaskAwaiter`<span style="color:#008c00; ">1.</span>GetResult<span style="color:#808030; ">(</span><span style="color:#808030; ">)</span>&#10;   at ChangeSecurityProtocols<span style="color:#008c00; ">.</span>Program<span style="color:#808030; ">.</span><span style="color:#808030; ">&lt;</span>Main<span style="color:#808030; ">&gt;</span>d<span style="color:#808030; ">_</span><span style="color:#808030; ">_</span>1<span style="color:#008c00; ">.</span>MoveNext<span style="color:#808030; ">(</span><span style="color:#808030; ">)</span> in C<span style="color:#808030; ">:</span><span style="color:#808030; ">\</span>Users<span style="color:#808030; ">\</span>niels<span style="color:#808030; ">\</span>source<span style="color:#808030; ">\</span>repos<span style="color:#808030; ">\</span>ChangeSecurityProtocols<span style="color:#808030; ">\</span>Program<span style="color:#008c00; ">.</span>cs<span style="color:#808030; ">:</span>line <span style="color:#008c00; ">22</span>&#10;</pre>

As you can see by the output, an `HttpRequestException` is thrown and the inner inner exception is "System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm".


When you add TLS1.1 & 1.2 back by running `RemoveSecurityProtocols` then `AddSecurityProtocols`, the HTTP request succeeds:




<pre style="color:#d1d1d1;background:#000000;">RemoveSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;AddSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;&#10;Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">Request swimburger.net with Tls11,Tls12 enabled, this should succeed. Press any key to start request.</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;Console<span style="color:#d2cd86; ">.</span>ReadKey<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;<span style="color:#e66170; font-weight:bold; ">var</span> response <span style="color:#d2cd86; ">=</span> await httpClient<span style="color:#d2cd86; ">.</span>GetAsync<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">https://swimburger.net</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span>$<span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">Response: {response.StatusCode}</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;</pre>

The output looks like this:

<pre style="color:#000000;background:#ffffff;">Request swimburger<span style="color:#008c00; ">.</span>net with Tls11<span style="color:#008c00; ">,</span>Tls12 enabled<span style="color:#808030; ">,</span> this should succeed<span style="color:#808030; ">.</span> Press any key to start request<span style="color:#808030; ">.</span>&#10;Response<span style="color:#808030; ">:</span> OK&#10;</pre>

Here's the entire console sample:

<pre style="color:#d1d1d1;background:#000000;"><span style="color:#e66170; font-weight:bold; ">using</span> System<span style="color:#b060b0; ">;</span>&#10;<span style="color:#e66170; font-weight:bold; ">using</span> System<span style="color:#d2cd86; ">.</span>Configuration<span style="color:#b060b0; ">;</span>&#10;<span style="color:#e66170; font-weight:bold; ">using</span> System<span style="color:#d2cd86; ">.</span>Linq<span style="color:#b060b0; ">;</span>&#10;<span style="color:#e66170; font-weight:bold; ">using</span> System<span style="color:#d2cd86; ">.</span>Net<span style="color:#b060b0; ">;</span>&#10;<span style="color:#e66170; font-weight:bold; ">using</span> System<span style="color:#d2cd86; ">.</span>Net<span style="color:#d2cd86; ">.</span>Http<span style="color:#b060b0; ">;</span>&#10;<span style="color:#e66170; font-weight:bold; ">using</span> System<span style="color:#d2cd86; ">.</span>Threading<span style="color:#d2cd86; ">.</span>Tasks<span style="color:#b060b0; ">;</span>&#10;&#10;<span style="color:#e66170; font-weight:bold; ">namespace</span> ChangeSecurityProtocols&#10;<span style="color:#b060b0; ">{</span>&#10;    <span style="color:#e66170; font-weight:bold; ">class</span> Program&#10;    <span style="color:#b060b0; ">{</span>&#10;        <span style="color:#e66170; font-weight:bold; ">private</span> <span style="color:#e66170; font-weight:bold; ">static</span> HttpClient httpClient <span style="color:#d2cd86; ">=</span> <span style="color:#e66170; font-weight:bold; ">new</span> HttpClient<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;&#10;        <span style="color:#e66170; font-weight:bold; ">static</span> async Task Main<span style="color:#d2cd86; ">(</span><span style="color:#e66170; font-weight:bold; ">string</span><span style="color:#d2cd86; ">[</span><span style="color:#d2cd86; ">]</span> args<span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#b060b0; ">{</span>&#10;            <span style="color:#e66170; font-weight:bold; ">var</span> originalSecurityProtocol <span style="color:#d2cd86; ">=</span> ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol<span style="color:#b060b0; ">;</span>&#10;            <span style="color:#e66170; font-weight:bold; ">try</span>&#10;            <span style="color:#b060b0; ">{</span>&#10;                Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">Request swimburger.net using SSL3, this should fail. Press any key to start request.</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;                Console<span style="color:#d2cd86; ">.</span>ReadKey<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;                ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol <span style="color:#d2cd86; ">=</span> SecurityProtocolType<span style="color:#d2cd86; ">.</span>Ssl3<span style="color:#b060b0; ">;</span>&#10;                await httpClient<span style="color:#d2cd86; ">.</span>GetAsync<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">https://swimburger.net</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            <span style="color:#b060b0; ">}</span>&#10;            <span style="color:#e66170; font-weight:bold; ">catch</span> <span style="color:#d2cd86; ">(</span>HttpRequestException ex<span style="color:#d2cd86; ">)</span>&#10;            <span style="color:#b060b0; ">{</span>&#10;                Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span>ex<span style="color:#d2cd86; ">.</span>ToString<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            <span style="color:#b060b0; ">}</span>&#10;&#10;            <span style="color:#9999a9; ">// update security protocols from appSettings</span>&#10;            RemoveSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            AddSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;&#10;            Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">Request swimburger.net with Tls11,Tls12 enabled, this should succeed. Press any key to start request.</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            Console<span style="color:#d2cd86; ">.</span>ReadKey<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            <span style="color:#e66170; font-weight:bold; ">var</span> response <span style="color:#d2cd86; ">=</span> await httpClient<span style="color:#d2cd86; ">.</span>GetAsync<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">https://swimburger.net</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span>$<span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">Response: {response.StatusCode}</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            Console<span style="color:#d2cd86; ">.</span>WriteLine<span style="color:#d2cd86; ">(</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">Press any key to exit.</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;            Console<span style="color:#d2cd86; ">.</span>ReadKey<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;        <span style="color:#b060b0; ">}</span>&#10;&#10;        <span style="color:#e66170; font-weight:bold; ">private</span> <span style="color:#e66170; font-weight:bold; ">static</span> <span style="color:#e66170; font-weight:bold; ">void</span> RemoveSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#b060b0; ">{</span>&#10;            <span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolsToRemove <span style="color:#d2cd86; ">=</span> ConfigurationManager<span style="color:#d2cd86; ">.</span>AppSettings<span style="color:#d2cd86; ">[</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">SecurityProtocols.Remove</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">]</span>&#10;                ?<span style="color:#d2cd86; ">.</span>Split<span style="color:#d2cd86; ">(</span><span style="color:#00c4c4; ">','</span><span style="color:#d2cd86; ">)</span>&#10;                <span style="color:#d2cd86; ">.</span>Select<span style="color:#d2cd86; ">(</span>o <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">&gt;</span> o<span style="color:#d2cd86; ">.</span>Trim<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;                <span style="color:#d2cd86; ">.</span>ToArray<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;&#10;            <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>securityProtocolsToRemove <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#e66170; font-weight:bold; ">null</span> || securityProtocolsToRemove<span style="color:#d2cd86; ">.</span>Length <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#008c00; ">0</span><span style="color:#d2cd86; ">)</span>&#10;            <span style="color:#b060b0; ">{</span>&#10;                <span style="color:#e66170; font-weight:bold; ">return</span><span style="color:#b060b0; ">;</span>&#10;            <span style="color:#b060b0; ">}</span>&#10;&#10;            <span style="color:#e66170; font-weight:bold; ">foreach</span> <span style="color:#d2cd86; ">(</span><span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolString <span style="color:#e66170; font-weight:bold; ">in</span> securityProtocolsToRemove<span style="color:#d2cd86; ">)</span>&#10;            <span style="color:#b060b0; ">{</span>&#10;                SecurityProtocolType securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;                <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>Enum<span style="color:#d2cd86; ">.</span>TryParse<span style="color:#d2cd86; ">(</span>securityProtocolString<span style="color:#d2cd86; ">,</span> <span style="color:#e66170; font-weight:bold; ">out</span> securityProtocolEnum<span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;                <span style="color:#b060b0; ">{</span>&#10;                    <span style="color:#9999a9; ">// removes security protocol using binary operation</span>&#10;                    ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol &amp;<span style="color:#d2cd86; ">=</span> ~securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;                <span style="color:#b060b0; ">}</span>&#10;            <span style="color:#b060b0; ">}</span>&#10;        <span style="color:#b060b0; ">}</span>&#10;&#10;        <span style="color:#e66170; font-weight:bold; ">private</span> <span style="color:#e66170; font-weight:bold; ">static</span> <span style="color:#e66170; font-weight:bold; ">void</span> AddSecurityProtocols<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span>&#10;        <span style="color:#b060b0; ">{</span>&#10;            <span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolsAdd <span style="color:#d2cd86; ">=</span> ConfigurationManager<span style="color:#d2cd86; ">.</span>AppSettings<span style="color:#d2cd86; ">[</span><span style="color:#02d045; ">"</span><span style="color:#00c4c4; ">SecurityProtocols.Add</span><span style="color:#02d045; ">"</span><span style="color:#d2cd86; ">]</span>&#10;                ?<span style="color:#d2cd86; ">.</span>Split<span style="color:#d2cd86; ">(</span><span style="color:#00c4c4; ">','</span><span style="color:#d2cd86; ">)</span>&#10;                <span style="color:#d2cd86; ">.</span>Select<span style="color:#d2cd86; ">(</span>o <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">&gt;</span> o<span style="color:#d2cd86; ">.</span>Trim<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;                <span style="color:#d2cd86; ">.</span>ToArray<span style="color:#d2cd86; ">(</span><span style="color:#d2cd86; ">)</span><span style="color:#b060b0; ">;</span>&#10;&#10;            <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>securityProtocolsAdd <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#e66170; font-weight:bold; ">null</span> || securityProtocolsAdd<span style="color:#d2cd86; ">.</span>Length <span style="color:#d2cd86; ">=</span><span style="color:#d2cd86; ">=</span> <span style="color:#008c00; ">0</span><span style="color:#d2cd86; ">)</span>&#10;            <span style="color:#b060b0; ">{</span>&#10;                <span style="color:#e66170; font-weight:bold; ">return</span><span style="color:#b060b0; ">;</span>&#10;            <span style="color:#b060b0; ">}</span>&#10;&#10;            <span style="color:#e66170; font-weight:bold; ">foreach</span> <span style="color:#d2cd86; ">(</span><span style="color:#e66170; font-weight:bold; ">var</span> securityProtocolString <span style="color:#e66170; font-weight:bold; ">in</span> securityProtocolsAdd<span style="color:#d2cd86; ">)</span>&#10;            <span style="color:#b060b0; ">{</span>&#10;                SecurityProtocolType securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;                <span style="color:#e66170; font-weight:bold; ">if</span> <span style="color:#d2cd86; ">(</span>Enum<span style="color:#d2cd86; ">.</span>TryParse<span style="color:#d2cd86; ">(</span>securityProtocolString<span style="color:#d2cd86; ">,</span> <span style="color:#e66170; font-weight:bold; ">out</span> securityProtocolEnum<span style="color:#d2cd86; ">)</span><span style="color:#d2cd86; ">)</span>&#10;                <span style="color:#b060b0; ">{</span>&#10;                    <span style="color:#9999a9; ">// adds security protocol using binary operation</span>&#10;                    ServicePointManager<span style="color:#d2cd86; ">.</span>SecurityProtocol |<span style="color:#d2cd86; ">=</span> securityProtocolEnum<span style="color:#b060b0; ">;</span>&#10;                <span style="color:#b060b0; ">}</span>&#10;            <span style="color:#b060b0; ">}</span>&#10;        <span style="color:#b060b0; ">}</span>&#10;    <span style="color:#b060b0; ">}</span>&#10;<span style="color:#b060b0; ">}</span>&#10;</pre>
