Skip to content
This repository was archived by the owner on Mar 20, 2024. It is now read-only.

Commit dc5a15c

Browse files
tintoyJonJam
authored andcommitted
Remove hacky WebSocket connection factory. (kubernetes-client#171)
Replace it with the new (officially-supported) ClientWebSocket SSL functionality in .NET Core 2.1. kubernetes-client#130
1 parent 8839fe4 commit dc5a15c

File tree

6 files changed

+69
-736
lines changed

6 files changed

+69
-736
lines changed

src/KubernetesClient/CoreFX.cs

Lines changed: 0 additions & 566 deletions
This file was deleted.

src/KubernetesClient/Kubernetes.WebSocket.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ public partial class Kubernetes
269269

270270
if (webSocketSubProtocol != null)
271271
{
272-
webSocketBuilder.Options.RequestedSubProtocols.Add(webSocketSubProtocol);
272+
webSocketBuilder.Options.AddSubProtocol(webSocketSubProtocol);
273273
}
274274
#endif // NETCOREAPP2_1
275275

src/KubernetesClient/WebSocketBuilder.NetCoreApp2.1.cs

Lines changed: 0 additions & 124 deletions
This file was deleted.

src/KubernetesClient/WebSocketBuilder.cs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#if !NETCOREAPP2_1
2-
31
using System;
42
using System.Net.WebSockets;
53
using System.Security.Cryptography.X509Certificates;
@@ -23,6 +21,8 @@ public WebSocketBuilder()
2321
{
2422
}
2523

24+
public ClientWebSocketOptions Options => WebSocket.Options;
25+
2626
public virtual WebSocketBuilder SetRequestHeader(string headerName, string headerValue)
2727
{
2828
this.WebSocket.Options.SetRequestHeader(headerName, headerValue);
@@ -35,12 +35,31 @@ public virtual WebSocketBuilder AddClientCertificate(X509Certificate2 certificat
3535
return this;
3636
}
3737

38+
#if NETCOREAPP2_1
39+
40+
public WebSocketBuilder ExpectServerCertificate(X509Certificate2 serverCertificate)
41+
{
42+
Options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
43+
{
44+
return Kubernetes.CertificateValidationCallBack(sender, serverCertificate, certificate, chain, sslPolicyErrors);
45+
};
46+
47+
return this;
48+
}
49+
50+
public WebSocketBuilder SkipServerCertificateValidation()
51+
{
52+
Options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
53+
54+
return this;
55+
}
56+
57+
#endif // NETCOREAPP2_1
58+
3859
public virtual async Task<WebSocket> BuildAndConnectAsync(Uri uri, CancellationToken cancellationToken)
3960
{
4061
await this.WebSocket.ConnectAsync(uri, cancellationToken).ConfigureAwait(false);
4162
return this.WebSocket;
4263
}
4364
}
4465
}
45-
46-
#endif // !NETCOREAPP2_1

tests/KubernetesClient.Tests/AuthTests.cs

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Linq;
44
using System.Net;
55
using System.Net.Http.Headers;
6-
using System.Security.Cryptography;
6+
using System.Security.Cryptography;
77
using System.Security.Cryptography.X509Certificates;
88
using System.Text;
99
using System.Threading.Tasks;
@@ -12,21 +12,21 @@
1212
using Microsoft.AspNetCore.Hosting;
1313
using Microsoft.AspNetCore.Server.Kestrel.Https;
1414
using Microsoft.Rest;
15-
using Org.BouncyCastle.Crypto.Parameters;
16-
using Org.BouncyCastle.Pkcs;
17-
using Org.BouncyCastle.Security;
15+
using Org.BouncyCastle.Crypto.Parameters;
16+
using Org.BouncyCastle.Pkcs;
17+
using Org.BouncyCastle.Security;
1818
using Xunit;
1919
using Xunit.Abstractions;
2020

