Skip to content

Conversation

@lbussell
Copy link
Member

What's included in this PR:

Summary of types added

Signing

  • Data types:
    • ImageSigningRequest
    • PayloadSigningResult
    • ImageSigningResult
  • Services:
    • BulkImageSigningService : IBulkImageSigningService - orchestrates signing and pushing signatures
    • EsrpSigningService : IEsrpSigningService - invokes DDSignFiles.dll via MicroBuild
    • PayloadSigningService : IPayloadSigningService - writes payloads, signs via ESRP, calculates cert chains
    • SigningRequestGenerator : ISigningRequestGenerator - creates requests from ImageArtifactDetails
  • CertificateChainCalculator - static class to extract x5chain from COSE envelopes
  • SigningServiceExtensions - DI registration extension methods

Oras

  • OrasCredentialProviderAdapter - adapts ImageBuilder credentials to ORAS auth
  • OrasDotNetService : IOrasDescriptorService, IOrasSignatureService - ORAS .NET library implementation

Configuration

  • BuildConfiguration - for build/pipeline artifact settings
  • SigningConfiguration - for ESRP signing settings

Tests

  • OrasCredentialProviderAdapterTests
  • SigningRequestGeneratorTests

What's not included in this PR:

  • Integration into Build or Post-Build commands or pipeline steps
  • Pipeline yaml
  • Comprehensive tests

TODO (before leaving draft mode):

  • Successful internal test run end-to-end in pipeline
  • Cleanup
  • Add more tests

Introduce configuration and model types for container image signing:

- SigningConfiguration: holds ESRP certificate IDs for images and referrers
- BuildConfiguration: holds ArtifactStagingDirectory for build artifacts
- Add Signing property to PublishConfiguration
- ImageSigningRequest, PayloadSigningResult, ImageSigningResult records

This is Phase 1 of the signing implementation.
Introduce ORAS services using OrasProject.Oras 0.4.0 for pushing
Notary v2 signatures to registries:

- IOrasDescriptorService: resolves OCI descriptors from references
- IOrasSignatureService: pushes signatures as referrer artifacts
- OrasCredentialProviderAdapter: bridges IRegistryCredentialsProvider
- Uses Packer.PackManifestAsync with Subject for referrer relationship

Existing IOrasClient remains unchanged for other functionality.
Test credential mapping, null handling, and host passthrough.
Implement the core signing service layer:

- IEsrpSigningService: invokes DDSignFiles.dll via MicroBuild plugin
- IPayloadSigningService: writes payloads, signs via ESRP, calculates cert chain
- IBulkImageSigningService: orchestrates signing and ORAS push
- CertificateChainCalculator: extracts x5chain thumbprints from COSE envelopes

Also adds GetEnvironmentVariable to IEnvironmentService and
SigningServiceExtensions for DI registration.
Implements ISigningRequestGenerator with two methods:
- GeneratePlatformSigningRequestsAsync: Converts platform digests to signing requests
- GenerateManifestListSigningRequestsAsync: Converts manifest list digests to signing requests

Uses LINQ to flatten the repo/image/platform hierarchy. Updates BuildCommand
to use the generator instead of inline request creation.
This standalone command has been superseded by the integrated signing
services that sign images immediately after build/push in BuildCommand.
- Add SignType property to SigningConfiguration (defaults to 'test')
- Update EsrpSigningService to use SignType from config
- Set SignType: real in publish-config-prod.yml
- Set SignType: test in publish-config-nonprod.yml
- Add Enabled property to SigningConfiguration
- Update BuildCommand to check Signing.Enabled before signing
- Update publish-config templates to use $(enableSigning) variable
- Update init-imagebuilder to read enableSigning and signType from variables

To enable signing in a pipeline, set:
  variables:
    enableSigning: true
    signType: real  # or 'test'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant