Skip to content

Commit 92ccac4

Browse files
author
kibernetik542
authored
chore : csr approval example using json patch net package (#816)
* chore : csr approval example using json patch net package * chore : use top level feature, remove k8s client and use reference instead * chore : remove target framework * fix : remove redundant reference package
1 parent 93c50b4 commit 92ccac4

File tree

3 files changed

+104
-0
lines changed

3 files changed

+104
-0
lines changed

examples/csrApproval/Program.cs

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using System.Net;
2+
using System.Security.Cryptography;
3+
using System.Security.Cryptography.X509Certificates;
4+
using System.Text;
5+
using System.Text.Json;
6+
using Json.Patch;
7+
using k8s;
8+
using k8s.Models;
9+
10+
string GenerateCertificate(string name)
11+
{
12+
var sanBuilder = new SubjectAlternativeNameBuilder();
13+
sanBuilder.AddIpAddress(IPAddress.Loopback);
14+
sanBuilder.AddIpAddress(IPAddress.IPv6Loopback);
15+
sanBuilder.AddDnsName("localhost");
16+
sanBuilder.AddDnsName(Environment.MachineName);
17+
18+
var distinguishedName = new X500DistinguishedName(name);
19+
20+
using var rsa = RSA.Create(4096);
21+
var request = new CertificateRequest(distinguishedName, rsa, HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1);
22+
23+
request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature , false));
24+
request.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(new OidCollection { new ("1.3.6.1.5.5.7.3.1") }, false));
25+
request.CertificateExtensions.Add(sanBuilder.Build());
26+
var csr = request.CreateSigningRequest();
27+
var pemKey = "-----BEGIN CERTIFICATE REQUEST-----\r\n" +
28+
Convert.ToBase64String(csr) +
29+
"\r\n-----END CERTIFICATE REQUEST-----";
30+
31+
return pemKey;
32+
}
33+
34+
var config = KubernetesClientConfiguration.BuildConfigFromConfigFile();
35+
IKubernetes client = new Kubernetes(config);
36+
Console.WriteLine("Starting Request!");
37+
var name = "demo";
38+
var x509 = GenerateCertificate(name);
39+
var encodedCsr= Encoding.UTF8.GetBytes(x509);
40+
41+
var request = new V1CertificateSigningRequest
42+
{
43+
ApiVersion = "certificates.k8s.io/v1",
44+
Kind = "CertificateSigningRequest",
45+
Metadata = new V1ObjectMeta
46+
{
47+
Name = name
48+
},
49+
Spec = new V1CertificateSigningRequestSpec
50+
{
51+
Request = encodedCsr,
52+
SignerName = "kubernetes.io/kube-apiserver-client",
53+
Usages = new List<string> { "client auth" },
54+
ExpirationSeconds = 600 // minimum should be 10 minutes
55+
}
56+
};
57+
58+
await client.CreateCertificateSigningRequestAsync(request);
59+
60+
var serializeOptions = new JsonSerializerOptions
61+
{
62+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
63+
WriteIndented = true
64+
};
65+
var readCert = await client.ReadCertificateSigningRequestAsync(name);
66+
var old = JsonSerializer.SerializeToDocument(readCert, serializeOptions);
67+
68+
var replace = new List<V1CertificateSigningRequestCondition>
69+
{
70+
new("True", "Approved", DateTime.UtcNow, DateTime.UtcNow, "This certificate was approved by k8s client", "Approve")
71+
};
72+
readCert.Status.Conditions = replace;
73+
74+
var expected = JsonSerializer.SerializeToDocument(readCert, serializeOptions);
75+
76+
var patch = old.CreatePatch(expected);
77+
await client.PatchCertificateSigningRequestApprovalAsync(new V1Patch(patch, V1Patch.PatchType.JsonPatch), name);
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="JsonPatch.Net" Version="1.1.2" />
11+
</ItemGroup>
12+
</Project>

kubernetes-client.sln

+15
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubernetesClient.Models", "
5353
EndProject
5454
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubernetesClient.Basic", "src\KubernetesClient.Basic\KubernetesClient.Basic.csproj", "{927995F5-05CC-4078-8805-8E6CC06914D8}"
5555
EndProject
56+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csrApproval", "examples\csrApproval\csrApproval.csproj", "{F626860C-F141-45B3-9DDD-88AD3932ACAF}"
57+
EndProject
5658
Global
5759
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5860
Debug|Any CPU = Debug|Any CPU
@@ -327,6 +329,18 @@ Global
327329
{927995F5-05CC-4078-8805-8E6CC06914D8}.Release|x64.Build.0 = Release|Any CPU
328330
{927995F5-05CC-4078-8805-8E6CC06914D8}.Release|x86.ActiveCfg = Release|Any CPU
329331
{927995F5-05CC-4078-8805-8E6CC06914D8}.Release|x86.Build.0 = Release|Any CPU
332+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
333+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
334+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Debug|x64.ActiveCfg = Debug|Any CPU
335+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Debug|x64.Build.0 = Debug|Any CPU
336+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Debug|x86.ActiveCfg = Debug|Any CPU
337+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Debug|x86.Build.0 = Debug|Any CPU
338+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
339+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Release|Any CPU.Build.0 = Release|Any CPU
340+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Release|x64.ActiveCfg = Release|Any CPU
341+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Release|x64.Build.0 = Release|Any CPU
342+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Release|x86.ActiveCfg = Release|Any CPU
343+
{F626860C-F141-45B3-9DDD-88AD3932ACAF}.Release|x86.Build.0 = Release|Any CPU
330344
EndGlobalSection
331345
GlobalSection(SolutionProperties) = preSolution
332346
HideSolutionNode = FALSE
@@ -354,6 +368,7 @@ Global
354368
{17AB0AD8-6C90-42DD-880C-16B5AC4A373F} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
355369
{F066A4D8-2EF0-4C07-AC0D-BD325DE3FFA8} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
356370
{927995F5-05CC-4078-8805-8E6CC06914D8} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
371+
{F626860C-F141-45B3-9DDD-88AD3932ACAF} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
357372
EndGlobalSection
358373
GlobalSection(ExtensibilityGlobals) = postSolution
359374
SolutionGuid = {049A763A-C891-4E8D-80CF-89DD3E22ADC7}

0 commit comments

Comments
 (0)