Skip to content
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

Support Azure Trusted Signing certificate on NuGet.org account settings #10027

Open
jozefizso opened this issue Jun 9, 2024 · 18 comments
Open

Comments

@jozefizso
Copy link
Contributor

jozefizso commented Jun 9, 2024

NuGet Product(s) Involved

Other/NA

The Elevator Pitch

The Azure Trusted Signing service rotates the managed authenticode certificates each three days.

As the NuGet Gallery requires to specify a single, long lived certificate, it is not feasible to sign nuget packages with the ATS.

Additional Context and Details

@dlemstra has authored a proposal design to fix this problem: NuGet/Home#13791

@jebriede
Copy link

@jozefizso thanks for reaching out. Could you please include details of what feature or change you are proposing? Thanks!

@jozefizso
Copy link
Contributor Author

The Gallery should support the code signatures made by Azure Trusted Signing. It is unfeasible to upload new signature to Gallery each three days to get the verified badge.

@nkolev92 nkolev92 transferred this issue from NuGet/Home Jun 18, 2024
@joelverhagen
Copy link
Member

Thanks for opening the issue @jozefizso. I agree using Trusted Signing with NuGet.org is a painful process today. You need to extract the .cer file from your signed artifact (or get it from Trusted Signing directly, perhaps) and then manually upload it to your account profile on NuGet.org.

For my own experiments I created a CLI tool to extract the .cer file and include it as a GitHub Actions artifact.
Tool: https://www.nuget.org/packages/Knapcode.CertificateExtractor
Workflow: https://github.com/joelverhagen/PackageLifeCycle/blob/7930b64f7e72518faf6b646187b47b46e2d64d22/.github/workflows/build.yml#L76-L87

This is better than nothing, but not much better!

@dlemstra
Copy link
Contributor

dlemstra commented Jun 18, 2024

I would nice if we could get a new option to specify the Enhanced key usage that is shown on the page of our Certificate Profile inside our Trusted Signing Account. That is the same one as the bottom one that is shown here:

Enhanced key usage

And then when we upload the NuGet package the server checks if this matches and also checks if the signing of the package is done by the right authority.

@joelverhagen joelverhagen changed the title Azure Trusted Signing service Support Azure Trusted Signing certificate on NuGet.org account settings Jun 18, 2024
@ianjmcm
Copy link

ianjmcm commented Jun 18, 2024

Supporting the Subscriber identity validation EKU as @dlemstra points out would be durable over all certificate rotations/renewals. Here is the public docs on these values: https://learn.microsoft.com/en-us/azure/trusted-signing/concept-trusted-signing-cert-management#subscriber-identity-validation-eku.

@mjcheetham
Copy link

This problem is currently impacting Git Credential Manager that ships a NuGet package that's signed by Azure Trusted Signing – would love to see some support for these sorts of certificates/signed packages, and a solution that is durable over all of the short-lived certs.

@jmecosta
Copy link

Thanks for opening the issue @jozefizso. I agree using Trusted Signing with NuGet.org is a painful process today. You need to extract the .cer file from your signed artifact (or get it from Trusted Signing directly, perhaps) and then manually upload it to your account profile on NuGet.org.

For my own experiments I created a CLI tool to extract the .cer file and include it as a GitHub Actions artifact. Tool: https://www.nuget.org/packages/Knapcode.CertificateExtractor Workflow: https://github.com/joelverhagen/PackageLifeCycle/blob/7930b64f7e72518faf6b646187b47b46e2d64d22/.github/workflows/build.yml#L76-L87

This is better than nothing, but not much better!

@joelverhagen is the & "bin\Sign.Cli\sign.exe" something that you have created? can you share it? or do you have any pointers how to get nuget sign with trusted service? or are you using dotnet/sign#716

@dlemstra
Copy link
Contributor

The "bin\Sign.Cli\sign.exe" executable is the output of the dotnet/sign project. The branch of my PR is still work in progress so it's subject to change. I have been using it locally but not yet in a pipeline.

@jmecosta
Copy link

yep, just getting to that conclusion also, there are a few cli options changed but pretty much what im looking for... thank you

@dlemstra
Copy link
Contributor

And those options might still change because the PR is still being reviewed by the team.

@jmecosta
Copy link

Yep important is the sign functionality itself if that works we can start integrating it already

@joelverhagen
Copy link
Member

@dlemstra is spot on. I have a private build of sign CLI used in the pipeline links above.

But to be clear this GitHub issue tracks better support of Trusted Signing on NuGet.org (verification of signing at push time in NuGet.org) and not the sign flow which is tracked by dotnet/sign#683.

@glennawatson
Copy link

Has anyone seen issues where the validation fails with sign cli and trusted signing.

I'm extracting out the certificate using @joelverhagen tool

I can see the valid certificate in the nuget package explorer tool

seeing

The package was signed, but the signing certificate (SHA-1 thumbprint <thumbprint>) is not associated with your account. You must register this certificate to publish signed packages.

I have got the SHA1/256 hash and confirmed its there, and in the cert area it's showing microsoft signing there like its picked up and processed the cert.

I have tried the sign cli experimental version, jsign client, signtool as recommended in the docs and all producing the same results.

@jmecosta
Copy link

jmecosta commented Sep 2, 2024

no problems so far, you could try this (assuming u have done az login and your account has permissions)

dotnet tool install --global AzureTrustedSignTool
dotnet tool install Knapcode.CertificateExtractor --global
dotnet tool install --global sign --prerelease
AzureTrustedSignTool sign --folder ./pkgs --searchpattern *.nupkg --accountname YourAccount --profilename YourSignProfile

that signs the packages and generates a .cer next to each nuget. so you can upload both at same time. So far no problems with this approach.

@glennawatson
Copy link

glennawatson commented Sep 2, 2024

@jmecosta I think its some sort of special rules for my package rather than a trusted signing process issue.

Eg having some packages get published (with the same single owner) and some not.

Splat had the DotNetFoundation as a owner and I know there are special rules for DNF owned packages, also its in a reserved space.

I suspect it's more rules around that rather than a legitimate certificate failure given the intermitient results about which ones pass (nupkg that never were owned by the DotNetFoundation user get published)

I have used the same steps you have used above effectively.

@jmecosta
Copy link

jmecosta commented Sep 2, 2024

Interesting I've never notice certificate bounded to package names.
If so the error message is not really accurate

@jmecosta
Copy link

jmecosta commented Sep 6, 2024

@glennawatson i can confirm this also, ive just experience the same. the account is shared, and ive uploaded the CER file with my account and the other user was not able to publish the nuget...

he then re-upload the CER to his account and was able to do so. so conclusion is that the ones uploading the nugets need to have the CER files uploaded also

@joelverhagen
Copy link
Member

@jmecosta, @glennawatson, @mjcheetham - folks, thank you for your input so far in this issue.

@dlemstra has opened a proposal design to address this NuGet.org limitation. Any input you have for Dirk and our team would be most appreciated over on the proposal PR: NuGet/Home#13791!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

9 participants