-
Notifications
You must be signed in to change notification settings - Fork 168
Add certificate trust customization article for Aspire 13 #5311
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
ffed840
30afc34
babc661
6f6d732
30ab01a
9d88625
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,307 @@ | ||||||
| --- | ||||||
| title: Certificate trust customization in Aspire | ||||||
| description: Learn how to customize trusted certificates for Executable and Container resources in Aspire to enable secure communication. | ||||||
| ms.date: 10/20/2025 | ||||||
| ai-usage: ai-assisted | ||||||
| --- | ||||||
|
|
||||||
| # Certificate trust customization in Aspire | ||||||
|
|
||||||
| In Aspire, you can customize which certificates resources consider trusted for TLS/HTTPS traffic. This is particularly useful for resources that don't use the system's root trusted certificates by default, such as containerized applications, Python apps, and Node.js apps. By configuring certificate trust, you enable these resources to communicate securely with services that use certificates they wouldn't otherwise trust, including the Aspire dashboard's OTLP endpoint. | ||||||
|
|
||||||
| > [!IMPORTANT] | ||||||
| > Certificate trust customization only applies at run time. Custom certificates aren't included in publish or deployment artifacts. | ||||||
|
|
||||||
| ## When to use certificate trust customization | ||||||
|
|
||||||
| Certificate trust customization is valuable when: | ||||||
|
|
||||||
| - Resources need to trust the ASP.NET Core Development Certificate for local HTTPS communication. | ||||||
| - Containerized services must communicate with the dashboard over HTTPS. | ||||||
| - Python or Node.js applications need to trust custom certificate authorities. | ||||||
| - You're working with services that have specific certificate trust requirements. | ||||||
| - Resources need to establish secure telemetry connections to the Aspire dashboard. | ||||||
|
|
||||||
| ## Development certificate trust | ||||||
|
|
||||||
| By default, Aspire attempts to add trust for the ASP.NET Core Development Certificate to resources that wouldn't otherwise trust it. This enables resources to communicate with the dashboard OTEL collector endpoint over HTTPS and any other HTTPS endpoints secured by the development certificate. | ||||||
|
|
||||||
| You can control this behavior at the per-resource level using the `WithDeveloperCertificateTrust` API or through AppHost configuration settings. | ||||||
|
|
||||||
| ### Configure development certificate trust per resource | ||||||
|
|
||||||
| To explicitly enable or disable development certificate trust for a specific resource: | ||||||
|
|
||||||
| ```csharp | ||||||
| var builder = DistributedApplication.CreateBuilder(args); | ||||||
|
|
||||||
| // Explicitly enable development certificate trust | ||||||
| var nodeApp = builder.AddNpmApp("frontend", "../frontend") | ||||||
| .WithDeveloperCertificateTrust(trust: true); | ||||||
|
|
||||||
| // Disable development certificate trust | ||||||
| var pythonApp = builder.AddPythonApp("api", "../api", "main.py") | ||||||
| .WithDeveloperCertificateTrust(trust: false); | ||||||
|
|
||||||
| builder.Build().Run(); | ||||||
| ``` | ||||||
|
|
||||||
| ## Certificate authority collections | ||||||
|
|
||||||
| Certificate authority collections allow you to bundle custom certificates and make them available to resources. You create a collection using the `AddCertificateAuthorityCollection` method and then reference it from resources that need to trust those certificates. | ||||||
|
|
||||||
| ### Create and use a certificate authority collection | ||||||
|
|
||||||
| ```csharp | ||||||
| using System.Security.Cryptography.X509Certificates; | ||||||
|
|
||||||
| var builder = DistributedApplication.CreateBuilder(args); | ||||||
|
|
||||||
| // Load your custom certificates | ||||||
| var certificates = new X509Certificate2Collection(); | ||||||
| certificates.ImportFromPemFile("path/to/certificate.pem"); | ||||||
|
|
||||||
| // Create a certificate authority collection | ||||||
| var certBundle = builder.AddCertificateAuthorityCollection("my-bundle") | ||||||
| .WithCertificates(certificates); | ||||||
|
|
||||||
| // Apply the certificate bundle to resources | ||||||
| builder.AddNpmApp("my-project", "../myapp") | ||||||
| .WithCertificateAuthorityCollection(certBundle); | ||||||
|
|
||||||
| builder.Build().Run(); | ||||||
| ``` | ||||||
|
|
||||||
| In the preceding example, the certificate bundle is created with custom certificates and then applied to a Node.js application, enabling it to trust those certificates. | ||||||
|
|
||||||
| ## Certificate trust scopes | ||||||
danegsta marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
|
||||||
| Certificate trust scopes control how custom certificates interact with a resource's default trusted certificates. Different scopes provide flexibility in managing certificate trust based on your application's requirements. | ||||||
|
|
||||||
| The `WithCertificateTrustScope` API accepts a <xref:Aspire.Hosting.ApplicationModel.CertificateTrustScope> value to specify the trust behavior. | ||||||
|
|
||||||
| ### Default trust scopes | ||||||
|
|
||||||
| Different resource types have different default trust scopes: | ||||||
|
|
||||||
| - **Append**: The default for most resources, appending custom certificates to the default trusted certificates. | ||||||
| - **System**: The default for Python projects, which combines custom certificates with system root certificates because Python doesn't properly support Append mode. | ||||||
| - **None**: The default for .NET projects on Windows, as there's no way to automatically change the default system store source. | ||||||
|
|
||||||
| ### Append mode | ||||||
|
|
||||||
| Attempts to append the configured certificates to the default trusted certificates for a given resource. This mode is useful when you want to add trust for additional certificates while maintaining trust for the system's default certificates. | ||||||
|
|
||||||
| ```csharp | ||||||
| var builder = DistributedApplication.CreateBuilder(args); | ||||||
|
|
||||||
| builder.AddNodeApp("api", "../api") | ||||||
| .WithCertificateTrustScope(CertificateTrustScope.Append); | ||||||
|
|
||||||
| builder.Build().Run(); | ||||||
| ``` | ||||||
|
|
||||||
| > [!NOTE] | ||||||
| > Not all languages and runtimes support Append mode. For example, Python doesn't natively support appending certificates to the default trust store. | ||||||
|
|
||||||
| ### Override mode | ||||||
|
|
||||||
| Attempts to override a resource to only trust the configured certificates, replacing the default trusted certificates entirely. This mode is useful when you need strict control over which certificates are trusted. | ||||||
|
|
||||||
| ```csharp | ||||||
| var builder = DistributedApplication.CreateBuilder(args); | ||||||
|
|
||||||
| var certBundle = builder.AddCertificateAuthorityCollection("custom-certs") | ||||||
| .WithCertificates(myCertificates); | ||||||
|
|
||||||
| builder.AddPythonModule("api", "./api", "uvicorn") | ||||||
| .WithCertificateAuthorityCollection(certBundle) | ||||||
| .WithCertificateTrustScope(CertificateTrustScope.Override); | ||||||
|
|
||||||
| builder.Build().Run(); | ||||||
| ``` | ||||||
|
|
||||||
| ### System mode | ||||||
|
|
||||||
| Attempts to combine the configured certificates with the default system root certificates and use them to override the default trusted certificates for a resource. This mode is intended to support Python or other languages that don't work well with Append mode. | ||||||
|
|
||||||
| ```csharp | ||||||
| var builder = DistributedApplication.CreateBuilder(args); | ||||||
|
|
||||||
| builder.AddPythonApp("worker", "../worker", "main.py") | ||||||
| .WithCertificateTrustScope(CertificateTrustScope.System); | ||||||
|
|
||||||
| builder.Build().Run(); | ||||||
| ``` | ||||||
|
|
||||||
| ### None mode | ||||||
|
|
||||||
| Disables all custom certificate trust for the resource, causing it to rely solely on its default certificate trust behavior. | ||||||
|
|
||||||
| ```csharp | ||||||
| var builder = DistributedApplication.CreateBuilder(args); | ||||||
|
|
||||||
| builder.AddContainer("service", "myimage") | ||||||
| .WithCertificateTrustScope(CertificateTrustScope.None); | ||||||
|
|
||||||
| builder.Build().Run(); | ||||||
| ``` | ||||||
|
|
||||||
| ## Custom certificate trust callbacks | ||||||
|
|
||||||
| For advanced scenarios, you can specify custom certificate trust behavior using callback APIs. These callbacks allow you to customize how certificates are configured for different resource types. | ||||||
|
||||||
| For advanced scenarios, you can specify custom certificate trust behavior using callback APIs. These callbacks allow you to customize how certificates are configured for different resource types. | |
| For advanced scenarios, you can specify custom certificate trust behavior using a callback API. This callback allow you to customize the command line arguments and environment variables required to configure certificate trust for different resource types. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated the introductory text to use singular "callback API" and "callback allows". Commit 9d88625
IEvangelist marked this conversation as resolved.
Show resolved
Hide resolved
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Both of these sections are outdated and no longer apply to the current implementation. Instead, the new WithCertificateTrustConfiguration API should be documented here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Replaced the outdated executable and container callback sections with documentation for the new WithCertificateTrustConfiguration API that uses a unified approach with simplified context properties. Commit 9d88625
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There should probably be a section here on configuring container certificate artifact paths using the WithContainerCertificatePaths API.
The API takes three optional arguments:
customCertificatesDestinationtakes a string and overrides the base path in the container where custom certificate files are placed. If not set (or set tonull) the default path of/usr/lib/ssl/aspirewill be used.defaultCertificateBundlePathstakes a list of strings and overrides the path(s) in the container where a default certificate authority bundle file is located. When theCertificateTrustScopeisOverrideorSystem, the custom certificate bundle will additionally be written to these paths. If not set (or set tonull) a set of default certificate paths for common Linux distributions will be used.defaultCertificateDirectoryPathstakes a list of strings and overrides the path(s) in the container where individual trusted certificate files are found. When theCertificateTrustScopeisAppend, these paths will be concatenated with the path to the uploaded certificate artifacts. If not set (or set tonull) a set of default certificate paths for common Linux distributions will be used.
All desired paths must be configured in a single call to WithContainerCertificatePaths as only the most recent call to the API is honored.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @copilot please have a look at these comments
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added a new section documenting the WithContainerCertificatePaths API with detailed explanations of all three optional parameters (customCertificatesDestination, defaultCertificateBundlePaths, defaultCertificateDirectoryPaths) and included a note that all desired paths must be configured in a single call. Commit 9d88625
Uh oh!
There was an error while loading. Please reload this page.