FluentCertificates 0.10.1-ci0016
See the version list below for details.
dotnet add package FluentCertificates --version 0.10.1-ci0016
NuGet\Install-Package FluentCertificates -Version 0.10.1-ci0016
<PackageReference Include="FluentCertificates" Version="0.10.1-ci0016" />
<PackageVersion Include="FluentCertificates" Version="0.10.1-ci0016" />
<PackageReference Include="FluentCertificates" />
paket add FluentCertificates --version 0.10.1-ci0016
#r "nuget: FluentCertificates, 0.10.1-ci0016"
#addin nuget:?package=FluentCertificates&version=0.10.1-ci0016&prerelease
#tool nuget:?package=FluentCertificates&version=0.10.1-ci0016&prerelease
📖 FluentCertificates Overview
⚠️ Note: while version numbers are v0.x.y, this software is under initial development and there there may be breaking-changes in its API between minor versions. ⚠️
FluentCertificates is a library using the Immutable Fluent Builder pattern for easily creating, finding, and exporting certificates. It makes it simple to generate your own certificate chains or just stand-alone self-signed certificates.
NuGet Packages
This project is published in several NuGet packages:
- FluentCertificates: Top-level package that imports the Builder, Extensions, and Finder packages.
- FluentCertificates.Builder: Provides
CertificateBuilder
for building certificates and also includes a bunch of convenient extension methods. Examples below - FluentCertificates.Extensions: Provides additional extension methods. Examples below
- FluentCertificates.Finder: Provides
CertificateFinder
for finding certificates across X509Stores and directories. Examples below
Documentation is incomplete. More examples can be found in the project's unit tests.
CertificateBuilder Examples
CertificateBuilder
requires the FluentCertificates.Builder package and is found under the FluentCertificates
namespace.
Minimum Example
The absolute minimum needed to create a certificate, whether it's useful or not.
using var cert = new CertificateBuilder().Create();
Create a Certificate Signing Request
For signing, exporting and passing to a 3rd party CA.
//A public & private keypair must be created first, outside of the CertificateBuilder, otherwise you'd have no way to retrieve the private-key used for the new CertificateSigningRequest object
using var keys = RSA.Create();
//Creating a CertificateSigningRequest
var csr = new CertificateBuilder()
.SetUsage(CertificateUsage.Server)
.SetSubject(b => b.SetCommonName("*.fake.domain"))
.SetSubjectAlternativeNames(x => x.AddDnsNames("*.fake.domain", "fake.domain"))
.SetKeyPair(keys)
.CreateCertificateSigningRequest();
//The CertificateRequest object is accessible here:
var certRequest = csr.CertificateRequest;
//CSR can be exported to a string
Console.WriteLine(csr.ToPemString());
//Or to a file or StringWriter instance
csr.ExportAsPem("csr.pem");
Build a Self-Signed Web Server Certificate
Using the fluent style:
using var cert = new CertificateBuilder()
.SetUsage(CertificateUsage.Server)
.SetFriendlyName("Example self-signed web-server certificate")
.SetSubject(b => b.SetCommonName("*.fake.domain"))
.SetSubjectAlternativeNames(x => x.AddDnsNames("*.fake.domain", "fake.domain"))
.SetNotAfter(DateTimeOffset.UtcNow.AddMonths(1))
.Create();
Or alternatively using object initializers (other examples will use fluent style from now on though):
using var builder = new CertificateBuilder() {
Usage = CertificateUsage.Server,
FriendlyName = "Example self-signed web-server certificate",
Subject = new X500NameBuilder().SetCommonName("*.fake.domain"),
SubjectAlternativeNames = new GeneralNameListBuilder().AddDnsNames("*.fake.domain", "fake.domain"),
NotAfter = DateTimeOffset.UtcNow.AddMonths(1)
};
var cert = builder.Create();
Build a Certificate Authority (CA)
//A CA's expiry date must be later than that of any certificates it will issue
using var issuer = new CertificateBuilder()
.SetUsage(CertificateUsage.CA)
.SetFriendlyName("Example root CA")
.SetSubject(b => b.SetCommonName("Example root CA"))
.SetNotAfter(DateTimeOffset.UtcNow.AddYears(100))
.Create();
Build a Client-Auth Certificate Signed by a CA
//Note: the 'issuer' certificate used must have a private-key attached in order to sign this new certificate
using var cert = new CertificateBuilder()
.SetUsage(CertificateUsage.Client)
.SetFriendlyName("Example client-auth certificate")
.SetSubject(b => b.SetCommonName("User: Michael"))
.SetNotAfter(DateTimeOffset.UtcNow.AddYears(1))
.SetIssuer(issuer)
.Create();
Advanced: Certificate with Customized Extensions
using var cert = new CertificateBuilder()
.SetFriendlyName("Example certificate with customized extensions")
.SetSubject(b => b.SetCommonName("Example certificate with customized extensions"))
.AddExtension(new X509BasicConstraintsExtension(false, false, 0, true))
.AddExtension(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DataEncipherment, true))
.AddExtension(new X509EnhancedKeyUsageExtension(new OidCollection { new(KeyPurposeID.AnyExtendedKeyUsage.Id) }, false))
.SetIssuer(issuer)
.Create();
CertificateFinder Examples
CertificateFinder
requires the FluentCertificates.Finder package and is found under the FluentCertificates
namespace.
TODO: document this
X500NameBuilder Examples
X500NameBuilder
requires the FluentCertificates.Builder package and is found under the FluentCertificates
namespace.
TODO: document this; see unit tests for more examples
X509Certificate2 Extension Methods
These extension methods require the FluentCertificates.Builder package and are found under the FluentCertificates
namespace.
TODO: document these; see unit tests for more examples
Extension-Method | Description |
---|---|
BuildChain |
|
ExportAsCert |
|
ExportAsPkcs12 |
|
ExportAsPkcs7 |
|
ExportAsPem |
|
ToPemString |
|
ToBase64String |
|
GetPrivateKey |
|
GetSignatureData |
|
GetToBeSignedData |
|
IsValidNow |
|
IsValid |
|
IsSelfSigned |
|
IsIssuedBy |
X509Chain Extension Methods
These extension methods require the FluentCertificates.Builder package and are found under the FluentCertificates
namespace.
TODO: document these
Extension-Method | Description |
---|---|
ToCollection |
|
ToEnumerable |
|
ExportAsPkcs7 |
|
ExportAsPkcs12 |
|
ExportAsPem |
|
ToPemString |
X509Certificate2Collection Extension Methods
These extension methods require the FluentCertificates.Builder package and are found under the FluentCertificates
namespace.
TODO: document these
Extension-Method | Description |
---|---|
ToEnumerable |
|
ExportAsPkcs7 |
|
ExportAsPkcs12 |
|
ExportAsPem |
|
ToPemString |
IEnumerable<X509Certificate2> Extension Methods
These extension methods require the FluentCertificates.Builder package and are found under the FluentCertificates
namespace.
TODO: document these
Extension-Method | Description |
---|---|
ToCollection |
|
FilterPrivateKeys |
|
ExportAsPkcs7 |
|
ExportAsPkcs12 |
|
ExportAsPem |
|
ToPemString |
AsymmetricAlgorithm Extension Methods
These extension methods require the FluentCertificates.Builder package and are found under the FluentCertificates
namespace.
TODO: document these
Extension-Method | Description |
---|---|
ToPrivateKeyPemString |
|
ToPublicKeyPemString |
|
ExportAsPrivateKeyPem |
|
ExportAsPublicKeyPem |
CertificateRequest Extension Methods
These extension methods require the FluentCertificates.Builder package and are found under the FluentCertificates
namespace.
Extension-Method | Description |
---|---|
ToPemString() |
Exports the CertificateRequest to a PEM string. |
ExportAsPem(string path) |
Exports the CertificateRequest to the specified PEM file. |
ExportAsPem(TextWriter writer) |
Exports the CertificateRequest in PEM format to the given TextWriter . |
ConvertToBouncyCastle() |
Converts the CertificateRequest to a BouncyCastle Pkcs10CertificationRequest |
X509Extension Extension Methods
These extension methods require the FluentCertificates.Builder package and are found under the FluentCertificates
namespace.
Extension-Method | Description |
---|---|
dnExtension.ConvertToBouncyCastle() |
Converts a DotNet X509Extension to a BouncyCastle X509Extension . |
bcExtension.ConvertToDotNet(string oid) |
Converts a BouncyCastle X509Extension to a DotNet X509Extension . A DotNet X509Extension includes an OID, but a BouncyCastle one doesn't, therefore one must be supplied in the parameters here. |
bcExtension.ConvertToDotNet(DerObjectIdentifier oid) |
Converts a BouncyCastle X509Extension to a DotNet X509Extension . A DotNet X509Extension includes an OID, but a BouncyCastle one doesn't, therefore one must be supplied in the parameters here. |
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- FluentCertificates.Builder (>= 0.10.1-ci0016)
- FluentCertificates.Extensions (>= 0.10.1-ci0016)
- FluentCertificates.Finder (>= 0.10.1-ci0016)
-
net9.0
- FluentCertificates.Builder (>= 0.10.1-ci0016)
- FluentCertificates.Extensions (>= 0.10.1-ci0016)
- FluentCertificates.Finder (>= 0.10.1-ci0016)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.11.0 | 0 | 5/30/2025 |
0.10.1-ci0019 | 25 | 5/29/2025 |
0.10.1-ci0018 | 31 | 5/29/2025 |
0.10.1-ci0017 | 29 | 5/29/2025 |
0.10.1-ci0016 | 33 | 5/29/2025 |
0.10.1-ci0010 | 26 | 5/29/2025 |
0.10.1-ci0008 | 34 | 5/28/2025 |
0.10.1-ci0001 | 87 | 11/29/2024 |
0.10.0 | 242 | 11/28/2024 |
0.9.2-ci0009 | 86 | 11/28/2024 |
0.9.2-ci0008 | 84 | 11/28/2024 |
0.9.2-ci0006 | 75 | 11/27/2024 |
0.9.2-ci0004 | 80 | 11/27/2024 |
0.9.2-ci0002 | 111 | 2/19/2024 |
0.9.1 | 478 | 8/11/2023 |
0.9.1-ci0017 | 151 | 8/11/2023 |
0.9.1-ci0007 | 154 | 8/11/2023 |
0.9.1-ci0006 | 172 | 8/11/2023 |
0.9.0 | 199 | 8/10/2023 |
0.8.1-ci0031 | 149 | 8/10/2023 |
0.8.1-ci0028 | 147 | 8/2/2023 |
0.8.1-ci0027 | 142 | 8/2/2023 |
0.8.1-ci0025 | 147 | 8/2/2023 |
0.8.1-ci0020 | 163 | 8/1/2023 |
0.8.1-ci0018 | 136 | 8/1/2023 |
0.8.1-ci0016 | 144 | 8/1/2023 |
0.8.0 | 496 | 7/7/2022 |
0.7.2-ci0010 | 209 | 7/7/2022 |
0.7.2-ci0002 | 201 | 7/6/2022 |
0.7.2-ci0001 | 187 | 7/6/2022 |
0.7.1 | 442 | 6/24/2022 |
0.7.1-ci0001 | 182 | 6/24/2022 |
0.7.0 | 447 | 6/24/2022 |
0.6.1-ci0002 | 204 | 6/24/2022 |
0.6.1-ci0001 | 183 | 6/24/2022 |
0.6.0 | 453 | 6/23/2022 |
0.5.5-ci0009 | 181 | 6/23/2022 |
0.5.5-ci0008 | 181 | 6/23/2022 |
0.5.5-ci0007 | 193 | 6/23/2022 |
0.5.5-ci0006 | 197 | 6/23/2022 |
0.5.5-ci0005 | 181 | 6/23/2022 |
0.5.5-ci0004 | 202 | 6/21/2022 |
0.5.4 | 434 | 6/20/2022 |
0.5.4-ci0002 | 182 | 6/20/2022 |
0.5.3 | 437 | 6/20/2022 |
0.5.3-ci0005 | 191 | 6/20/2022 |
0.5.3-ci0004 | 184 | 6/20/2022 |
0.5.3-ci0003 | 167 | 6/20/2022 |
0.5.2 | 461 | 6/18/2022 |
0.5.2-ci0001 | 186 | 6/18/2022 |
0.5.1 | 454 | 6/17/2022 |
0.5.1-ci0001 | 183 | 6/17/2022 |
0.5.0 | 428 | 6/17/2022 |
0.4.2-ci0022 | 191 | 6/17/2022 |
0.4.2-ci0021 | 199 | 6/17/2022 |
0.4.2-ci0020 | 190 | 6/17/2022 |
0.4.2-ci0018 | 191 | 6/17/2022 |
0.4.2-ci0014 | 192 | 6/16/2022 |
0.4.2-ci0013 | 197 | 6/16/2022 |
0.4.2-ci0012 | 210 | 6/16/2022 |
0.4.2-ci0011 | 194 | 6/16/2022 |
0.4.2-ci0010 | 173 | 6/16/2022 |
0.4.2-ci0009 | 196 | 6/16/2022 |
0.4.2-ci0007 | 179 | 6/16/2022 |
0.4.2-ci0003 | 199 | 6/15/2022 |
0.4.2-ci0002 | 216 | 6/15/2022 |
0.4.2-ci0001 | 207 | 6/10/2022 |
0.4.1 | 446 | 6/10/2022 |
0.4.1-ci0008 | 178 | 6/10/2022 |
0.4.1-ci0007 | 191 | 6/10/2022 |
0.4.1-ci0006 | 204 | 6/10/2022 |
0.4.1-ci0005 | 197 | 6/10/2022 |
0.4.1-ci0004 | 192 | 6/10/2022 |
0.4.1-ci0003 | 200 | 6/10/2022 |
0.4.1-ci0002 | 198 | 6/8/2022 |
0.4.1-ci0001 | 187 | 6/8/2022 |
0.4.0 | 461 | 6/2/2022 |
0.3.3-ci0001 | 204 | 6/2/2022 |
0.3.2 | 447 | 6/2/2022 |
0.3.2-ci0002 | 203 | 5/31/2022 |
0.3.2-ci.1 | 153 | 5/30/2022 |