2121
namespace k8s.Tests
2222
{
2323
public class AuthTests
24-
{
25-
private readonly ITestOutputHelper testOutput;
26-
27-
public AuthTests(ITestOutputHelper testOutput)
28-
{
29-
this.testOutput = testOutput;
24+
{
25+
private readonly ITestOutputHelper testOutput;
26+
27+
public AuthTests(ITestOutputHelper testOutput)
28+
{
29+
this.testOutput = testOutput;
3030
}
3131

3232
private static HttpOperationResponse<V1PodList> ExecuteListPods(IKubernetes client)
@@ -164,21 +164,23 @@ public void BasicAuth()
164164
Assert.Equal(HttpStatusCode.Unauthorized, listTask.Response.StatusCode);
165165
}
166166
}
167-
}
168-
167+
}
168+
169+
#if NETCOREAPP2_1 // The functionality under test, here, is dependent on managed HTTP / WebSocket functionality in .NET Core 2.1 or newer.
170+
169171
[Fact]
170172
public void Cert()
171173
{
172174
var serverCertificateData = File.ReadAllText("assets/apiserver-pfx-data.txt");
173175

174176
var clientCertificateKeyData = File.ReadAllText("assets/client-key-data.txt");
175177
var clientCertificateData = File.ReadAllText("assets/client-certificate-data.txt");
176-
177-
X509Certificate2 serverCertificate = null;
178-
using (MemoryStream serverCertificateStream = new MemoryStream(Convert.FromBase64String(serverCertificateData)))
179-
{
180-
serverCertificate = OpenCertificateStore(serverCertificateStream);
181-
}
178+
179+
X509Certificate2 serverCertificate = null;
180+
using (MemoryStream serverCertificateStream = new MemoryStream(Convert.FromBase64String(serverCertificateData)))
181+
{
182+
serverCertificate = OpenCertificateStore(serverCertificateStream);
183+
}
182184

183185
var clientCertificate = new X509Certificate2(Convert.FromBase64String(clientCertificateData), "");
184186

@@ -259,7 +261,9 @@ public void Cert()
259261
Assert.False(clientCertificateValidationCalled);
260262
}
261263
}
262-
}
264+
}
265+
266+
#endif // NETCOREAPP2_1
263267

264268
[Fact]
265269
public void Token()
@@ -330,27 +334,27 @@ public void Token()
330334
Assert.Equal(HttpStatusCode.Unauthorized, listTask.Response.StatusCode);
331335
}
332336
}
333-
}
334-
335-
private X509Certificate2 OpenCertificateStore(Stream stream)
336-
{
337-
Pkcs12Store store = new Pkcs12Store();
338-
store.Load(stream, new char[] { });
339-
340-
var keyAlias = store.Aliases.Cast<string>().SingleOrDefault(a => store.IsKeyEntry(a));
341-
342-
var key = (RsaPrivateCrtKeyParameters)store.GetKey(keyAlias).Key;
343-
var bouncyCertificate = store.GetCertificate(keyAlias).Certificate;
344-
345-
var certificate = new X509Certificate2(DotNetUtilities.ToX509Certificate(bouncyCertificate));
346-
var parameters = DotNetUtilities.ToRSAParameters(key);
347-
348-
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
349-
rsa.ImportParameters(parameters);
350-
351-
certificate = RSACertificateExtensions.CopyWithPrivateKey(certificate, rsa);
352-
353-
return certificate;
337+
}
338+
339+
private X509Certificate2 OpenCertificateStore(Stream stream)
340+
{
341+
Pkcs12Store store = new Pkcs12Store();
342+
store.Load(stream, new char[] { });
343+
344+
var keyAlias = store.Aliases.Cast<string>().SingleOrDefault(a => store.IsKeyEntry(a));
345+
346+
var key = (RsaPrivateCrtKeyParameters)store.GetKey(keyAlias).Key;
347+
var bouncyCertificate = store.GetCertificate(keyAlias).Certificate;
348+
349+
var certificate = new X509Certificate2(DotNetUtilities.ToX509Certificate(bouncyCertificate));
350+
var parameters = DotNetUtilities.ToRSAParameters(key);
351+
352+
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
353+
rsa.ImportParameters(parameters);
354+
355+
certificate = RSACertificateExtensions.CopyWithPrivateKey(certificate, rsa);
356+
357+
return certificate;
354358
}
355359
}
356360
}

tests/KubernetesClient.Tests/KubernetesClient.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<IsPackable>false</IsPackable>
44
<RootNamespace>k8s.tests</RootNamespace>
5-
<TargetFrameworks>netcoreapp2.0;netcoreapp2.1</TargetFrameworks>
5+
<TargetFrameworks>netcoreapp2.1;netcoreapp2.0</TargetFrameworks>
66
</PropertyGroup>
77

88
<ItemGroup>

0 commit comments

Comments
 (0)