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

Commit 030e283

Browse files
authored
[Repository Signing] Leave nuget.org's repository signature (#417)
Add allow list for certain existing repository signatures Progress on https://github.com/NuGet/Engineering/issues/1327
1 parent 8d6d375 commit 030e283

21 files changed

Lines changed: 707 additions & 187 deletions

File tree

src/Validation.Common.Job/JsonConfigurationJob.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using Microsoft.Extensions.Logging;
1616
using Microsoft.Extensions.Options;
1717
using NuGet.Jobs.Configuration;
18-
using NuGet.Jobs.Validation.Storage;
1918
using NuGet.Services.Configuration;
2019
using NuGet.Services.KeyVault;
2120
using NuGet.Services.Logging;

src/Validation.Common.Job/Validation.Common.Job.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
<Version>1.1.2</Version>
8989
</PackageReference>
9090
<PackageReference Include="NuGet.Packaging">
91-
<Version>4.7.0-preview4.5067</Version>
91+
<Version>4.8.0-preview1.5179</Version>
9292
</PackageReference>
9393
<PackageReference Include="NuGet.Services.Configuration">
9494
<Version>2.23.0</Version>

src/Validation.Common.Job/Validation.Common.Job.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<dependency id="Microsoft.ApplicationInsights" version="2.2.0" />
1616
<dependency id="Microsoft.Extensions.DependencyInjection" version="1.1.1" />
1717
<dependency id="Microsoft.Extensions.Options.ConfigurationExtensions" version="1.1.2" />
18-
<dependency id="NuGet.Packaging" version="4.7.0-preview4.5067" />
18+
<dependency id="NuGet.Packaging" version="4.8.0-preview1.5179" />
1919
<dependency id="NuGet.Services.Configuration" version="2.23.0" />
2020
<dependency id="NuGet.Services.Logging" version="2.23.0" />
2121
<dependency id="NuGet.Services.Storage" version="2.23.0" />
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using NuGet.Packaging.Signing;
7+
8+
namespace NuGet.Jobs.Validation.PackageSigning.ProcessSignature
9+
{
10+
public interface ISignatureFormatValidator
11+
{
12+
/// <summary>
13+
/// Verify that the package's signature is readable. Does not perform integrity or trust validations.
14+
/// </summary>
15+
/// <param name="package">The package to validate</param>
16+
/// <param name="token"></param>
17+
/// <returns>Whether the package's signature is readable.</returns>
18+
Task<VerifySignaturesResult> ValidateMinimalAsync(
19+
ISignedPackageReader package,
20+
CancellationToken token);
21+
22+
/// <summary>
23+
/// Run all validations on the package's signature. This includes integrity and trust validations.
24+
/// </summary>
25+
/// <param name="package">The package to validate.</param>
26+
/// <param name="hasRepositorySignature">If false, skips the certificate allow list verification of the repository signature.</param>
27+
/// <param name="token"></param>
28+
/// <returns>Whether the package's signature is valid.</returns>
29+
Task<VerifySignaturesResult> ValidateFullAsync(
30+
ISignedPackageReader package,
31+
bool hasRepositorySignature,
32+
CancellationToken token);
33+
}
34+
}

src/Validation.PackageSigning.ProcessSignature/Job.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ namespace NuGet.Jobs.Validation.PackageSigning.ProcessSignature
2323
public class Job : SubcriptionProcessorJob<SignatureValidationMessage>
2424
{
2525
private const string CertificateStoreConfigurationSectionName = "CertificateStore";
26+
private const string ProcessSignatureConfigurationSectionName = "ProcessSignature";
2627

2728
protected override void ConfigureJobServices(IServiceCollection services, IConfigurationRoot configurationRoot)
2829
{
2930
services.Configure<CertificateStoreConfiguration>(configurationRoot.GetSection(CertificateStoreConfigurationSectionName));
31+
services.Configure<ProcessSignatureConfiguration>(configurationRoot.GetSection(ProcessSignatureConfigurationSectionName));
3032

3133
services.AddTransient<ISubscriptionProcessor<SignatureValidationMessage>, SubscriptionProcessor<SignatureValidationMessage>>();
3234

@@ -59,16 +61,8 @@ protected override void ConfigureJobServices(IServiceCollection services, IConfi
5961
services.AddTransient<IMessageHandler<SignatureValidationMessage>, SignatureValidationMessageHandler>();
6062
services.AddTransient<IPackageSigningStateService, PackageSigningStateService>();
6163
services.AddTransient<ISignaturePartsExtractor, SignaturePartsExtractor>();
62-
63-
services.AddTransient<ISignatureValidator, SignatureValidator>(p => new SignatureValidator(
64-
p.GetRequiredService<IPackageSigningStateService>(),
65-
PackageSignatureVerifierFactory.CreateMinimal(),
66-
PackageSignatureVerifierFactory.CreateFull(),
67-
p.GetRequiredService<ISignaturePartsExtractor>(),
68-
p.GetRequiredService<IProcessorPackageFileService>(),
69-
p.GetRequiredService<ICorePackageService>(),
70-
p.GetRequiredService<ITelemetryService>(),
71-
p.GetRequiredService<ILogger<SignatureValidator>>()));
64+
services.AddTransient<ISignatureFormatValidator, SignatureFormatValidator>();
65+
services.AddTransient<ISignatureValidator, SignatureValidator>();
7266
}
7367

7468
protected override void ConfigureAutofacServices(ContainerBuilder containerBuilder)

src/Validation.PackageSigning.ProcessSignature/PackageSignatureVerifierFactory.cs

Lines changed: 0 additions & 65 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
6+
namespace NuGet.Jobs.Validation.PackageSigning
7+
{
8+
public class ProcessSignatureConfiguration
9+
{
10+
/// <summary>
11+
/// When a package with a repository signature is being validated, the signing certificate of the repository
12+
/// signature must have a SHA-256 fingerprint in this list. If it does not, the repository signature is
13+
/// removed.
14+
/// </summary>
15+
public List<string> AllowedRepositorySigningCertificates { get; set; }
16+
17+
/// <summary>
18+
/// The service index URL to validate against any repository signature. If a package being validated has a
19+
/// repository signature and that signature has a V3 service index URL that does not match this value, the
20+
/// repository signature is removed.
21+
/// </summary>
22+
public string V3ServiceIndexUrl { get; set; }
23+
}
24+
}

src/Validation.PackageSigning.ProcessSignature/Settings/dev.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
"ValidationStorage": {
1818
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=nugetdevlegacy;AccountKey=$$Dev-NuGetDevLegacyStorage-Key$$"
1919
},
20+
"ProcessSignature": {
21+
"AllowedRepositorySigningCertificates": [
22+
"0e5f38f57dc1bcc806d8494f4f90fbcedd988b46760709cbeec6f4219aa6157d"
23+
],
24+
"V3ServiceIndexUrl": "https://apidev.nugettest.org/v3/index.json"
25+
},
2026

2127
"PackageDownloadTimeout": "00:10:00",
2228

src/Validation.PackageSigning.ProcessSignature/Settings/int.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
"ValidationStorage": {
1818
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=nugetint0;AccountKey=$$Int-NuGetInt0Storage-Key$$"
1919
},
20+
"ProcessSignature": {
21+
"AllowedRepositorySigningCertificates": [],
22+
"V3ServiceIndexUrl": "https://apiint.nugettest.org/v3/index.json"
23+
},
2024

2125
"PackageDownloadTimeout": "00:10:00",
2226

src/Validation.PackageSigning.ProcessSignature/Settings/prod.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
"ValidationStorage": {
1818
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=nugetgallery;AccountKey=$$Prod-NuGetGalleryStorage-Key$$"
1919
},
20+
"ProcessSignature": {
21+
"AllowedRepositorySigningCertificates": [],
22+
"V3ServiceIndexUrl": "https://api.nuget.org/v3/index.json"
23+
},
2024

2125
"PackageDownloadTimeout": "00:10:00",
2226

0 commit comments

Comments
 (0)