<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notary Project | A set of specifications and tools intended to provide a cross-industry standard for securing software supply chains. – Notary Project</title><link>https://notaryproject.dev/</link><description>Recent content in Notary Project on Notary Project | A set of specifications and tools intended to provide a cross-industry standard for securing software supply chains.</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><atom:link href="https://notaryproject.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Ratify Joins the Notary Project - Strengthening Software Supply Chain Security Together!</title><link>https://notaryproject.dev/blog/2025/welcome-ratify-joined-notaryproject/</link><pubDate>Mon, 02 Jun 2025 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2025/welcome-ratify-joined-notaryproject/</guid><description>
&lt;p>&lt;img src="https://notaryproject.dev/notation-ratify.svg" alt="notary project welcomes ratify">&lt;/p>
&lt;p>We’re excited to announce that &lt;a href="https://ratify.dev/" target="_blank" rel="noopener">Ratify&lt;/a> has officially joined the Notary Project as a subproject after the &lt;a href="https://github.com/notaryproject/.github/issues/81" target="_blank" rel="noopener">vote&lt;/a> passed in the community! 🎉 This marks a significant step forward in our shared mission to deliver &lt;strong>secure, transparent, and trusted&lt;/strong> software supply chain for the cloud-native ecosystem.&lt;/p>
&lt;p>The Notary Project is building a set of specifications and reference implementations to secure the integrity of container images and other OCI artifacts. With Ratify’s addition, we expand our surface to policy-based verification and extensibility, helping organizations validate signatures, SBOM, vulnerability scanning report, and other security metadata of container images in CI/CD and before deploying to Kubernetes.&lt;/p>
&lt;h2 id="why-ratify">Why Ratify?&lt;/h2>
&lt;p>&lt;a href="https://ratify.dev/" target="_blank" rel="noopener">Ratify&lt;/a> is an extensible verification framework for container images and other artifacts that can examine and author policies to audit existing resources in Kubernetes and CI/CD. Ratify can use and manage any number of custom verifiers for image metadata like signatures, SBOMs, vulnerability scan reports, and so on.&lt;/p>
&lt;p>Ratify has been widely adopted by cloud providers and organizations to enforce verification of OCI artifacts across environments. As part of the Notary Project, Ratify brings:&lt;/p>
&lt;ul>
&lt;li>An end-to-end policy-driven verification capabilities&lt;/li>
&lt;li>Extensible plugin support for different verifiers (e.g., Notation, Cosign, SBOM, vulnerability report, custom plugins) and various cloud providers (AWS, Azure, Alibaba Cloud, Venafi, etc.)&lt;/li>
&lt;li>Enforcement at admission control when users deploying an untrusted application in Kubernetes&lt;/li>
&lt;li>Cross-tool ecosystem support for Gatekeeper, Trivy, etc.&lt;/li>
&lt;/ul>
&lt;p>These Ratify repositories have been transferred to Notary Project organization:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/notaryproject/ratify" target="_blank" rel="noopener">Ratify core framework&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/ratify-go" target="_blank" rel="noopener">Ratify Go Library&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/ratify-verifier-go" target="_blank" rel="noopener">Ratify Verifier Go&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/ratify-web" target="_blank" rel="noopener">Ratify Website&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/ratify-containerd" target="_blank" rel="noopener">Ratify containerd plugin&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="what-this-means-for-the-community">What This Means for the Community&lt;/h2>
&lt;p>By welcoming Ratify as an official subproject, the Notary Project now offers a broader and more opinionated solution stack for securing software supply chain:&lt;/p>
&lt;ul>
&lt;li>Notation enables signing of OCI artifacts in CI/CD pipelines.&lt;/li>
&lt;li>Ratify enforces signature and other supply chain metadata verification policies in container runtime, Kubernetes, and CI/CD pipelines.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://notaryproject.dev/notation-ratify-e2e.png" alt="notation-ratify-e2e">&lt;/p>
&lt;p>We also want to thank the contributors from Microsoft, Alibaba Cloud, and the wider community for their work on Ratify—and for their continued commitment to open governance by donating the project to Notary Project.&lt;/p>
&lt;h2 id="what-should-ratify-users-know">What Should Ratify Users Know&lt;/h2>
&lt;p>For Ratify users, the Helm repo of Ratify has been changed from &lt;code>https://ratify-project.github.io/ratify&lt;/code> to &lt;code>https://notaryproject.github.io/ratify&lt;/code>. Please refer to &lt;a href="https://ratify.dev/docs/quick-start" target="_blank" rel="noopener">Ratify documentation&lt;/a> to use the latest repo.&lt;/p>
&lt;h2 id="whats-next">What’s Next?&lt;/h2>
&lt;p>The Ratify maintainers has been collaborating with Notary Project maintainers to align roadmaps, documentation, and release processes. You can expect:&lt;/p>
&lt;ul>
&lt;li>Continued development under the &lt;a href="https://github.com/notaryproject" target="_blank" rel="noopener">Notary Project GitHub org&lt;/a>&lt;/li>
&lt;li>Unified communication channels in Notary Project including commmunity meetings, Slack channel, social media, etc.&lt;/li>
&lt;li>Closer integration between Ratify and Notation.&lt;/li>
&lt;/ul>
&lt;p>Please join us in welcoming Ratify to the community! 🙌&lt;/p>
&lt;p>Follow us on &lt;a href="https://github.com/notaryproject" target="_blank" rel="noopener">GitHub&lt;/a> and join us on &lt;a href="https://cloud-native.slack.com/archives/CQUH8U287" target="_blank" rel="noopener">Slack channel&lt;/a>, and stay tuned for more updates.&lt;/p></description></item><item><title>Blog: Announcing Notation v2.0.0-alpha.1 to enable signing and verification of any arbitrary blob files!</title><link>https://notaryproject.dev/blog/2025/announcing-notation-v2-0-alpha/</link><pubDate>Tue, 18 Mar 2025 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2025/announcing-notation-v2-0-alpha/</guid><description>
&lt;p>&lt;img src="https://notaryproject.dev/v2.0-alpha.svg" alt="blog cover">&lt;/p>
&lt;p>We are thrilled to announce the release of &lt;a href="https://github.com/notaryproject/notation/releases/tag/v2.0.0-alpha.1" target="_blank" rel="noopener">Notation v2.0.0-alpha.1&lt;/a>, marking a significant milestone in our commitment to enhancing artifact signing and verification. This alpha release also introduces several improvements designed to provide a more versatile and efficient experience for our users.&lt;/p>
&lt;h2 id="key-highlights">Key Highlights&lt;/h2>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;p>In &lt;code>notation v1.x&lt;/code>, the &lt;code>notation sign&lt;/code> command defaults to storing signatures using the &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.1/spec.md#referrers-tag-schema" target="_blank" rel="noopener">OCI referrers tag schema&lt;/a> for maximum compatibility. As of this release, the default behavior has changed to use the &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.1/spec.md#listing-referrers" target="_blank" rel="noopener">OCI referrers API&lt;/a> since most of the popular registries are compliant with OCI v1.1. However, users can still opt for the referrers tag schema using &lt;code>--force-referrers-tag true&lt;/code> if needed.&lt;/p>
&lt;h3 id="expanded-support-for-signing-any-arbitrary-blob-files">Expanded support for signing any arbitrary blob files&lt;/h3>
&lt;p>In addition to container images and OCI artifacts, Notation now enables signing and verification of arbitrary blob files. This enhancement broadens the scope of artifacts you can securely manage, offering greater flexibility in your workflows. The new &lt;code>notation blob&lt;/code> command, along with its subcommands (sign, verify, policy, and inspect), facilitates these operations. It enables users to sign and verify arbitrary files such as SBOMs, GitHub release assets, tarballs, and other archive files.&lt;/p>
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/u3m5w8ED2aY?si=WUkGKuciCDG_VwvD" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen>&lt;/iframe>
&lt;h3 id="compliant-with-oci-v11-standard">Compliant with OCI v1.1 Standard&lt;/h3>
&lt;p>Aligning with the latest OCI specifications v1.1, Notation v2.0.0-alpha.1 adopts the OCI Referrers API for storing signatures by default. This shift ensures seamless integration with OCI v1.1-compliant registries, enhancing compatibility, portability, and adherence to industry standards. Unlike traditional method of storing signature separately as an additional tag &lt;code>sha-xxx&lt;/code> using Referrers Tag Schema, referrers API allow signatures to be linked to the signed artifact in the registry. The Referrers API also provides a structured way to query signatures (and other related metadata) for a given artifact. Instead of listing all blobs in a registry, tools can directly fetch only the relevant signatures using the referrers API, improving signing and verification efficiency.&lt;/p>
&lt;p>For registries requiring the previous referrers tag schema, users can still opt-in using the &lt;code>--force-referrers-tag&lt;/code> flag during the signing process. Notation will fallback to Referrers Tag Schema if the registry doesn&amp;rsquo;t support Referrers API.&lt;/p>
&lt;p>The Notary Project signature is now a referrer of the subject image signed by &lt;code>notation&lt;/code>. Refer to this &lt;a href="https://oras.land/docs/concepts/reftypes#listing-referrers" target="_blank" rel="noopener">conceptual doc&lt;/a> for more details.&lt;/p>
&lt;p>See a sample signature using the Referrers API below:&lt;/p>
&lt;pre>&lt;code>$ notation list ghcr.io/ratify-project/ratify@sha256:5b7efcef535eff574e064b2c0682b8a86abbeff03569a7ec78e9110fff1d8730
ghcr.io/ratify-project/ratify@sha256:5b7efcef535eff574e064b2c0682b8a86abbeff03569a7ec78e9110fff1d8730
└── application/vnd.cncf.notary.signature
└── sha256:d3c2a0b8a30aec45558f97da8577d633e5cc09bd0bf8c622896c890bf7828752
&lt;/code>&lt;/pre>&lt;p>Notary Project signature manifest:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#a40000">schemaVersion:&lt;/span> &lt;span style="color:#a40000">2,&lt;/span>
&lt;span style="color:#a40000">mediaType:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;application/vnd.oci.image.manifest.v1+json&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#a40000">config:&lt;/span> &lt;span style="color:#a40000">{&lt;/span>
&lt;span style="color:#a40000">mediaType:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;application/vnd.cncf.notary.signature&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#a40000">digest:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#a40000">size:&lt;/span> &lt;span style="color:#a40000">2,&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>&lt;span style="color:#a40000">,&lt;/span>
&lt;span style="color:#a40000">layers:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#a40000">mediaType:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;application/cose&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#a40000">digest:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;sha256:a9dfe9f9a8c19c164642630454e0e1bf2ec0df9e385e8f4be2dda5ee322a2cb7&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#a40000">size:&lt;/span> &lt;span style="color:#a40000">2378,&lt;/span>
&lt;span style="color:#000;font-weight:bold">},&lt;/span>
&lt;span style="color:#000;font-weight:bold">]&lt;/span>&lt;span style="color:#a40000">,&lt;/span>
&lt;span style="color:#a40000">subject:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#a40000">mediaType:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;application/vnd.oci.image.index.v1+json&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#a40000">digest:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;sha256:5b7efcef535eff574e064b2c0682b8a86abbeff03569a7ec78e9110fff1d8730&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#a40000">size:&lt;/span> &lt;span style="color:#a40000">2385,&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>&lt;span style="color:#a40000">,&lt;/span>
&lt;span style="color:#a40000">annotations:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">&amp;#34;io.cncf.notary.x509chain.thumbprint#S256&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;[\&amp;#34;2d71bdf96b97ee0189350a583164b7f278a9fcbb1908bc1de115e6f70d860014\&amp;#34;]&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">&amp;#34;org.opencontainers.image.created&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;2025-01-30T23:39:00Z&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>&lt;span style="color:#a40000">,&lt;/span>
&lt;span style="color:#a40000">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="delta-crl-support">Delta CRL Support&lt;/h3>
&lt;p>To optimize security and performance, this release introduces support for Delta &lt;a href="https://en.wikipedia.org/wiki/Certificate_revocation_list" target="_blank" rel="noopener">Certificate Revocation Lists (CRLs)&lt;/a>. Delta CRLs allow Notation to process only the changes since the last CRL update, resulting in faster and more efficient revocation checks. This enhancement reduces bandwidth usage and accelerates the verification process, ensuring up-to-date validation of certificates.&lt;/p>
&lt;h2 id="getting-started-with-notation-v200-alpha1">Getting Started with Notation v2.0.0-alpha.1&lt;/h2>
&lt;p>We encourage you to explore these new features and enhancements by downloading &lt;a href="https://github.com/notaryproject/notation/releases/tag/v2.0.0-alpha.1" target="_blank" rel="noopener">Notation v2.0.0-alpha.1&lt;/a> from our GitHub releases page. You can also follow the &lt;a href="https://notaryproject.dev/docs/user-guides/installation/cli">installation guidance&lt;/a> for detailed instruction. As this is an alpha release, we welcome your feedback to help us refine and improve the maturity. Please report any issues or suggestions on our GitHub issues page.&lt;/p>
&lt;p>Thank you for your continued support and contributions to the Notary Project. Together, we&amp;rsquo;re advancing the security and integrity of software supply chains.&lt;/p>
&lt;h2 id="join-us-at-kubecon-eu-in-london">Join us at KubeCon EU in London&lt;/h2>
&lt;p>Join two sessions at KubeCon EU in London to explore the challenges, lessons learned, and benefits of using the Notary Project. Dive deep into its mission and strategy, security audit, new use cases, and roadmap.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://sched.co/1td1W" target="_blank" rel="noopener">Notary Project: The Key To Secure Software Supply Chain - Yi Zha, Microsoft &amp;amp; Guillaume Gill, OrangeLogic&lt;/a>: April 4, 2025 13:45 - 14:15 BST, ICC Capital Suite 14-16, Level 3&lt;/li>
&lt;li>&lt;a href="https://sched.co/1tcut" target="_blank" rel="noopener">Project Lightning Talk: Notary Project: Securing Binary Artifacts with Fine-grained Control - Yi Zha, Maintainer&lt;/a>: April 1, 2025 10:13 - 10:18 BST, Platinum Suite, Level 3&lt;/li>
&lt;/ul>
&lt;p>Meet the Notary Project maintainers and ask us anything at our kiosk (18A) located at Level 1, Hall Entrance N8-N9. We&amp;rsquo;ll be there every afternoon from April 2 to April 4!&lt;/p></description></item><item><title>Blog: Notary Project Completes Its Second Audit!</title><link>https://notaryproject.dev/blog/2025/notary-project-completes-its-second-audit/</link><pubDate>Tue, 21 Jan 2025 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2025/notary-project-completes-its-second-audit/</guid><description>
&lt;blockquote>
&lt;p>This blog post was original published on &lt;a href="https://ostif.org/notaryproject-cryptography-audit-2025/" target="_blank" rel="noopener">OSTIF blog&lt;/a> by Helen Woeste, Communications Manager, the Open Source Technology Improvement Fund.&lt;/p>
&lt;/blockquote>
&lt;p>OSTIF is proud to share the results of our second security audit of Notary Project. You can read the Audit Report &lt;a href="https://github.com/notaryproject/specifications/blob/main/security/reports/audit/Quarkslab-notation-security-audit-25.pdf" target="_blank" rel="noopener">HERE&lt;/a>. Notary Project is “a set of specifications and tools intended to provide a cross-industry standard for securing software supply chains by using authentic container images and other OCI artifacts.” With the help of Quarkslab and the Cloud Native Computing Foundation (CNCF), this project continues to provide users with trusted software supply chain management.&lt;/p>
&lt;h2 id="audit-process">Audit Process&lt;/h2>
&lt;p>This audit of Notary Project was specifically scoped around two new cryptographic features.&lt;br>
The audit team, Quarkslab, was chosen for their practical cryptography experience to work on this engagement.&lt;br>
The audit report presents how Quarkslab installed and performed discovery of Notary Project tooling Notation, reviewed the code structure and quality, and analyzed the timestamping and certificate revocation.&lt;br>
The audit team also created multiple figures to help illustrate Notation with examples of overall project functionality, flow of certificate chain verification, and a global overview of the CRL verification.&lt;/p>
&lt;h2 id="audit-results">Audit Results&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>11 findings with Security Impact and Recommended Fixes&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>1 Medium, 1 Low, 9 Informational&lt;/li>
&lt;li>2 CVEs issued for audit findings:
&lt;ul>
&lt;li>&lt;strong>CVE-2024-56138&lt;/strong>: Notation-go timestamp signature generation lacks certificate revocation check.&lt;/li>
&lt;li>&lt;strong>CVE-2024-51491&lt;/strong>: Notation-go process crash during CRL-based revocation check on OS using separate mount point for temp directory.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Review and Recommendations for 2 New Cryptographic Features&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Timestamping Support&lt;/strong>
&lt;ul>
&lt;li>Time-Stamp Protocol Compliance&lt;/li>
&lt;li>Time Stamp Analysis in Notation&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Revocation Checking with Certificate Revocation List&lt;/strong>
&lt;ul>
&lt;li>Certificate Revocation List Compliance&lt;/li>
&lt;li>CRL Analysis in Notation&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Future Security Work Recommendations&lt;/strong>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>This was Notary Project’s third security audit and second audit in partnership with OSTIF.&lt;br>
Practicing mature security practices, the three audits were all undertaken after implementation of new features with security impact.&lt;br>
Notary Project’s efforts to provide secure code to users was observable to the audit team and is reflected by the reported findings and further recommendations for future security work.&lt;/p>
&lt;p>Thank you to the individuals and groups that made this engagement possible:&lt;/p>
&lt;ul>
&lt;li>Notary Project maintainers and community, notably: Pritesh Bandi, Junjie Gao, Vani Rao, Shiwei Zhang, Yi Zha, Patrick Zheng, and Feynman Zhou&lt;/li>
&lt;li>Quarkslab: Dahmun Goudarzi, Sébastien Rolland, and Ramtine Tofighi Shirazi&lt;/li>
&lt;li>Cloud Native Computing Foundation (CNCF)&lt;/li>
&lt;/ul></description></item><item><title>Blog: Notary Project announces Notation v1.3.0 and tspclient-go v1.0.0!</title><link>https://notaryproject.dev/blog/2025/announcing-notation-v1-3/</link><pubDate>Fri, 17 Jan 2025 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2025/announcing-notation-v1-3/</guid><description>
&lt;p>The Notary Project maintainers are thrilled to announce the latest releases, including &lt;a href="https://github.com/notaryproject/notation/releases/tag/v1.3.0" target="_blank" rel="noopener">notation v1.3.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-go/releases/tag/v1.3.0" target="_blank" rel="noopener">notation-go v1.3.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-core-go/releases/tag/v1.2.0" target="_blank" rel="noopener">notation-core-go v1.2.0&lt;/a> and &lt;a href="https://github.com/notaryproject/tspclient-go/releases/tag/v1.0.0" target="_blank" rel="noopener">tspclient-go v1.0.0&lt;/a>!&lt;/p>
&lt;p>These new versions are production ready and have successfully completed a comprehensive &lt;a href="https://www.cncf.io/blog/2025/01/21/notary-project-completes-its-second-audit/" target="_blank" rel="noopener">security audit&lt;/a>. Check out the &lt;a href="https://github.com/notaryproject/specifications/tree/main/security/reports/audit/Quarkslab-notation-security-audit-25.pdf" target="_blank" rel="noopener">security audit report&lt;/a> for more details. Our commitment to providing secure and high-quality signing and verification tools for our users has never been stronger!&lt;/p>
&lt;h2 id="notable-capabilities-in-these-releases">Notable Capabilities in these Releases&lt;/h2>
&lt;p>Here are the major capabilities and features included in these releases.&lt;/p>
&lt;h3 id="the-first-major-release-of-tspclient-go-library">The first major release of &lt;code>tspclient-go&lt;/code> library&lt;/h3>
&lt;p>Looking for a robust implementation of &lt;a href="https://datatracker.ietf.org/doc/html/rfc3161" target="_blank" rel="noopener">RFC 3161&lt;/a> Timestamp Protocol Client in Go? The library &lt;a href="https://github.com/notaryproject/tspclient-go" target="_blank" rel="noopener">tspclient-go&lt;/a> is the answer. Here is why:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>RFC 3161 Compliance&lt;/strong>: Adheres to the specification RFC 3161 for timestamping clients. Supports timestamping with popular public TSAs like DigiCert and GlobalSign.&lt;/li>
&lt;li>&lt;strong>Secure&lt;/strong>: Implements secure communication protocols, ensuring the integrity and authenticity of timestamps.&lt;/li>
&lt;li>&lt;strong>Minimal Dependencies&lt;/strong>: Uses only standard Go libraries. Less dependencies, more secure.&lt;/li>
&lt;li>&lt;strong>High Test Coverage&lt;/strong>: Boasts up to 95% test coverage.&lt;/li>
&lt;li>&lt;strong>Security Audited&lt;/strong>: Passed a comprehensive security audit with no advisories, ensuring a high quality bar.&lt;/li>
&lt;li>&lt;strong>Ease of Use&lt;/strong>: Seamlessly integrates into Go applications with a straightforward API.&lt;/li>
&lt;/ul>
&lt;p>Notary Project&amp;rsquo;s &lt;a href="https://notaryproject.dev/docs/user-guides/how-to/timestamping/">timestamping feature&lt;/a> is built on this library.&lt;/p>
&lt;h3 id="certificate-revocation-checking-using-certificate-revocation-list-crl">Certificate Revocation checking using Certificate Revocation List (CRL)&lt;/h3>
&lt;p>Certificate revocation checking enhances security by ensuring that compromised or expired certificates are not used, thereby maintaining the integrity and trustworthiness of digital signatures. It also helps organizations comply with security standards and regulations. With this release, Notation implements the &lt;a href="https://github.com/notaryproject/specifications/blob/v1.1.0/specs/trust-store-trust-policy.md#crls" target="_blank" rel="noopener">Notary Project CRL specification&lt;/a> with CRL cache support. Notation now supports two certificate revocation checking methods: Online Certificate Status Protocol (OCSP) and CRL. OCSP is preferred, but if unavailable, CRLs are used as a fallback. For more details on CRL cache directories, visit &lt;a href="https://notaryproject.dev/docs/user-guides/how-to/directory-structure">this link&lt;/a>.&lt;/p>
&lt;p>By default, Notary Project trust policies enforce revocation checking, so users do not need to configure it. For more details on fine-tuning revocation settings, visit &lt;a href="https://github.com/notaryproject/specifications/blob/v1.1.0/specs/trust-store-trust-policy.md#trust-policy-properties" target="_blank" rel="noopener">this link&lt;/a>.&lt;/p>
&lt;h2 id="get-started-with-notation-v130">Get started with Notation v1.3.0&lt;/h2>
&lt;p>You can follow the &lt;a href="https://notaryproject.dev/docs/quickstart-guides/quickstart-sign-image-artifact/">quick start guide&lt;/a> to try Notation v1.3.0 for basic signing and verification workflow.&lt;/p>
&lt;h2 id="whats-next">What&amp;rsquo;s next&lt;/h2>
&lt;p>The Notary Project maintainers are considering the following features for future milestones. Feel free to reach out on the &lt;a href="https://app.slack.com/client/T08PSQ7BQ/CQUH8U287/" target="_blank" rel="noopener">Slack channel&lt;/a> or &lt;a href="https://github.com/notaryproject/notation/issues" target="_blank" rel="noopener">GitHub issues&lt;/a> to ask questions, provide feedback, or share ideas.&lt;/p>
&lt;ul>
&lt;li>Sign and verify arbitrary blobs&lt;/li>
&lt;li>Attestations&lt;/li>
&lt;/ul>
&lt;p>And more!&lt;/p>
&lt;h2 id="acknowledgements">Acknowledgements&lt;/h2>
&lt;p>The Notary Project release team wants to thank the entire Notary Project community for all the activity and engagement that has been vital for helping the project grow and reach this milestone.&lt;/p>
&lt;p>We are especially grateful to the CNCF for funding the security audit, the OSTIF for arranging it, and Quarkslab for conducting and releasing the audit report.&lt;/p></description></item><item><title>Blog: Notary Project announces Specification v1.1.0 and Notation v1.2.0!</title><link>https://notaryproject.dev/blog/2024/announcing-notation-v1-2/</link><pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2024/announcing-notation-v1-2/</guid><description>
&lt;p>The Notary Project maintainers are excited to announce new releases, including &lt;a href="https://github.com/notaryproject/specifications/releases/tag/v1.1.0" target="_blank" rel="noopener">Notary Project specifications v1.1.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation/releases/tag/v1.2.0" target="_blank" rel="noopener">notation v1.2.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-go/releases/tag/v1.1.0" target="_blank" rel="noopener">notation-go v1.2.0&lt;/a>, and &lt;a href="https://github.com/notaryproject/notation-core-go/releases/tag/v1.1.0" target="_blank" rel="noopener">notation-core-go v1.1.0&lt;/a>. These versions are now ready for production use!&lt;/p>
&lt;h2 id="deprecation">Deprecation&lt;/h2>
&lt;p>The experimental flag &lt;code>--allow-referrers-api&lt;/code> used by &lt;code>notation sign&lt;/code> and &lt;code>notation verify&lt;/code> commands is now deprecated. See &lt;a href="#support-oci-specification-v110">Support OCI specification v1.1.0&lt;/a> for details.&lt;/p>
&lt;h2 id="notable-capabilities-in-this-release">Notable Capabilities in this Release&lt;/h2>
&lt;p>Here are some of the major capabilities and features included in this release.&lt;/p>
&lt;h3 id="notary-project-specifications">Notary Project specifications&lt;/h3>
&lt;p>The Notary Project specifications now include support for &lt;a href="https://www.rfc-editor.org/rfc/rfc3161" target="_blank" rel="noopener">RFC 3161&lt;/a> timestamping and introduce Notation plugin conventions in the &lt;a href="https://github.com/notaryproject/specifications/blob/v1.1.0/specs/plugin-extensibility.md" target="_blank" rel="noopener">plugin specification&lt;/a>.&lt;/p>
&lt;h3 id="support-oci-specification-v110">Support OCI specification v1.1.0&lt;/h3>
&lt;p>In Feb 2024, the Open Container Initiative (OCI) community released version 1.1.0, which includes the &lt;a href="https://github.com/opencontainers/image-spec/releases/tag/v1.1.0" target="_blank" rel="noopener">OCI image specification v1.1.0&lt;/a> and the &lt;a href="https://github.com/opencontainers/distribution-spec/releases/tag/v1.1.0" target="_blank" rel="noopener">OCI distribution specification v1.1.0&lt;/a>. Notation now adheres to the OCI spec v1.1.0, leading to the deprecation of the experimental flag &lt;code>--allow-referrers-api&lt;/code>. A new flag, &lt;code>--force-referrers-tag&lt;/code> (default to &lt;code>true&lt;/code>), has been introduced to the &lt;code>notation sign&lt;/code> command. Using the default &lt;code>true&lt;/code> value, the referrers tag schema is always used for storing signatures in registries. You can set the value to &lt;code>false&lt;/code> to use the &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.0/spec.md#enabling-the-referrers-api" target="_blank" rel="noopener">referrers API&lt;/a> for signature storage if the target registry supports the referrers API (if it does not, the referrers tag fallback will be used). In contrast, the &lt;code>notation verify/list/inspect&lt;/code> commands will attempt to use the referrers API first and automatically fall back to the &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.0/spec.md#referrers-tag-schema" target="_blank" rel="noopener">referrers tag schema&lt;/a> if the referrers API is not supported by the registry.&lt;/p>
&lt;blockquote>
&lt;p>[!NOTE]
We will change the default value of &lt;code>--force-referrers-tag&lt;/code> to &lt;code>false&lt;/code> in Notation v2.0 release, making referrers API usage as the default.&lt;/p>
&lt;/blockquote>
&lt;h3 id="support-for-rfc-3161-compliant-timestamping">Support for RFC 3161 compliant timestamping&lt;/h3>
&lt;p>Since this release, Notation supports RFC 3161 compliant timestamping. Digital signatures must be generated within the certificate&amp;rsquo;s validity period, as expired certificates compromise the signature&amp;rsquo;s trustworthiness. Timestamping extends the trust of signatures created within certificate validity, allowing successful signature verification even after certificates have expired. Notation&amp;rsquo;s timestamping feature is built on top of the &lt;a href="https://github.com/notaryproject/tspclient-go" target="_blank" rel="noopener">tspclient-go&lt;/a> library.&lt;/p>
&lt;p>Learn more at the document &lt;a href="https://notaryproject.dev/docs/user-guides/how-to/timestamping/">how to sign and verify artifacts in OCI-compliant registries with timestamping&lt;/a>.&lt;/p>
&lt;h3 id="other-changes">Other changes&lt;/h3>
&lt;p>Notation CLI now offers the &lt;code>armv7&lt;/code> binary, enabling its usage in environments such as Internet of Things (IoT) or embedded systems.&lt;/p>
&lt;h2 id="get-started-with-notation-v120">Get started with Notation v1.2.0&lt;/h2>
&lt;p>You can follow the &lt;a href="https://notaryproject.dev/docs/quickstart-guides/quickstart-sign-image-artifact/">quick start guide&lt;/a> to try Notation v1.2.0 for basic signing and verification workflow.&lt;/p>
&lt;h2 id="whats-next">What&amp;rsquo;s next&lt;/h2>
&lt;p>The Notary Project maintainers are considering the following features for future milestones. Feel free to reach out on the &lt;a href="https://app.slack.com/client/T08PSQ7BQ/CQUH8U287/" target="_blank" rel="noopener">Slack channel&lt;/a> or &lt;a href="https://github.com/notaryproject/notation/issues" target="_blank" rel="noopener">GitHub issues&lt;/a> to ask questions, provide feedback, or share ideas.&lt;/p>
&lt;ul>
&lt;li>Revocation checking using Certificate Revocation List (CRL)&lt;/li>
&lt;li>Sign and verify arbitrary blobs&lt;/li>
&lt;li>Attestations&lt;/li>
&lt;/ul>
&lt;p>And more!&lt;/p>
&lt;h2 id="acknowledgements">Acknowledgements&lt;/h2>
&lt;p>The Notary Project release team wants to thank the entire Notary Project community for all the activity and engagement that has been vital for helping the project grow and reach this milestone.&lt;/p></description></item><item><title>Blog: Bitnami now uses Notation for signing and verifying containers and Helm charts on Docker Hub</title><link>https://notaryproject.dev/blog/2024/bitnami-using-notation/</link><pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2024/bitnami-using-notation/</guid><description>
&lt;p>Bitnami-packaged open source software container images and Helm charts &lt;a href="https://hub.docker.com/u/bitnami" target="_blank" rel="noopener">available in DockerHub&lt;/a> are now signed by &lt;a href="https://github.com/notaryproject/notation" target="_blank" rel="noopener">Notation&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://bitnami.com" target="_blank" rel="noopener">Bitnami&lt;/a> provides the latest versions of pre-packaged, hardened, ready-to-deploy open source software application packages that enable developers to hit the ground running when building new applications and services on any platform. Bitnami open source software packages are highly popular with developers with over 500 million pulls per month and over 2 billion computer hours per year. This strong developer community of Bitnami has leveraged its robust application catalog to build millions of applications for almost 20 years now.&lt;/p>
&lt;p>In December 2023, &lt;a href="https://tanzu.vmware.com/content/tanzu-application-catalog-resources/tanzu-application-catalog-leverages-notation" target="_blank" rel="noopener">we announced&lt;/a> that Tanzu Application Catalog, the enterprise edition of Bitnami Application Catalog, started making use of Notation as a tool for signing and verifying open container initiative (OCI) artifacts (e.g. container images, Helm charts, and metadata bundles.&lt;/p>
&lt;p>Now, we are happy to have extended our collaboration with Notation and announce the extension of this capability to the community edition of Bitnami-packaged container images and Helm charts in DockerHub as well.&lt;/p>
&lt;p>To know more about the benefits that the Bitnami users stand to enjoy with this integration and to learn how to verify the signature of a Bitnami-package, check out &lt;a href="https://blog.bitnami.com/2024/03/bitnami-packaged-containers-and-helm.html" target="_blank" rel="noopener">this blog&lt;/a>.&lt;/p>
&lt;p>If you are interested in learning more about Tanzu Application Catalog, check out their &lt;a href="https://tanzu.vmware.com/application-catalog" target="_blank" rel="noopener">product webpage&lt;/a> and &lt;a href="https://tanzu.vmware.com/content/vmware-application-catalog-resources/jun-23-boost-developer-productivity-and-operator-confidence-with-secure-open-source-components" target="_blank" rel="noopener">additional resources&lt;/a>.&lt;/p></description></item><item><title>Blog: Notary Project announces Notation v1.1.0!</title><link>https://notaryproject.dev/blog/2024/announcing-notation-v1-1/</link><pubDate>Thu, 08 Feb 2024 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2024/announcing-notation-v1-1/</guid><description>
&lt;p>The Notary Project maintainers are proud to announce new releases for its sub-projects, including &lt;a href="https://github.com/notaryproject/specifications/releases/tag/v1.1.0" target="_blank" rel="noopener">Notary Project specifications v1.1.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation/releases/tag/v1.1.0" target="_blank" rel="noopener">notation v1.1.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-go/releases/tag/v1.1.0" target="_blank" rel="noopener">notation-go v1.1.0&lt;/a>, and &lt;a href="https://github.com/notaryproject/notation-core-go/releases/tag/v1.0.2" target="_blank" rel="noopener">notation-core-go v1.0.2&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-action/releases/tag/v1.0.1" target="_blank" rel="noopener">Notation GitHub Actions v1.0.1&lt;/a> which are ready for production use!&lt;/p>
&lt;p>Meanwhile, a new library &lt;a href="https://github.com/notaryproject/notation-plugin-framework-go" target="_blank" rel="noopener">notation-plugin-framework-go
&lt;/a> released the first release v1.0.0. It contains framework required to create notation plugins as per &lt;a href="https://github.com/notaryproject/specifications/blob/v1.1.0/specs/plugin-extensibility.md" target="_blank" rel="noopener">Notation Plugin specification&lt;/a>.&lt;/p>
&lt;h2 id="notable-capabilities-in-this-release">Notable Capabilities in this Release&lt;/h2>
&lt;p>Here are some of the major capabilities and features included in this release.&lt;/p>
&lt;h3 id="easier-plugin-management-functionalities">Easier plugin management functionalities&lt;/h3>
&lt;p>Notation has an &lt;a href="https://github.com/notaryproject/specifications/blob/v1.1.0/specs/plugin-extensibility.md" target="_blank" rel="noopener">extensible design based on a plugin framework&lt;/a>. This framework provides plugin interfaces for users and vendors to implement their own integration with key/certificate management solutions or signing services.&lt;/p>
&lt;p>In this release, Notation offers Notation plugin management capabilities to simplify the plugin user experience.&lt;/p>
&lt;ul>
&lt;li>Added new command &lt;code>notation plugin install&lt;/code>. Users are now able to install a notation plugin directly from a URL or from their file system. Supported plugin installation formats are &lt;code>.zip&lt;/code>, &lt;code>.tar.gz&lt;/code>, and single plugin executable file. See an example usage below:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">$ notation plugin install --file &amp;lt;file_path&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">$ notation plugin install --sha256sum &amp;lt;digest&amp;gt; --url &amp;lt;HTTPS_URL&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Added new command &lt;code>notation plugin uninstall&lt;/code>. Users are now able to uninstall a notation plugin by providing the plugin name. See an example usage below:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">notation plugin uninstall &amp;lt;plugin_name&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;p>The following plugins have been well tested with Notation plugin commands by Notary Project maintainers:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html" target="_blank" rel="noopener">AWS Signer plugin for Notation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tutorial-sign-build-push" target="_blank" rel="noopener">Azure Key Vault for Notation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Venafi/notation-venafi-csp" target="_blank" rel="noopener">Venafi CodeSign Protect Signing Plugin for Notation&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="specifications">Specifications&lt;/h3>
&lt;p>For plugin vendors who want to package and distribute a Notation plugin, &lt;a href="https://github.com/notaryproject/specifications/blob/v1.1.0/specs/plugin-extensibility.md" target="_blank" rel="noopener">Notation Plugin specification&lt;/a> defines the plugin conventions to ensure plugins are delivered in a consistent format and compatible with &lt;code>notation plugin&lt;/code> management commands.&lt;/p>
&lt;h3 id="get-started-with-notation-v110">Get started with Notation v1.1.0&lt;/h3>
&lt;p>You can follow this &lt;a href="https://notaryproject.dev/docs/quickstart/" target="_blank" rel="noopener">quick start&lt;/a> to try Notation v1.1.0 on your terminal.&lt;/p>
&lt;p>The default Notation CLI setup action in Notation GitHub Actions has also been updated to v1.1.0. It enables users to install Notation and its plugin, sign and verify OCI artifacts in GitHub Actions workflow with ease.&lt;/p>
&lt;p>To get started with Notation v1.1.0 in a CI/CD workflow, you can find the Notation GitHub Actions in the &lt;a href="https://github.com/marketplace/actions/notation-actions" target="_blank" rel="noopener">Marketplace&lt;/a>.&lt;/p>
&lt;h2 id="whats-next">What&amp;rsquo;s next&lt;/h2>
&lt;p>The Notary Project maintainers are considering the following features for future milestones. Feel free to reach out on the &lt;a href="https://app.slack.com/client/T08PSQ7BQ/CQUH8U287/" target="_blank" rel="noopener">Slack channel&lt;/a> or &lt;a href="https://github.com/notaryproject/notation/issues" target="_blank" rel="noopener">GitHub issues&lt;/a> to ask questions, provide feedback, or share ideas.&lt;/p>
&lt;ul>
&lt;li>Sign and verify arbitrary blobs&lt;/li>
&lt;li>Timestamping support&lt;/li>
&lt;li>Improve error messages and verbose logs&lt;/li>
&lt;/ul>
&lt;p>And more!&lt;/p>
&lt;h2 id="acknowledgements">Acknowledgements&lt;/h2>
&lt;p>The Notary Project release team wants to thank the entire Notary Project community for all the activity and engagement that has been vital for helping the project grow and reach this major milestone.&lt;/p></description></item><item><title>Blog: VMware Tanzu Application Catalog now uses Notation for signing and verifying OCI artifacts</title><link>https://notaryproject.dev/blog/2023/vmware-tanzu-application-catalog-using-notation/</link><pubDate>Tue, 19 Dec 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/vmware-tanzu-application-catalog-using-notation/</guid><description>
&lt;p>&lt;a href="https://tanzu.vmware.com/application-catalog" target="_blank" rel="noopener">VMware Tanzu Application Catalog&lt;/a>, the enterprise edition of &lt;a href="https://bitnami.com/" target="_blank" rel="noopener">Bitnami Application Catalog&lt;/a>, now leverages &lt;a href="https://github.com/notaryproject/notation" target="_blank" rel="noopener">Notation&lt;/a> as a tool for signing and verifying open container initiative (OCI) artifacts (e.g. container images, Helm charts, and metadata bundles).&lt;/p>
&lt;p>Tanzu Application Catalog enables enterprises to build their own private catalog of custom-packaged open source application components that are continuously maintained and verifiably tested for use in production environments. Built by leveraging Bitnami’s expertise in packaging hundreds of open source software applications and delivering them to millions of developers, Tanzu Application Catalog aims to address the open source software needs of enterprises by providing them with customized ready-to-deploy open source applications along with extensive metadata for efficient risk assessment.&lt;/p>
&lt;p>With this integration, Notation plays a key role in Tanzu Application Catalog’s mission of making open source software enterprise ready.&lt;/p>
&lt;h2 id="what-tanzu-application-catalog-achieves-by-using-notation">What Tanzu Application Catalog achieves by using Notation&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Ensure content integrity&lt;/strong>: By signing their OCI artifacts using Notation, Tanzu Application Catalog team can help ensure the integrity of the OCI artifacts they deliver to their customers. Tanzu team uses Notation to sign their OCI artifacts, creating a unique fingerprint for each version of the artifact. Any tampering with the OCI artifact will result in a failed verification, alerting users to potential security threats.&lt;/li>
&lt;li>&lt;strong>Verify authenticity&lt;/strong>: Knowing the source of OCI artifacts is crucial for security and compliance of enterprises. Notation, a client from the Notary Project, helps generate cryptographic signatures to verify artifact authenticity by validating signer&amp;rsquo;s cryptographic identity. Validation helps ensures that the signed applications are built by trusted sources, i.e. Tanzu Application Catalog in this case, reducing the risk of deploying unapproved software.&lt;/li>
&lt;li>&lt;strong>Interoperability across tools and platforms&lt;/strong>: Notary Project along with its client tool Notation has standardized signature format. This standardization enables interoperability across different tools, registries, container orchestrators, and platforms that support the OCI image format.&lt;/li>
&lt;/ul>
&lt;p>Thus, Notation, with its standards-based tooling for signing and verifying artifacts, helps Tanzu Application Catalog achieve improved security while delivering compliant open source software artifacts for mission critical production use cases.&lt;/p>
&lt;p>To read more about how Tanzu Application Catalog leverages Notation, check out &lt;a href="https://tanzu.vmware.com/content/vmware-application-catalog-resources/tanzu-application-catalog-leverages-notation" target="_blank" rel="noopener">this blog&lt;/a>.&lt;/p>
&lt;p>If you are interested in learning more about Tanzu Application Catalog, check out their &lt;a href="https://tanzu.vmware.com/application-catalog" target="_blank" rel="noopener">product webpage&lt;/a> and &lt;a href="https://tanzu.vmware.com/content/vmware-application-catalog-resources/jun-23-boost-developer-productivity-and-operator-confidence-with-secure-open-source-components" target="_blank" rel="noopener">additional resources&lt;/a>.&lt;/p></description></item><item><title>Blog: Notary Project featured on the Enlightning Podcast</title><link>https://notaryproject.dev/blog/2023/notary-enlightning-podcast/</link><pubDate>Wed, 04 Oct 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/notary-enlightning-podcast/</guid><description>
&lt;p>Notary Project maintainers Toddy Mladenov and Milind Gokarn talk with host Whitney Lee about the Notary Project on the &lt;a href="https://tanzu.vmware.com/content/videos/enlightning-ensuring-software-authenticity-introduction-to-notary-project" target="_blank" rel="noopener">Enlightning Podcast&lt;/a>. This wide-ranging discussion covers everything from the project history, to concepts, and to the future of the project.&lt;/p>
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/FwpHZfNE9LQ?si=pzxe-qRM2z3oetwV" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen>&lt;/iframe></description></item><item><title>Blog: Notary Project announces a major release!</title><link>https://notaryproject.dev/blog/2023/announcing-major-release/</link><pubDate>Tue, 22 Aug 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/announcing-major-release/</guid><description>
&lt;p>The Notary Project maintainers are proud to announce a major release, including &lt;a href="https://github.com/notaryproject/specifications/releases/tag/v1.0.0" target="_blank" rel="noopener">Notary Project specifications v1.0.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation/releases/tag/v1.0.0" target="_blank" rel="noopener">notation v1.0.0&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-go/releases/tag/v1.0.0" target="_blank" rel="noopener">notation-go v1.0.0&lt;/a>, and &lt;a href="https://github.com/notaryproject/notation-core-go/releases/tag/v1.0.0" target="_blank" rel="noopener">notation-core-go v1.0.0&lt;/a> which are ready for production use!&lt;/p>
&lt;h2 id="what-is-notary-project-and-notation">What is Notary Project and Notation?&lt;/h2>
&lt;p>As containers and cloud native artifacts become common deployment units, users want to make sure that they are authentic in their environments. The Notary Project is a set of specifications and tools intended to provide cross-industry standards for securing software supply chains through signing and verification, signature portability, and key/certificate management.&lt;/p>
&lt;p>Notation is a sub-project of Notary Project, which consists of the &lt;code>notation&lt;/code> CLI and two Golang libraries which implement the latest &lt;a href="https://github.com/notaryproject/specifications/releases/tag/v1.0.0" target="_blank" rel="noopener">Notary Project specifications&lt;/a>. Notation was started in &lt;a href="https://github.com/notaryproject/meeting-notes/blob/main/meeting-notes-2019.md#notary-v2-kickoff-meeting" target="_blank" rel="noopener">Dec 2019&lt;/a> and the code has matured through a series of minor and RC releases over the last few years; The first version of the CLI and libraries &lt;a href="https://notaryproject.dev/blog/2021/announcing-notation-alpha1/" target="_blank" rel="noopener">v0.7.0-alpha.1&lt;/a> was released in Oct 2021. Several alpha, beta, and RC releases later, the binaries reached the final &lt;a href="https://notaryproject.dev/blog/2023/announcing-notation-rc6/" target="_blank" rel="noopener">v1.0.0-RC.7&lt;/a> release in May 2023.&lt;/p>
&lt;p>To learn more about the Notary Project, see the &lt;a href="https://github.com/notaryproject/.github#notary-project-overview" target="_blank" rel="noopener">Notary Project Overview&lt;/a> and the &lt;a href="https://notaryproject.dev/docs/faq/#notary-project-terms" target="_blank" rel="noopener">FAQ&lt;/a>.&lt;/p>
&lt;h2 id="notable-capabilities-in-this-release">Notable Capabilities in this Release&lt;/h2>
&lt;p>Here are some of the major capabilities and features included in this release.&lt;/p>
&lt;h3 id="specifications">Specifications&lt;/h3>
&lt;p>&lt;a href="https://github.com/notaryproject/specifications/releases/tag/v1.0.0" target="_blank" rel="noopener">Notary Project specifications&lt;/a> reached its major release. All specifications, requirements, scenarios, threat model, and security audit reports are available in this release. ISVs and tool developers that want to interoperate with the Notary Project signatures and tooling should use the specifications to ensure compatibility.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/signature-specification.md" target="_blank" rel="noopener">Notary Project OCI signature specification&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/signature-envelope-cose.md" target="_blank" rel="noopener">Notary Project OCI COSE signature envelope&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/signature-envelope-jws.md" target="_blank" rel="noopener">Notary Project OCI JWS signature envelope&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/signing-and-verification-workflow.md" target="_blank" rel="noopener">Notary Project OCI signing and verification workflow&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/signing-scheme.md" target="_blank" rel="noopener">Notary Project signing scheme&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/trust-store-trust-policy.md" target="_blank" rel="noopener">Notary Project Trust Store and Trust Policy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/plugin-extensibility.md" target="_blank" rel="noopener">Notation Plugin specification&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="signing-and-verification-functionalities">Signing and verification functionalities&lt;/h3>
&lt;p>From the software producer&amp;rsquo;s perspective, signing a software artifact enables their consumers to detect tampering and ensure authenticity of the artifact. Signing software can also increase trust when distributing software artifacts to consumers. Notary Project provides the following core capabilities for the signing experience:&lt;/p>
&lt;ul>
&lt;li>Sign artifacts using signing keys stored securely in a key management system (KMS) or a signing service. See the available plugins in the section &lt;a href="#extensibility-plugin-support-for-notation">Extensibility: plugin support for Notation&lt;/a>&lt;/li>
&lt;li>Sign artifacts as well as list and inspect signatures stored in OCI-compliant registries
&lt;ul>
&lt;li>Compliant with &lt;a href="https://github.com/opencontainers/image-spec/tree/v1.0.2" target="_blank" rel="noopener">&lt;code>image-spec v1.0.2&lt;/code>&lt;/a>&lt;/li>
&lt;li>Compliant with &lt;a href="https://github.com/opencontainers/distribution-spec/tree/v1.0.1" target="_blank" rel="noopener">&lt;code>distribution-spec v1.0.1&lt;/code>&lt;/a>&lt;/li>
&lt;li>Compatible with &lt;a href="https://github.com/opencontainers/image-spec/tree/v1.1.0-rc4" target="_blank" rel="noopener">&lt;code>image-spec v1.1.0-rc4&lt;/code>&lt;/a>&lt;/li>
&lt;li>Compatible with &lt;a href="https://github.com/opencontainers/distribution-spec/tree/v1.1.0-rc3" target="_blank" rel="noopener">&lt;code>distribution-spec v1.1.0-rc3&lt;/code>&lt;/a> (limited to &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.0-rc3/spec.md#referrers-tag-schema" target="_blank" rel="noopener">referrers tag schema&lt;/a>)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Support two signature envelope formats
&lt;ul>
&lt;li>&lt;a href="https://github.com/notaryproject/notaryproject/blob/v1.0.0/specs/signature-envelope-cose.md" target="_blank" rel="noopener">COSE&lt;/a>: COSE is an efficient, binary envelope format that can be used for variety of scenarios ranging from signing traditional software to IoT workloads running on low-powered devices.&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notaryproject/blob/v1.0.0/specs/signature-envelope-jws.md" target="_blank" rel="noopener">JWS&lt;/a>: JWS is a widely used JSON-based envelope format that can be used for interoperability with existing applications and various authentication schemes including OIDC.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>From the software consumer&amp;rsquo;s perspective, verifying the signature of a signed artifact ensures its integrity and authenticity. Notary Project provides the following core capabilities for verification experience:&lt;/p>
&lt;ul>
&lt;li>Verify signatures using &lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/trust-store-trust-policy.md" target="_blank" rel="noopener">trust store and trust policy&lt;/a>. This also includes fine-tuned OCI repository specific trust policies and support for various enforcement levels (e.g. &lt;code>enforce&lt;/code>, &lt;code>permissive&lt;/code>, &lt;code>audit&lt;/code>) to enable a wide range of scenarios.&lt;/li>
&lt;li>&lt;a href="https://notaryproject.dev/docs/user-guides/cli-reference/notation_policy/">&lt;code>notation policy&lt;/code>&lt;/a> command can be used to simplify the experience of importing and inspecting the trust policy.&lt;/li>
&lt;/ul>
&lt;h3 id="experimental-features">Experimental features&lt;/h3>
&lt;p>Experimental features are intended for testing and evaluation purposes only and should not be used in production environments. Users can enable experimental features in Notation CLI by setting the environment variable &lt;code>NOTATION_EXPERIMENTAL&lt;/code> to 1 as shown below.&lt;/p>
&lt;pre>&lt;code>export NOTATION_EXPERIMENTAL=1
&lt;/code>&lt;/pre>&lt;p>There are two major features which are marked as experimental.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://notaryproject.dev/docs/user-guides/how-to/oci-image-layout/">Signing, listing, and verifying artifacts with OCI image layout&lt;/a> before they are pushed to a registry. This enables users sign and verify artifacts stored on the local file system.&lt;/li>
&lt;li>&lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.0-rc2/spec.md#enabling-the-referrers-api" target="_blank" rel="noopener">OCI distribution referrers API&lt;/a>. This allows the Notation CLI to fetch a list of signatures in an efficient and clean manner.&lt;/li>
&lt;/ul>
&lt;h3 id="extensibility-plugin-support-for-notation">Extensibility: plugin support for Notation&lt;/h3>
&lt;p>Notation has an &lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/plugin-extensibility.md" target="_blank" rel="noopener">extensible design based on a plugin framework&lt;/a>. This framework provides plugin interfaces for users and vendors to implement their own integrations with key/certificate management solutions or signing services. Currently, Notation has the following plugins available.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html" target="_blank" rel="noopener">AWS Signer plugin for Notation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tutorial-sign-build-push" target="_blank" rel="noopener">Azure Key Vault for Notation&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="integration-with-admission-controller-for-kubernetes-usage">Integration with admission controller for Kubernetes usage&lt;/h3>
&lt;p>To enable users to verify and secure image deployment on Kubernetes, the Notary Project maintainers worked with the &lt;a href="https://github.com/deislabs/ratify" target="_blank" rel="noopener">Ratify&lt;/a> and &lt;a href="https://kyverno.io/" target="_blank" rel="noopener">Kyverno&lt;/a> teams to provide solutions for verifying images signed by Notation before deploying them to Kubernetes. Users have two different options to build a complete end-to-end image integrity workflow for their environments. For more details, see:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify" target="_blank" rel="noopener">Sign and verify an image with Notation, Ratify, and OPA Gatekeeper&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://kyverno.io/docs/writing-policies/verify-images/notary/" target="_blank" rel="noopener">Verify CNCF Notary Project signatures with Kyverno&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://notaryproject.dev/e2e-workflow.png" alt="e2e workflow">&lt;/p>
&lt;h2 id="built-in-security">Built-in security&lt;/h2>
&lt;p>As part of our commitment to security, the Notary Project maintainers engaged with CNCF to set up continuous fuzzing of the source code and completed a security audit in 2023. All vulnerabilities found during the testing and the audit were fixed before the release of the libraries and the CLI. Below are links to the security reports:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/notaryproject/notaryproject/blob/main/security/reports/audit/ADA-notation-security-audit-23.pdf" target="_blank" rel="noopener">Notation Security Audit Report 2023&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notaryproject/tree/main/security/reports/fuzzing/ADA-fuzzing-audit-22-23.pdf" target="_blank" rel="noopener">Notary Project fuzzing audit report 22-23&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="whats-next">What&amp;rsquo;s next&lt;/h2>
&lt;p>The Notary Project maintainers are considering the following features for future milestones. Feel free to reach out on the &lt;a href="https://app.slack.com/client/T08PSQ7BQ/CQUH8U287/" target="_blank" rel="noopener">Slack channel&lt;/a> or &lt;a href="https://github.com/notaryproject/.github/issues" target="_blank" rel="noopener">GitHub issues&lt;/a> to ask questions, provide feedback, or share ideas.&lt;/p>
&lt;ul>
&lt;li>Sign and verify arbitrary blobs&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation-action" target="_blank" rel="noopener">GitHub Actions&lt;/a> and other CI/CD integration for signing and verification&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation-hashicorp-vault" target="_blank" rel="noopener">HashiCorp Vault plugin&lt;/a> (experimental)&lt;/li>
&lt;li>Plugin lifecycle management&lt;/li>
&lt;li>Timestamping support&lt;/li>
&lt;li>Manage trust policy via CLI commands&lt;/li>
&lt;/ul>
&lt;h2 id="acknowledgements">Acknowledgements&lt;/h2>
&lt;p>The Notary Project release team wants to thank the entire Notary Project community for all the activity and engagement that has been vital for helping the project grow and reach this major milestone.&lt;/p>
&lt;h2 id="try-it-now">Try it now&lt;/h2>
&lt;p>You can follow this &lt;a href="https://killercoda.com/notaryproject/scenario/notation" target="_blank" rel="noopener">interactive tutorial&lt;/a> to try Notation CLI v1.0.0 in an online cloud playground or follow the &lt;a href="https://notaryproject.dev/docs/quickstart/" target="_blank" rel="noopener">quick start&lt;/a> on your computer.&lt;/p></description></item><item><title>Blog: Announcing results of Notation security audit 2023</title><link>https://notaryproject.dev/blog/2023/notation-completes-security-audit/</link><pubDate>Thu, 06 Jul 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/notation-completes-security-audit/</guid><description>
&lt;p>In early 2023, Notary Project, under the guidance of &lt;a href="https://cncf.io/" target="_blank" rel="noopener">Cloud Native Computing Foundation&lt;/a> began work with &lt;a href="https://adalogics.com/" target="_blank" rel="noopener">Ada Logics&lt;/a> to perform the first security audit of the Notation libraries and CLI. The Notation libraries and CLI are a reference implementation of the latest Notary Project specifications. Ada Logics discovered seven issues and those issues have been fixed by Notary Project maintainers. This blog post summarizes the overall findings and notes a few things learnt from the security audit result.&lt;/p>
&lt;p>We are very grateful to the CNCF for funding this work, the &lt;a href="http://ostif.org/ostifs-security-audit-of-notation-duly-noted/" target="_blank" rel="noopener">OSTIF for arranging the audit&lt;/a>, and Ada Logics for &lt;a href="https://adalogics.com/blog/notation-security-audit-2023" target="_blank" rel="noopener">conducting&lt;/a> and &lt;a href="https://github.com/notaryproject/notaryproject/blob/main/security/reports/audit/ADA-notation-security-audit-23.pdf" target="_blank" rel="noopener">releasing&lt;/a> the security audit.&lt;/p>
&lt;h2 id="summary-of-findings">Summary of findings&lt;/h2>
&lt;p>Ada Logics identified seven issues of varying severity:&lt;/p>
&lt;ul>
&lt;li>one high-severity issue&lt;/li>
&lt;li>two moderate-severity issues&lt;/li>
&lt;li>three low-severity issues&lt;/li>
&lt;li>one informational issue&lt;/li>
&lt;/ul>
&lt;p>All issues were fixed in &lt;a href="https://notaryproject.dev/blog/2023/announcing-notation-rc6/" target="_blank" rel="noopener">Notation v1.0.0-RC.6&lt;/a>. As a result, all subsequent releases of Notation CLI, including latest RC-7 and the upcoming 1.0.0 release, includes these fixes. The Notary Project maintainers created CVEs for three issues, and tracked the remaining four issues as non-CVEs involving documentation or CLI command flags name changes.&lt;/p>
&lt;p>Below are the specific details for the seven issues identified in the security audit:&lt;/p>
&lt;ul>
&lt;li>Potential endless data attack in &lt;code>notation ls&lt;/code>, ADA-NOT-23-1, aka &lt;a href="https://github.com/notaryproject/notation/security/advisories/GHSA-rvrx-rrwh-r9p6" target="_blank" rel="noopener">CVE-2023-33958&lt;/a>, fixed in Notation-v1.0.0-RC.6.&lt;/li>
&lt;li>Max allowed signatures could lead to an endless data attack, ADA-NOT-23-2, aka &lt;a href="https://github.com/notaryproject/notation/security/advisories/GHSA-9m3v-v4r5-ppx7" target="_blank" rel="noopener">CVE-2023-33957&lt;/a>, fixed in Notation-v1.0.0-RC.6.&lt;/li>
&lt;li>Overwriting global variable could lead to undefined behavior of Notation in the future, ADA-NOT-23-3, fixed in Notation-v1.0.0-RC.6.&lt;/li>
&lt;li>Insufficient security-relevant documentation findings, ADA-NOT-23-4, are fixed with documentation updates in &lt;a href="https://notaryproject.dev/docs/user-guides/secure-deployment/">securely deploy Notation&lt;/a>.&lt;/li>
&lt;li>Clear text storage of sensitive information in an environment variable, ADA-NOT-23-5, fixed by adding security best practice document on &lt;a href="https://notaryproject.dev/docs/user-guides/how-to/registry-authentication/">how to authenticate to OCI registries&lt;/a>.&lt;/li>
&lt;li>Insufficient verification of fetched artifact descriptor, ADA-NOT-23-6, aka &lt;a href="https://github.com/notaryproject/notation-go/security/advisories/GHSA-xhg5-42rf-296r" target="_blank" rel="noopener">CVE-2023-33959&lt;/a>, fixed in Notation-v1.0.0-RC.6.&lt;/li>
&lt;li>Denial of service from resource exhaustion in &lt;code>notation inspect&lt;/code>, ADA-NOT-23-7, fixed in Notation-v1.0.0-RC.6.&lt;/li>
&lt;/ul>
&lt;h2 id="details-by-category-of-findings">Details by category of findings&lt;/h2>
&lt;h3 id="endless-data-attack-can-cause-resource-exhaustion-leading-to-denial-of-service-attack-ada-not-23-1-ada-not-23-2-and-ada-not-23-7">Endless data attack can cause resource exhaustion leading to denial of service attack (ADA-NOT-23-1, ADA-NOT-23-2, and ADA-NOT-23-7)&lt;/h3>
&lt;p>This issue was initially reported for the &lt;code>notation list&lt;/code> command which lists all signature artifacts associated with a signed image (OCI artifact). This issue can also affect other CLI commands such as &lt;code>notation inspect&lt;/code>, or &lt;code>notation verify&lt;/code> which pulls all signatures associated with an image. Refer to &lt;a href="https://github.com/notaryproject/notation/security/advisories/GHSA-9m3v-v4r5-ppx7" target="_blank" rel="noopener">CVE-2023-33957&lt;/a> and &lt;a href="https://github.com/notaryproject/notation/security/advisories/GHSA-rvrx-rrwh-r9p6" target="_blank" rel="noopener">CVE-2023-33958&lt;/a> for details. The concern was a threat actor could cause denial of service attack by associating large number of signatures to an OCI artifact, such as a container image, and causing Notation to endlessly enumerate all signatures. The fix was relatively straightforward to have a default configurable maximum limit of 100 signatures that Notation CLI will enumerate for any given operation. Users can adjust this number for their unique needs.&lt;/p>
&lt;h3 id="overwriting-a-global-variable-could-lead-to-undefined-behavior-ada-not-23-3">Overwriting a global variable could lead to undefined behavior (ADA-NOT-23-3)&lt;/h3>
&lt;p>Notation overwrites a global import identifier in the verification command. There is no current way to exploit this issue, but it could lead to undefined behavior of Notation in the future, if a contributor adds code that allows an attacker to trigger an issue. The issue is flagged informational since we have found no attack vector.&lt;/p>
&lt;h3 id="insufficient-documentation-and-non-descriptive-cli-command-ada-not-23-4-and-ada-not-23-5">Insufficient documentation and non-descriptive CLI command (ADA-NOT-23-4 and ADA-NOT-23-5)&lt;/h3>
&lt;p>Notation maintainers have improved documentation to include security best practices for&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://notaryproject.dev/docs/user-guides/secure-deployment/">Securely deploying Notation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://notaryproject.dev/docs/developer-guides/secure-plugin-development/">Securely developing and managing plugins&lt;/a>. Ensure plugins are downloaded from a trusted source&lt;/li>
&lt;li>Renamed &lt;code>plain-http&lt;/code> flag to &lt;code>insecure-registry&lt;/code> to clarify that authenticating to registries over HTTP is insecure and should only be used for testing purposes&lt;/li>
&lt;/ul>
&lt;h3 id="validating-unintended-artifact-ada-not-23-6">Validating unintended artifact (ADA-NOT-23-6)&lt;/h3>
&lt;p>This issue allowed threat actors, who have compromised the registry, to sign or verify the artifact other than intended one. Refer to &lt;a href="https://github.com/notaryproject/notation-go/security/advisories/GHSA-xhg5-42rf-296r" target="_blank" rel="noopener">CVE-2023-33959&lt;/a> for more details. The issue has been fixed in the notation-go library to validate that the descriptor signed or verified by Notation is the one provided by user.&lt;/p>
&lt;h2 id="fuzzing">Fuzzing&lt;/h2>
&lt;p>The Notary Project announced the completion of its fuzzing security audit in Mar 2023. The audit was also carried out by Ada Logics and is part of &lt;a href="https://www.cncf.io/blog/2022/06/28/improving-security-by-fuzzing-the-cncf-landscape/" target="_blank" rel="noopener">an initiative by the CNCF&lt;/a> to bring fuzzing to the CNCF landscape. The fuzzing audit resulted in 20 fuzzers written for 3 Notation code repositories and 2 issues being identified and addressed including a critical security fix. The full report from the fuzzing audit is available &lt;a href="https://github.com/notaryproject/notaryproject/tree/main/security/reports/fuzzing/ADA-fuzzing-audit-22-23.pdf" target="_blank" rel="noopener">here&lt;/a>.&lt;/p>
&lt;h2 id="slsa">SLSA&lt;/h2>
&lt;p>Supply chain Levels for Software Artifacts (SLSA) is a check-list of standards and controls to prevent tampering, improve integrity, and secure software packages and infrastructure. It is organized into a series of levels that provide increasing integrity guarantees.&lt;/p>
&lt;p>Notation build process does not generate provenance artifacts. The Notary Project maintainers have a plan to generate the provenance artifacts for Notation to ensure the origins of the binaries.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>The Notary Project maintainers owe a huge thanks to the CNCF, OSTIF, and Ada Logics for sponsoring, facilitating, and conducting this security audit. Aside from their observations above, the auditors noted that Notation contributors follow high security standards and best practices for implementation.&lt;/p>
&lt;p>If you have questions about the audit report, reach out to Notary Project maintainers in the &lt;a href="https://cloud-native.slack.com/messages/notary-project/" target="_blank" rel="noopener">#notary-project&lt;/a> channel of the &lt;a href="https://slack.cncf.io/" target="_blank" rel="noopener">CNCF&lt;/a> Slack workspace. If you find any security vulnerability, please use the GitHub Security Vulnerability Disclosure process for each one of the Notary Project repositories by following this &lt;a href="https://github.com/notaryproject/.github/blob/main/SECURITY.md#reporting-a-vulnerability" target="_blank" rel="noopener">guide&lt;/a>.&lt;/p></description></item><item><title>Blog: Notation v1.0.0-RC.7 is available!</title><link>https://notaryproject.dev/blog/2023/announcing-notation-rc6/</link><pubDate>Sun, 28 May 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/announcing-notation-rc6/</guid><description>
&lt;p>The Notation maintainers are pleased to announce the release of Notation v1.0.0-RC.7, including &lt;a href="https://github.com/notaryproject/notation/releases/tag/v1.0.0-rc.7" target="_blank" rel="noopener">Notation CLI v1.0.0-rc.7&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-go/releases/tag/v1.0.0-rc.6" target="_blank" rel="noopener">notation-go library v1.0.0-rc.6&lt;/a>, and &lt;a href="https://github.com/notaryproject/notation-core-go/releases/tag/v1.0.0-rc.4" target="_blank" rel="noopener">notation-core-go library v1.0.0-rc.4&lt;/a>. This blog walks you through the updates in this release.&lt;/p>
&lt;blockquote>
&lt;p>NOTE: Both Notation CLI v1.0.0-rc.7 and v1.0.0-rc.6 have the same functionalities. However, v1.0.0-rc.7 included an additional &lt;a href="https://github.com/notaryproject/notation/pull/690" target="_blank" rel="noopener">fix&lt;/a> for an E2E test case.&lt;/p>
&lt;/blockquote>
&lt;h2 id="whats-new">What&amp;rsquo;s new&lt;/h2>
&lt;p>This release adds the following major changes:&lt;/p>
&lt;ul>
&lt;li>Security advisory fixes: &lt;a href="https://github.com/notaryproject/notation/security/advisories/GHSA-9m3v-v4r5-ppx7" target="_blank" rel="noopener">CVE-2023-33957&lt;/a>, &lt;a href="https://github.com/notaryproject/notation/security/advisories/GHSA-rvrx-rrwh-r9p6" target="_blank" rel="noopener">CVE-2023-33958&lt;/a>, &lt;a href="https://github.com/notaryproject/notation-go/security/advisories/GHSA-xhg5-42rf-296r" target="_blank" rel="noopener">CVE-2023-33959&lt;/a>&lt;/li>
&lt;li>Notation commands support reading Docker credentials if the &lt;a href="https://docs.docker.com/engine/reference/commandline/login/#configure-the-credentials-store" target="_blank" rel="noopener">credentials store&lt;/a> is not present&lt;/li>
&lt;li>Renamed &lt;code>--plain-http&lt;/code> to &lt;code>--insecure-registry&lt;/code> to guide that it should only for testing&lt;/li>
&lt;li>Improved error messages&lt;/li>
&lt;li>Bug fixes&lt;/li>
&lt;li>Updated dependencies&lt;/li>
&lt;/ul>
&lt;h3 id="notation-commands-support-reading-docker-credentials-if-credentials-store-is-not-present">Notation commands support reading Docker credentials if credentials store is not present&lt;/h3>
&lt;p>Security best practices recommend that users configure a credentials store to securely manage credentials, especially in production environments. Notation commands use the following order to find credentials to authenticate with registries. Notation commands first look for credentials in its Notation’s config file, if absent Notation looks for credentials in docker config file, and if even that is not present, Notation uses the operating system default. This way, for users who do not configure explicit credentials in Notation, a successful &lt;code>docker login&lt;/code>, will enable them to run &lt;code>notation sign/verify/list/inspect&lt;/code> commands without the need to complete notation login first.&lt;/p>
&lt;p>However, there may be cases where no credentials store is present, such as in a test environment. If no credentials store is present, Docker stores the credentials in the config files by default, see &lt;a href="https://docs.docker.com/engine/reference/commandline/login/#default-behavior" target="_blank" rel="noopener">reference&lt;/a>. Starting with Notation v1.0.0-RC.7, notation commands support reading credentials from the Docker config file if no credentials store is present. This way, a successful &lt;code>docker login&lt;/code>, will enable users to run &lt;code>notation sign/verify/list/inspect&lt;/code> commands without the need to complete &lt;code>notation login&lt;/code> first. For example,&lt;/p>
&lt;pre>&lt;code class="language-console" data-lang="console"># No credentials store is present
docker login &amp;lt;registry&amp;gt;
notation sign --key &amp;lt;key_name&amp;gt; &amp;lt;image&amp;gt;
notation ls &amp;lt;image&amp;gt;
notation inspect &amp;lt;image&amp;gt;
notation verify &amp;lt;image&amp;gt;
&lt;/code>&lt;/pre>&lt;h3 id="flag---plain-http-was-renamed-to---insecure-registry">Flag &lt;code>--plain-http&lt;/code> was renamed to &lt;code>--insecure-registry&lt;/code>&lt;/h3>
&lt;p>The original flag &lt;code>--plain-http&lt;/code> and its description did not emphasize that it is an insecure way to connect to the registry, and it should only be used for testing purposes. With updated description and the name changed to &lt;code>--insecure-registry&lt;/code>, it is now more intuitive and emphasized for users to understand the usage of this flag. Other than the name change, there is no difference between the two flags.&lt;/p>
&lt;h2 id="known-issue">Known issue&lt;/h2>
&lt;p>An issue was reported on this version that &lt;code>notation login/logout&lt;/code> commands failed to detect credentials store, which is actually present and used by Docker CLI. See &lt;a href="https://github.com/notaryproject/notation/issues/696" target="_blank" rel="noopener">details&lt;/a>. This issue doesn&amp;rsquo;t impact other notation commands, so if you have successfully logged in registries using &lt;code>docker login&lt;/code>, you can continue to use other Notation commands, for example, &lt;code>notation sign&lt;/code>. If you want to fix the issue for &lt;code>notation login/logout&lt;/code>, the workaround is to manually create or update &lt;code>config.json&lt;/code> file with correct credentials store configuration, and store this file under notation &lt;a href="https://notaryproject.dev/docs/user-guides/how-to/directory-structure/">configuration directory&lt;/a>. For example:&lt;/p>
&lt;pre>&lt;code class="language-jsonc" data-lang="jsonc">{
&amp;quot;credsStore&amp;quot;: &amp;quot;desktop.exe&amp;quot;
}
&lt;/code>&lt;/pre>&lt;p>In above example, &lt;code>desktop.exe&lt;/code> is the Docker credential store installed in Windows.&lt;/p>
&lt;h2 id="credits">Credits&lt;/h2>
&lt;p>We would like to specially thank the Notary maintainers, contributors, and the broader Notary community for helping us throughout the release process with timely feedback, reviews, and testing and for all your support to help ensure a timely release. Sending credits to the following contributors who made great contributions to Notation v1.0.0-RC.7.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/FeynmanZhou" target="_blank" rel="noopener">@FeynmanZhou&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/gokarnm" target="_blank" rel="noopener">@gokarnm&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/iamsamirzon" target="_blank" rel="noopener">@iamsamirzon&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JeyJeyGao" target="_blank" rel="noopener">@JeyJeyGao&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/priteshbandi" target="_blank" rel="noopener">@priteshbandi&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/qweeah" target="_blank" rel="noopener">@qweeah&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/rgnote" target="_blank" rel="noopener">@rgnote&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/shizhMSFT" target="_blank" rel="noopener">@shizhMSFT&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/toddysm" target="_blank" rel="noopener">@toddysm&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Two-Hearts" target="_blank" rel="noopener">@Two-Hearts&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/vaninrao10" target="_blank" rel="noopener">@vaninrao10&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Wwwsylvia" target="_blank" rel="noopener">@Wwwsylvia&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/yizha1" target="_blank" rel="noopener">@yizha1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/zr-msft" target="_blank" rel="noopener">@zr-msft&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="download-and-give-it-a-try">Download and give it a try&lt;/h2>
&lt;p>Follow this &lt;a href="https://notaryproject.dev/docs/quickstart/" target="_blank" rel="noopener">hands-on guide&lt;/a> to get started.&lt;/p></description></item><item><title>Blog: Notation v1.0.0-RC.5 is available!</title><link>https://notaryproject.dev/blog/2023/announcing-notation-rc5/</link><pubDate>Thu, 18 May 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/announcing-notation-rc5/</guid><description>
&lt;p>The Notation maintainers are pleased to announce v1.0.0-RC.5 for &lt;a href="https://github.com/notaryproject/notation" target="_blank" rel="noopener">notation CLI&lt;/a> and &lt;a href="https://github.com/notaryproject/notation-go" target="_blank" rel="noopener">notation-go library&lt;/a>. This blog walks you through the major updates in this release.&lt;/p>
&lt;h2 id="major-updates-in-notation-cli-and-notation-go-library">Major updates in notation CLI and notation-go library&lt;/h2>
&lt;p>Notation is a CLI tool to sign and verify OCI artifacts. The v1.0.0-RC.5 changes include but are not limited to the following. See the &lt;a href="https://github.com/notaryproject/notation-go/releases/tag/v1.0.0-rc.5" target="_blank" rel="noopener">v1.0.0-RC.5 release notes&lt;/a> for details.&lt;/p>
&lt;ul>
&lt;li>Improve the output message for &lt;code>notation inspect&lt;/code> and &lt;code>notation list&lt;/code> when there is no signature associated with the image being referred&lt;/li>
&lt;li>Update compatibility with the &lt;a href="https://github.com/opencontainers/distribution-spec/releases/tag/v1.1.0-rc2" target="_blank" rel="noopener">OCI distribution-spec 1.1.0-RC.2&lt;/a> and &lt;a href="https://github.com/opencontainers/image-spec/releases/tag/v1.1.0-rc.3" target="_blank" rel="noopener">OCI image-spec v1.1.0-RC.3&lt;/a>&lt;/li>
&lt;li>Use SHA256 instead of insecure SHA1 for certificate thumbprint in &lt;code>notation inspect&lt;/code>&lt;/li>
&lt;li>Update &lt;a href="https://github.com/opencontainers/image-spec" target="_blank" rel="noopener">OCI image-spec&lt;/a> from 1.1.0-RC.2 to 1.1.0-RC.3&lt;/li>
&lt;/ul>
&lt;p>Notation-go is a collection of Golang libraries to support signing and verifying OCI artifacts. It is based on the Notary Project signature specification. Notation-go v1.0.0-RC.5 removes OCI artifact manifest type from &lt;a href="https://pkg.go.dev/github.com/notaryproject/notation-go@main#Sign" target="_blank" rel="noopener">Sign&lt;/a> function.&lt;/p>
&lt;h3 id="deprecate-flag---signature-manifest-in-notation-sign">Deprecate flag &lt;code>--signature-manifest&lt;/code> in notation sign&lt;/h3>
&lt;p>Since v1.0.0-RC.5, Notation no longer supports creating signatures with OCI artifact manifest type in the signing process and deprecated the flag &lt;code>--signature-manifest&lt;/code> from &lt;code>notation sign&lt;/code>. Please note this is a breaking change in Notation v1.0.0-RC.5. We chose to make this deprecation before the v1.0.0 release due to the upstream changes in the &lt;a href="https://github.com/opencontainers/image-spec/releases/tag/v1.1.0-rc.3" target="_blank" rel="noopener">OCI image-spec v1.1.0-rc.3&lt;/a> that removed the artifact manifest.&lt;/p>
&lt;p>To mitigate the impact to Notation users, Notation v1.0.0-RC.5 is still able to read and verify the existing signatures stored with the OCI artifact manifest type in OCI v1.1.0-RC.1 compliant registries. OCI artifacts signed by earlier versions of Notation are still verifiable with Notation v1.0.0-RC.5.&lt;/p>
&lt;h3 id="change-default-behavior-and-introduce-a-new-flag---allow-referrers-api">Change default behavior and introduce a new flag &lt;code>--allow-referrers-api&lt;/code>&lt;/h3>
&lt;p>Starting with Notation v1.0.0-RC.5 release, Notation will use the &lt;a href="https://github.com/opencontainers/distribution-spec/blob/main/spec.md#referrers-tag-schema" target="_blank" rel="noopener">Referrers Tag Schema&lt;/a> as the default behavior since most of the OCI registries are compatible with storing signatures using the Referrers Tag Schema. The &lt;a href="https://github.com/opencontainers/distribution-spec/blob/main/spec.md#enabling-the-referrers-api" target="_blank" rel="noopener">Referrers API&lt;/a> and its fallback strategy are still under development according to recent OCI Distribution Spec changes, so it is marked as experimental in Notation v1.0.0-RC.5.&lt;/p>
&lt;p>In this context, Notation v1.0.0-RC.5 introduces a new experimental flag &lt;code>--allow-referrers-api&lt;/code> to the following commands:&lt;/p>
&lt;ul>
&lt;li>notation sign&lt;/li>
&lt;li>notation verify&lt;/li>
&lt;li>notation inspect&lt;/li>
&lt;li>notation list&lt;/li>
&lt;/ul>
&lt;p>Specifically, users need to set the environment variable &lt;code>NOTATION_EXPERIMENTAL=1&lt;/code> to enable this new flag, then Notation attempts the Referrers API and fallback to Referrers Tag Schema on failure when using with OCI registry. Otherwise, Notation has deterministic behavior and uses Referrers Tag Schema by default.&lt;/p>
&lt;p>Please note that users need to add this experimental flag &lt;code>--allow-referrers-api&lt;/code> when verifying signatures with OCI v1.1 compliant registry after upgrading Notation from v1.0.0 RC.4.&lt;/p>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;a href="https://github.com/opencontainers/distribution-spec/blob/main/spec.md#referrers-tag-schema" target="_blank" rel="noopener">Referrers Tag Schema&lt;/a> is described as &lt;code>&amp;lt;alg&amp;gt;-&amp;lt;ref&amp;gt;&lt;/code>, such as &lt;code>sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&lt;/code>. For backwards compatibility, this behavior should work in existing OCI v1.0 compliant registries without any changes needed.
&lt;/div>
&lt;h2 id="credits">Credits&lt;/h2>
&lt;p>We would like to specially thank the Notary maintainers, contributors, and the broader Notary community for helping us throughout the release process with timely feedback, reviews, testing, and support to help ensure a timely release. Sending credits to the following contributors who made great contributions to v1.0.0-RC.5.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/FeynmanZhou" target="_blank" rel="noopener">@FeynmanZhou&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/iamsamirzon" target="_blank" rel="noopener">@iamsamirzon&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JeyJeyGao" target="_blank" rel="noopener">@JeyJeyGao&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/ningziwen" target="_blank" rel="noopener">@ningziwen&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/priteshbandi" target="_blank" rel="noopener">@priteshbandi&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/shizhMSFT" target="_blank" rel="noopener">@shizhMSFT&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Two-Hearts" target="_blank" rel="noopener">@Two-Hearts&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/toddysm" target="_blank" rel="noopener">@toddysm&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/vaninrao10" target="_blank" rel="noopener">@vaninrao10&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/yizha1" target="_blank" rel="noopener">@yizha1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/zr-msft" target="_blank" rel="noopener">@zr-msft&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="download-and-give-it-a-try">Download and give it a try&lt;/h2>
&lt;p>Follow this &lt;a href="https://notaryproject.dev/docs/quickstart/" target="_blank" rel="noopener">hands-on guide&lt;/a> to get started.&lt;/p></description></item><item><title>Blog: Notation v1.0.0-RC.4 is available!</title><link>https://notaryproject.dev/blog/2023/announcing-notation-rc4/</link><pubDate>Fri, 21 Apr 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/announcing-notation-rc4/</guid><description>
&lt;p>The Notation maintainers are pleased to announce the releases of Notation CLI v1.0.0-rc.4, notation-go v1.0.0-rc.4, and notation-core-go v1.0.0-rc.3. This blog walks you through the major updates of this release.&lt;/p>
&lt;h2 id="whats-new">What&amp;rsquo;s new&lt;/h2>
&lt;p>This release adds the following significant enhancements:&lt;/p>
&lt;ul>
&lt;li>Support validating certificate revocation with &lt;a href="https://datatracker.ietf.org/doc/html/rfc6960" target="_blank" rel="noopener">Online Certificate Status Protocol&lt;/a> (OCSP)&lt;/li>
&lt;li>Introduce switch &lt;code>NOTATION_EXPERIMENTAL=1&lt;/code> to enable experimental features&lt;/li>
&lt;li>Introduce new CLI command &lt;code>notation policy&lt;/code> to simplify trust policy configuration&lt;/li>
&lt;li>Support &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.0-rc1/spec.md#listing-referrers" target="_blank" rel="noopener">OCI distribution referrers API&lt;/a>&lt;/li>
&lt;li>Introduce signing, listing and verification with &lt;a href="https://github.com/opencontainers/image-spec/blob/v1.0/image-layout.md" target="_blank" rel="noopener">OCI image layout&lt;/a> for signing images before they are pushed in a registry as an experimental feature&lt;/li>
&lt;li>Experimental flag &lt;code>--signature-manifest&lt;/code> for &lt;code>notation sign&lt;/code> command is now controlled by switch &lt;code>NOTATION_EXPERIMENTAL=1&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="support-validating-certificate-revocation-with-ocsp">Support validating Certificate revocation with OCSP&lt;/h3>
&lt;p>Notation now supports Certificate Revocation using &lt;a href="https://datatracker.ietf.org/doc/html/rfc6960" target="_blank" rel="noopener">Online Certificate Status Protocol(OCSP)&lt;/a> for distributing certificate revocation information. Notation clients uses OCSP to query if any certificate used for signing has been revoked. Signers can revoke a certificate to inform verifiers that any signature generated by the certificate (beyond the revocation date) should no longer be trusted. To enforce validating certificate revocation, the verification level of trust policy must be set to &lt;code>strict&lt;/code> as following. Depending on the trust policy verification level setting, &lt;code>notation verify&lt;/code> command automatically validates the signatures and checks the revocation status. The verification process will fail if any certificate in the certificate chain has been revoked.&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">&lt;span style="color:#4e9a06">&amp;#34;signatureVerification&amp;#34;&lt;/span>&lt;span style="color:#a40000">:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">&amp;#34;level&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;strict&amp;#34;&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="introduce-switch-notation_experimental1-to-enable-experimental-features">Introduce switch &lt;code>NOTATION_EXPERIMENTAL=1&lt;/code> to enable experimental features&lt;/h3>
&lt;p>Experimental features are intended for testing and evaluation purposes only and should not be used in production environments. You can now enable experimental features in Notation CLI by setting the &lt;code>NOTATION_EXPERIMENTAL&lt;/code> environment variable to &lt;code>1&lt;/code>. Here&amp;rsquo;s an example of how to set the environment variable in Linux or macOS:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">NOTATION_EXPERIMENTAL&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>And here&amp;rsquo;s an example of how to set the environment variable in Windows PowerShell:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-powershell" data-lang="powershell">&lt;span style="color:#000">$env:NOTATION_EXPERIMENTAL&lt;/span>&lt;span style="color:#000;font-weight:bold">=&lt;/span>&lt;span style="color:#000">1&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once you&amp;rsquo;ve set the environment variable, you can use Notation with experimental features enabled. Here is the list of experimental features that Notation introduced:&lt;/p>
&lt;ul>
&lt;li>Store signatures using artifact manifest (Require Registry support)&lt;/li>
&lt;li>Signing, listing and verifying images as OCI image layout&lt;/li>
&lt;/ul>
&lt;h3 id="introduce-new-cli-command-notation-policy-to-simplify-trust-policy-configuration">Introduce new CLI command &lt;code>notation policy&lt;/code> to simplify trust policy configuration&lt;/h3>
&lt;p>To simplify the user experience of managing trust policy configuration, we have introduced two new commands in the v1.0.0-rc.4 release: &lt;code>notation policy import&lt;/code> and &lt;code>notation policy show&lt;/code>.&lt;/p>
&lt;p>Previously, users had to follow several steps to configure trust policy configuration in a JSON file, save the file with a specific name, ensure the file encoding was utf-8, and put the file in a specific directory that varied across different operating systems. With the &lt;code>notation policy import&lt;/code> command, users can now import trust policy configuration directly from the JSON file after completing the first step above. Additionally, a health check is performed on the trust policy configuration during import to avoid configuration issues that may arise later. For example:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">notation policy import my_policy.json
&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>notation policy show&lt;/code> command allows users to easily view trust policy configuration and redirect the output to a file for sharing, updating, or other purposes. For example:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">notation policy show
&lt;/code>&lt;/pre>&lt;/div>&lt;p>We will be introducing more commands in future releases. Stay tuned for updates on how we&amp;rsquo;re making it easier for you to manage your trust policy configuration.&lt;/p>
&lt;h3 id="support-oci-distribution-11-referrers-api">Support OCI distribution 1.1 referrers API&lt;/h3>
&lt;p>The Referrers API is a new feature added in &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.0-rc1/spec.md#listing-referrers" target="_blank" rel="noopener">OCI distribution spec v1.1-rc.1&lt;/a>, which allows clients to fetch a list of referrers in an efficient and clean manner. In the context of Notation, referrers are signatures that refer to the container image. Since this release, Notation verifies whether the Referrers API is available in the registry when pushing signatures into the registry. If the Referrers API is not available, Notation follows the &lt;a href="https://github.com/opencontainers/distribution-spec/blob/v1.1.0-rc1/spec.md#unavailable-referrers-api" target="_blank" rel="noopener">fallback procedure&lt;/a> and updates the image index pushed to a tag described by the referrers tag schema.&lt;/p>
&lt;h3 id="introduce-signing-listing-and-verification-with-oci-image-layout-as-an-experimental-feature">Introduce signing, listing and verification with OCI image layout as an experimental feature&lt;/h3>
&lt;p>Typically, images are pushed to registries before they are signed. The images you are going to sign could already be tampered with. These images could pass signature verification and be deployed in the production environment. To address this issue, we have introduced an experimental feature that allows users to sign images before pushing them to registries. This is especially valuable if the registries are not within your trust boundaries. The OCI image layout is a standard defined in the &lt;a href="https://github.com/opencontainers/image-spec/blob/v1.0/image-layout.md" target="_blank" rel="noopener">OCI image spec 1.0&lt;/a>. It is essentially a directory structure that contains files and folders that refer to an OCI image. Here&amp;rsquo;s a glimpse of the experience on Linux, and we will release a tutorial for this feature soon.&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#8f5902;font-style:italic"># Enable experimental feature&lt;/span>
&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">NOTATION_EXPERIMENTAL&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span>
&lt;span style="color:#8f5902;font-style:italic"># Create oci image layout as tarball file&lt;/span>
docker buildx build . -f Dockerfile -o &lt;span style="color:#000">type&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>oci,dest&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>hello-world.tar -t hello-world:v1
&lt;span style="color:#8f5902;font-style:italic"># Extract tarball to a directory named hello-world, &lt;/span>
&lt;span style="color:#8f5902;font-style:italic"># so that the signatures can be associated with the image&lt;/span>
tar -xf ./hello-world.tar -C hello-world
&lt;span style="color:#8f5902;font-style:italic"># Sign OCI image layout&lt;/span>
notation sign --oci-layout ./hello-world:v1
&lt;span style="color:#8f5902;font-style:italic"># List signatures&lt;/span>
notation list --oci-layout ./hello-world:v1
&lt;span style="color:#8f5902;font-style:italic"># Configure trust policy scope &amp;#34;local/hello-world&amp;#34; and verify signatures stored in OCI layout directory&lt;/span>
notation verify --oci-layout ./hello-world:v1 --scope &lt;span style="color:#4e9a06">&amp;#34;local/hello-world&amp;#34;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>After signing OCI image layout successfully, you can use tools like &lt;a href="https://oras.land/" target="_blank" rel="noopener">oras&lt;/a> to push OCI image layout including signatures from local to remote registries.&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#8f5902;font-style:italic"># Use oras CLI to push OCI image layout to remote registries&lt;/span>
oras cp --from-oci-layout -r ./hello-world:v1 ghcr.io/&lt;span style="color:#000">$username&lt;/span>/hello-world:v1
&lt;span style="color:#8f5902;font-style:italic"># List the signature, which is exactly the same as you signed locally&lt;/span>
notation list ghcr.io/&lt;span style="color:#000">$username&lt;/span>/hello-world:v1
&lt;span style="color:#8f5902;font-style:italic"># Verify the image before deployment&lt;/span>
notation verify ghcr.io/&lt;span style="color:#000">$username&lt;/span>/hello-world:v1
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Please give it a try and let us know your feedback. We will continue to iterate on it.&lt;/p>
&lt;h2 id="other-updates">Other updates&lt;/h2>
&lt;ul>
&lt;li>Support username and password prompt using &lt;code>notation login&lt;/code> command&lt;/li>
&lt;li>Bug fixes&lt;/li>
&lt;/ul>
&lt;h2 id="credits">Credits&lt;/h2>
&lt;p>We would like to specially thank the Notation maintainers, contributors, and the broader Notation community for helping us throughout the release process with timely feedback, reviews, community testing and for all your support to help ensure a timely release. Sending credits to the following contributors who made great contributions to Notation RC.4.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/FeynmanZhou" target="_blank" rel="noopener">@FeynmanZhou&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/gokarnm" target="_blank" rel="noopener">@gokarnm&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/iamsamirzon" target="_blank" rel="noopener">@iamsamirzon&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JeyJeyGao" target="_blank" rel="noopener">@JeyJeyGao&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/kody-kimberl" target="_blank" rel="noopener">@kody-kimberl&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/ningziwen" target="_blank" rel="noopener">@ningziwen&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/priteshbandi" target="_blank" rel="noopener">@priteshbandi&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/patrickzheng200" target="_blank" rel="noopener">@patrickzheng200&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/qweeah" target="_blank" rel="noopener">@qweeah&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/rgnote" target="_blank" rel="noopener">@rgnote&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/shizhMSFT" target="_blank" rel="noopener">@shizhMSFT&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/toddysm" target="_blank" rel="noopener">@toddysm&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/vaninrao10" target="_blank" rel="noopener">@vaninrao10&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/yizha1" target="_blank" rel="noopener">@yizha1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/zr-msft" target="_blank" rel="noopener">@zr-msft&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="download-and-give-it-a-try">Download and give it a try&lt;/h2>
&lt;p>Follow this &lt;a href="https://notaryproject.dev/docs/quickstart/" target="_blank" rel="noopener">hands-on guide&lt;/a> to get started.&lt;/p></description></item><item><title>Blog: The Notary Project completes fuzzing security audit</title><link>https://notaryproject.dev/blog/2023/notary-completes-fuzzing-security-audit/</link><pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/notary-completes-fuzzing-security-audit/</guid><description>
&lt;blockquote>
&lt;p>Reviewed by Pritesh Bandi, Samir Kakkar, Shiwei Zhang, Toddy Mladenov, Vani Rao, Yi Zha&lt;/p>
&lt;/blockquote>
&lt;p>The Notary Project is happy to announce the completion of its fuzzing security audit. The audit was carried out by Ada Logics and is part of &lt;a href="https://www.cncf.io/blog/2022/06/28/improving-security-by-fuzzing-the-cncf-landscape/" target="_blank" rel="noopener">an initiative by the CNCF&lt;/a> to bring fuzzing to the CNCF landscape. The audit spanned several months in late 2022 and early 2023 and resulted in 20 fuzzers written for 3 Notary sub-projects and 2 issues being identified and addressed including a critical security fix.&lt;/p>
&lt;p>The full report from the audit is available &lt;a href="https://github.com/notaryproject/notaryproject/tree/main/security/reports/fuzzing/ADA-fuzzing-audit-22-23.pdf" target="_blank" rel="noopener">here&lt;/a>.&lt;/p>
&lt;h2 id="about-the-notary-project">About the Notary Project&lt;/h2>
&lt;p>The Notary Project is an open standard and tooling for signing and verifying artifacts and safeguarding their distribution. It was started at Docker in 2015 and powers &lt;a href="https://docs.docker.com/engine/security/trust/" target="_blank" rel="noopener">Docker Content Trust&lt;/a> which is the &lt;code>docker trust&lt;/code> set of commands. With the Notary Project, users can attest to the trustworthiness of data and verify the integrity of the signed data.&lt;/p>
&lt;p>The Notary Project was accepted into the CNCF in October 2017 and is hosted as an incubating project. Contributors are both independent individuals and from organizations including Microsoft, AWS, and Docker. Notation-go and Notation-core-go are sub-projects of the Notary Project. The implementation is an effort to build a signing framework to be used with OCI v1.1 compliant registry, allowing signatures to easily be associated and distributed with images.&lt;/p>
&lt;p>The fuzzing audit was performed on all three active code sub-projects listed below:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/notaryproject/notary" target="_blank" rel="noopener">Notary&lt;/a>: A server and a client for running and interacting with trusted collections.&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation-go" target="_blank" rel="noopener">Notation-go&lt;/a>: a collection of libraries for supporting signing, verifying OCI artifacts. Based on the Notary standard.&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation-core-go" target="_blank" rel="noopener">Notation-core-go&lt;/a>: Crypto library for signature envelope, and signature format specific implementation.&lt;/li>
&lt;/ul>
&lt;h2 id="fuzzing-the-notary-project">Fuzzing the Notary Project&lt;/h2>
&lt;p>Fuzzing is a way of testing software, whereby pseudo-random data is passed to a target API with the goal of detecting bugs and security issues. The pseudo-random data is created by a fuzzing engine that over time will generate test cases that uncover more of the code base. This type of fuzzing is called “coverage-guided fuzzing” and has been effective in finding bugs in software projects implemented in both memory-safe and memory-unsafe languages. This includes several other CNCF-hosted projects; Most recently, a security issue was found in containerd during &lt;a href="https://www.cncf.io/blog/2023/03/02/containerd-completes-fuzzing-audit/" target="_blank" rel="noopener">its fuzzing audit&lt;/a>.&lt;/p>
&lt;p>There are several reasons why it&amp;rsquo;s important to fuzz your software and we&amp;rsquo;ll try to list some of the primary ones. First, due to empirical evidence where fuzzing is a proven technique for finding bugs and has found tens of thousands of bugs in security-critical software. Second, fuzzers find bugs that static analysis and manual auditing miss. This is because fuzzers rely on instrumenting and executing the code under analysis, which enables the fuzzers to have a different perspective than other analysis techniques and monitor deeper in the code, including third party dependencies. For example, a high severity bug in Istio &lt;a href="https://github.com/istio/istio/security/advisories/GHSA-856q-xv3c-7f2f" target="_blank" rel="noopener">CVE-2022-23645&lt;/a> was due to a fairly unintuitive &lt;a href="https://adalogics.com/blog/fuzzing-istio-cve-CVE-2022-23635" target="_blank" rel="noopener">behaviour&lt;/a> that static and manual analysis are very unlikely to find. Third, fuzzing is intuitive in the sense that it&amp;rsquo;s closely related to unit- and integration-testing which makes it fit well with the developers workflow. Fourth, fuzzing is part of the secure development lifecycle for leading tech companies and has been for more than a decade.&lt;/p>
&lt;p>A critical component of a robust fuzzing suite is making sure that the fuzzers run continuously. The auditors of the Notary Projects fuzzing audit integrated Notary, Notation-go, and Notation-core-go into &lt;a href="https://github.com/google/oss-fuzz" target="_blank" rel="noopener">OSS-Fuzz&lt;/a>. OSS-Fuzz is an open-source project run by Google, which runs the fuzzers of critical open-source projects at scale with excessive computing, thus achieving much higher runtime results than developers would see when running the fuzzers locally. OSS-Fuzz is a critical piece of open-source fuzzing infrastructure and many other CNCF projects are integrated including Kubernetes, Helm, containerd, Argo, Flux, Envoy, Fluent-bit, and others.&lt;/p>
&lt;p>Once the auditors had integrated the three Notation projects into OSS-Fuzz, they wrote the fuzzers covering all three projects and added them to the CNCF fuzzing repository, &lt;a href="https://github.com/cncf/cncf-fuzzing">https://github.com/cncf/cncf-fuzzing&lt;/a>. They then instructed OSS-Fuzz to pull them from there, allowing the fuzzers to run continuously during the audit as well as after the audit had concluded.&lt;/p>
&lt;h2 id="findings">Findings&lt;/h2>
&lt;p>The fuzzing audit found two issues both of which had their root cause in 3rd-party dependencies. One of the issues was found to be a memory-exhaustion vulnerability in Notation-go and was assigned CVE-2023-25656. The vulnerability could be triggered by a specifically malicious security policy containing the char sequence &lt;code>=#&lt;/code>. The issue has been fixed in Notation v1.0.0-rc.3 and later by denying any policy that contains that char sequence. The vulnerability has been disclosed in &lt;a href="https://github.com/notaryproject/notation-go/security/advisories/GHSA-87x9-7grx-m28v" target="_blank" rel="noopener">GHSA-87x9-7grx-m28v&lt;/a>.&lt;/p>
&lt;p>The second found issue was a slice bounds out of range panic, which was a functional bug and not a security issue. The root cause was in a 3rd-party dependency and the crash is recoverable. This issue has been fixed in notation-go v1.0.0-RC.3.&lt;/p>
&lt;h2 id="contributing">Contributing&lt;/h2>
&lt;p>Notary Project has various sub-projects, of which some of the new ones like Notation, Notation-go, and Notation-core-go are in active development. Your contributions to the Notary Project code and documentation are welcome; A great way to get started with contributing to the Notary Project is by joining the &lt;a href="https://cloud-native.slack.com/messages/notary-v2/" target="_blank" rel="noopener">#notary-project&lt;/a> channel in the &lt;a href="https://slack.cncf.io/" target="_blank" rel="noopener">CNCF&lt;/a> Slack workspace. If you find a problem or would like to suggest an enhancement, you can create an issue or submit a pull request on the related sub-projects repository.&lt;/p></description></item><item><title>Blog: Notation v1.0.0-RC.3 is available!</title><link>https://notaryproject.dev/blog/2023/announcing-notation-rc3/</link><pubDate>Wed, 08 Mar 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/announcing-notation-rc3/</guid><description>
&lt;p>The Notation maintainers are pleased to announce the release of Notation CLI v1.0.0-RC.3. This blog walks you through the major updates of this release.&lt;/p>
&lt;h2 id="whats-new">What&amp;rsquo;s new&lt;/h2>
&lt;p>This release introduces a change to how signatures are stored in the registries to align with the OCI direction to use image manifest. The default type of signature manifest is changed to image manifest. The flag &lt;code>--signature-manifest&lt;/code> for &lt;code>notation sign&lt;/code> command is experimental for users who want to store signatures using artifact manifest. This change does not impact the validation of signatures.&lt;/p>
&lt;p>Signing experience is continuously improved in this release. Less configuration steps were required before users run &lt;code>notation sign&lt;/code> command.&lt;/p>
&lt;h3 id="about-signature-manifest">About signature manifest&lt;/h3>
&lt;p>The signature is stored associated with signed artifacts in the OCI conformant registry. Since this release, the default type of signature manifest is changed from artifact manifest to &lt;a href="https://github.com/opencontainers/image-spec/blob/v1.1.0-rc2/manifest.md" target="_blank" rel="noopener">image manifest&lt;/a>. The signatures of the artifacts signed by previous releases of Notation (v1.0.0-RC.1 and v1.0.0-RC.2) can still be validated using the new release.&lt;/p>
&lt;p>Users can still store signatures using artifact manifest by using an experimental flag &lt;code>--signature-manifest&lt;/code>, for example:&lt;/p>
&lt;pre>&lt;code class="language-console" data-lang="console">notation sign --signature-manifest artifact localhost:net-monitor@sha256:xxx
&lt;/code>&lt;/pre>&lt;p>There are no changes on signature verification. Use &lt;code>notation verify&lt;/code> command as usual, for example:&lt;/p>
&lt;pre>&lt;code class="language-console" data-lang="console">notation verify localhost:net-monitor@sha256:xxx
&lt;/code>&lt;/pre>&lt;p>Image manifest is commonly supported by a wide range of registries in the market. Users are strongly recommended to update to this release for using image manifest by default.&lt;/p>
&lt;h3 id="sign-artifacts-using-on-demand-keys">Sign artifacts using on-demand keys&lt;/h3>
&lt;p>This release introduces a new experience of signing artifacts using on-demand keys. Here are the steps of signing:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Create a private key and get the key identity from the Key Management System (KMS)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Sign artifacts with a single command, for example:&lt;/p>
&lt;pre>&lt;code class="language-console" data-lang="console">notation sign --id &amp;lt;key_id&amp;gt; --plugin &amp;lt;KMS_plugin&amp;gt; localhost:5000/net-monitor@sha256:xxx
&lt;/code>&lt;/pre>&lt;/li>
&lt;/ol>
&lt;p>Now users can pass the signing key to the &lt;code>notation sign&lt;/code> command directly. This experience reduces the number of configuration steps required to setup signing.&lt;/p>
&lt;h2 id="credits">Credits&lt;/h2>
&lt;p>We would like to specially thank the Notation maintainers, contributors, and the broader Notation community for helping us throughout the release process with timely feedback, reviews, community testing and for all your support to help ensure a timely release. Sending credits to the following contributors who made great contributions to RC.3.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/FeynmanZhou" target="_blank" rel="noopener">@FeynmanZhou&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JeyJeyGao" target="_blank" rel="noopener">@JeyJeyGao&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/kody-kimberl" target="_blank" rel="noopener">@kody-kimberl&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/priteshbandi" target="_blank" rel="noopener">@priteshbandi&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/patrickzheng200" target="_blank" rel="noopener">@patrickzheng200&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/shizhMSFT" target="_blank" rel="noopener">@shizhMSFT&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/vaninrao10" target="_blank" rel="noopener">@vaninrao10&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/yizha1" target="_blank" rel="noopener">@yizha1&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="download-and-give-it-a-try">Download and give it a try&lt;/h2>
&lt;p>Follow this &lt;a href="https://notaryproject.dev/docs/quickstart/" target="_blank" rel="noopener">hands-on guide&lt;/a> to get started.&lt;/p></description></item><item><title>Blog: Notation v1.0.0-RC.2 is available!</title><link>https://notaryproject.dev/blog/2023/announcing-notation-rc2/</link><pubDate>Mon, 27 Feb 2023 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2023/announcing-notation-rc2/</guid><description>
&lt;p>The Notary v2 project maintainers are pleased to announce the release of Notation v1.0.0-RC.2, including Notation CLI, Notation-go, and Notation-core-go library. This is the first Notation release of 2023. This blog walks you through the major updates of this release.&lt;/p>
&lt;h2 id="whats-new">What&amp;rsquo;s new&lt;/h2>
&lt;p>This release adds the following significant enhancements:&lt;/p>
&lt;ul>
&lt;li>Inspecting signatures associated with signed artifacts&lt;/li>
&lt;li>Storing signatures in the registry using OCI image manifest&lt;/li>
&lt;li>Added user-defined metadata to signature payload&lt;/li>
&lt;li>Add &lt;code>--debug&lt;/code> and &lt;code>--verbose&lt;/code> flags for troubleshooting&lt;/li>
&lt;/ul>
&lt;h3 id="improved-usability-and-troubleshooting-capability">Improved usability and troubleshooting capability&lt;/h3>
&lt;p>For example, you can use &lt;code>notation inspect&lt;/code> to get detailed information of signatures associated with the signed artifact in a human readable view.&lt;/p>
&lt;pre>&lt;code>$ notation inspect sample.registry.io/ratify-sample-repo:v1
Warning: Always inspect the artifact using digest(@sha256:...) rather than a tag(:v1) because resolved digest may not point to the same signed artifact, as tags are mutable.
Inspecting all signatures for signed artifact
sample.registry.io/ratify-sample-repo@sha256:5d7a0742f9c17400d21b29d2f27ed1b3429f0a71c5f53fb2a9ca3eff7850d2a6
└── application/vnd.cncf.notary.signature
└── sha256:d9d98d2b56b77f56ebe8e917643c6484017a39b89ff65e8b3449598d6b1adda5
├── media type: application/cose
├── signature algorithm: RSASSA-PSS-SHA-256
├── signed attributes
│ ├── signingScheme: notary.x509
│ ├── signingTime: Sun Feb 19 15:29:47 2023
│ └── expiry: Mon Jan 1 00:00:00 0001
├── user defined attributes
│ └── io.wabbit-networks.buildId: 123
├── unsigned attributes
│ └── signingAgent: Notation/1.0.0 kms/v0.4.0-beta.1
├── certificates
│ └── SHA1 fingerprint: def4344f733f1f57af3efd759b47c4576a10a723
│ ├── issued to: CN=wabbit-networks.io,O=Notary,L=Seattle,ST=WA,C=US
│ ├── issued by: CN=wabbit-networks.io,O=Notary,L=Seattle,ST=WA,C=US
│ └── expiry: Mon Feb 12 16:13:48 2024
└── signed artifact
├── media type: application/vnd.docker.distribution.manifest.v2+json
├── digest: sha256:5d7a0742f9c17400d21b29d2f27ed1b3429f0a71c5f53fb2a9ca3eff7850d2a6
└── size: 942
&lt;/code>&lt;/pre>&lt;p>When verifying signatures associated with a signed artifact, users may want to get a list of the signed metadata included with the signature and use it evaluate additional decisions before using the signed image. A new flag &lt;code>--user-metadata&lt;/code> was introduced to &lt;code>notation sign&lt;/code> and &lt;code>notation verify&lt;/code> in this release. Similar to annotations, you can easily add user-defined metadata to signature payload when signing an artifact or verify that provided key-value pairs are present in the payload of the valid signature.&lt;/p>
&lt;pre>&lt;code>$ notation verify --user-metadata io.wabbit-networks.buildId=123 sample.registry.io:5000/net-monitor@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
Successfully verified signature for sample.registry.io:5000/net-monitor@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
The artifact is signed with the following user metadata.
KEY VALUE
io.wabbit-networks.buildId 123
&lt;/code>&lt;/pre>&lt;p>In addition, storing signatures in the registry using OCI image manifest was added into RC.2, you can use a flag &lt;code>--signature-manifest image&lt;/code> to explicitly specify uploading image manifest to a registry when signing an artifact. This brings backward compatibility which enables Notation work with the registries that do not support OCI Spec v1.1 yet.&lt;/p>
&lt;p>Last but not least, &lt;code>--debug&lt;/code> and &lt;code>--verbose&lt;/code> flags were added to all CLI commands, providing debug and troubleshooting capability for Notation CLI.&lt;/p>
&lt;h3 id="ecosystem-integration">Ecosystem integration&lt;/h3>
&lt;p>&lt;a href="https://github.com/deislabs/ratify" target="_blank" rel="noopener">Ratify&lt;/a> is a verification engine for Kubernetes which enables verification of artifact security metadata and admits for deployment only those that comply with policies you create. Ratify v1.0.0 RC.1 integrated Notation-go v1.0.0-rc.2 which allows you to verify a container image signed by Notation.&lt;/p>
&lt;p>&lt;a href="http://zotregistry.io/" target="_blank" rel="noopener">Zot registry&lt;/a> also integrates notation-go and supports storing signatures associated with the artifact. See this &lt;a href="https://github.com/project-zot/zot/tree/main/demos#notation" target="_blank" rel="noopener">demo&lt;/a> for details.&lt;/p>
&lt;p>Going forward, Notation maintainers will work the community to support more ecosystem tooling and deliver consistent signing and verification experience, such as HashiCorp Vault KMS plugin, support Kyverno for Kubernetes policy management, and being compatible with more OCI registries.&lt;/p>
&lt;h3 id="enhanced-stability-with-more-testing-coverage">Enhanced stability with more testing coverage&lt;/h3>
&lt;p>As the second RC release for v1.0.0, we aim to deliver a production-ready security product. Comparing with RC.1, the E2E testing framework built on &lt;a href="https://onsi.github.io/ginkgo/" target="_blank" rel="noopener">ginkgo&lt;/a> was set up in RC.2 and major test cases were added to Notation CLI. Meanwhile, unit test coverage was also increased by &lt;a href="https://app.codecov.io/gh/notaryproject/notation-go?search=&amp;amp;trend=3%20months" target="_blank" rel="noopener">5.92%&lt;/a>. It definitely enhanced the program robustness and project stability.&lt;/p>
&lt;h2 id="credits">Credits&lt;/h2>
&lt;p>We would like to specially thank the Notation maintainers, contributors, and the broader Notation community for helping us throughout the release process with timely feedback, reviews, community testing and for all your support to help ensure a timely release. Sending credits to the following contributors who made great contributions to RC.2.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/byronchien" target="_blank" rel="noopener">@byronchien&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/FeynmanZhou" target="_blank" rel="noopener">@FeynmanZhou&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/iamjesh" target="_blank" rel="noopener">@iamjesh&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/iamsamirzon" target="_blank" rel="noopener">@iamsamirzon&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JeyJeyGao" target="_blank" rel="noopener">@JeyJeyGao&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/priteshbandi" target="_blank" rel="noopener">@priteshbandi&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/mintbomb27" target="_blank" rel="noopener">@mintbomb27&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/patrickzheng200" target="_blank" rel="noopener">@patrickzheng200&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/shizhMSFT" target="_blank" rel="noopener">@shizhMSFT&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/toddysm" target="_blank" rel="noopener">@toddysm&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/thisisobate" target="_blank" rel="noopener">@thisisobate&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/vaninrao10" target="_blank" rel="noopener">@vaninrao10&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/yizha1" target="_blank" rel="noopener">@yizha1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/zr-msft" target="_blank" rel="noopener">@zr-msft&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="download-and-give-it-a-try">Download and give it a try&lt;/h2>
&lt;p>You can also view the &lt;a href="https://github.com/notaryproject/roadmap/tree/main/RELEASENOTES" target="_blank" rel="noopener">Release Notes of Notation v1.0.0-RC.2&lt;/a> to learn more about this release.&lt;/p>
&lt;p>Start your container secure supply chain journey with Notation as it helps you safeguard your software supply chain and ensure integrity. Follow this &lt;a href="https://notaryproject.dev/docs/quickstart/" target="_blank" rel="noopener">hands-on guide&lt;/a> to install and try Notation CLI v1.0.0-RC.2.&lt;/p></description></item><item><title>Blog: Notation signatures as ORAS and OCI artifacts</title><link>https://notaryproject.dev/blog/2022/oras-oci-artifacts-notation-signatures/</link><pubDate>Mon, 21 Nov 2022 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2022/oras-oci-artifacts-notation-signatures/</guid><description>
&lt;h2 id="notary-and-notation">Notary and Notation&lt;/h2>
&lt;p>&lt;a href="https://notaryproject.dev/" target="_blank" rel="noopener">Notary project&lt;/a> is a set of tools that helps you sign, store, and verify OCI artifacts using OCI-conformant registries.&lt;/p>
&lt;p>&lt;a href="https://github.com/notaryproject/notation" target="_blank" rel="noopener">Notation&lt;/a> is an implementation of the &lt;a href="https://github.com/notaryproject/notaryproject" target="_blank" rel="noopener">Notary v2 specifications&lt;/a>.
As an implementation provides a CLI that adds signatures as standard items in the registry ecosystem, and can build a set of simple tooling for signing and verifying these signatures.&lt;/p>
&lt;p>Notary v2 provides for multiple signatures of an &lt;a href="https://github.com/opencontainers/artifacts" target="_blank" rel="noopener">OCI Artifact&lt;/a> (including container images) to be persisted in an OCI conformant registry.
Artifacts are signed with private keys, and validated with public keys.&lt;/p>
&lt;p>To support user deployment flows, signing an OCI Artifact will not change the &lt;code>@digest&lt;/code> or artifact &lt;code>:tag&lt;/code> reference.
To support content movement across multiple certification boundaries, artifacts and their signatures will be easily copied within and across OCI conformant registries.&lt;/p>
&lt;p>To deliver on the Notary v2 goals of cross registry movement of artifacts with their signatures, changes to several projects are anticipated, including &lt;a href="https://github.com/opencontainers/distribution-spec" target="_blank" rel="noopener">OCI distribution-spec&lt;/a>, &lt;a href="https://github.com/distribution/distribution" target="_blank" rel="noopener">CNCF Distribution&lt;/a>, &lt;a href="https://github.com/opencontainers/artifacts" target="_blank" rel="noopener">OCI Artifacts&lt;/a>, &lt;a href="https://github.com/oras-project/oras" target="_blank" rel="noopener">ORAS&lt;/a> with further consumption from projects (e.g. &lt;a href="https://github.com/containerd/containerd" target="_blank" rel="noopener">containerd&lt;/a>).&lt;/p>
&lt;p>Already changes are coming in ORAS that unified the ORAS artifact spec into the new OCI artifact spec, to cover scenarios where images aren&amp;rsquo;t the only artifact to be distributed, such as signatures, SBOMs, attestation, etc. but that references container-related artifacts.&lt;/p>
&lt;h2 id="oci-and-oras">OCI and ORAS&lt;/h2>
&lt;p>Notation leverages ORAS to store signatures into OCI registries.
The &lt;a href="https://oras.land/" target="_blank" rel="noopener">ORAS project&lt;/a> is a set of tools and libraries that enable to use OCI registries to store arbitray artifacts.
But what are OCI Registries?&lt;/p>
&lt;p>The &lt;a href="https://opencontainers.org/" target="_blank" rel="noopener">Open Container Initiative&lt;/a> (OCI) defines the specifications and standards for container technologies.
This includes the &lt;a href="https://github.com/opencontainers/distribution-spec" target="_blank" rel="noopener">OCI Distribution Specification&lt;/a>, the API for working with container registries.
Registries that implement the distribution-spec are referred to as OCI Registries.&lt;/p>
&lt;h3 id="oci-and-oras-artifacts">OCI and ORAS artifacts&lt;/h3>
&lt;p>The main OCI artifact type is the &lt;a href="https://github.com/opencontainers/image-spec" target="_blank" rel="noopener">OCI image&lt;/a>. With time, people used registries to store arbitrary artifacts, leveraging performance, security and reliability capabilities of registries.
One growing example is artifacts for securing the sofware supply chain like SBOMS, signatures, attestations, scan results, etc.&lt;/p>
&lt;p>The &lt;a href="https://github.com/opencontainers/artifacts" target="_blank" rel="noopener">OCI artifacts&lt;/a> project aims to generalize the artifact types that can be distributed by and stored into OCI registries.
The image manifest has a &lt;code>config.mediaType&lt;/code> field to differentiate between the various types of artifacts.
This field is supposed to be filled by the authors of new artifact types, so ORAS did to support a wide range of artifact types.&lt;/p>
&lt;p>It introduced the &lt;a href="https://github.com/oras-project/artifacts-spec" target="_blank" rel="noopener">ORAS artifact specification&lt;/a> and related &lt;code>application/vnd.cncf.oras.artifact.manifest.v1+json&lt;/code> &lt;code>mediaType&lt;/code>.
This media type bases on the OCI image manifest but removes constraints such as a required &lt;code>config&lt;/code> object and required &amp;amp; ordinal &lt;code>layers&lt;/code> (more on the OCI image manifest spec &lt;a href="https://github.com/opencontainers/image-spec/blob/main/manifest.md" target="_blank" rel="noopener">here&lt;/a>).&lt;/p>
&lt;p>The ORAS artifact manifest adds a &lt;code>subject&lt;/code> property supporting a graph of independently linked artifacts.
It provides a means to define artifacts that can be related to an OCI image manifest, OCI image index or another ORAS artifact manifest (for example &lt;a href="https://github.com/oras-project/artifacts-spec/blob/main/scenarios.md#notary-v2-signatures" target="_blank" rel="noopener">here&lt;/a> a Notary V2 signature that references an image).
By defining a new manifest, registries and clients opt-into new capabilities, without breaking existing behaviour, such as discovery provided by the ORAS &lt;a href="https://github.com/oras-project/artifacts-spec/blob/main/manifest-referrers-api.md#manifest-referrers-api" target="_blank" rel="noopener">referrers API&lt;/a>.&lt;/p>
&lt;h2 id="quickstart">Quickstart&lt;/h2>
&lt;h3 id="requirements">Requirements&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://docs.docker.com/engine/reference/commandline/cli/" target="_blank" rel="noopener">Docker&lt;/a> or &lt;a href="https://docs.podman.io/en/latest/Commands.html" target="_blank" rel="noopener">Podman&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation/releases" target="_blank" rel="noopener">Notation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://oras.land/cli/" target="_blank" rel="noopener">ORAS CLI&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="run-the-demo">Run the demo&lt;/h3>
&lt;p>Run a local &lt;a href="https://github.com/oras-project" target="_blank" rel="noopener">ORAS&lt;/a> OCI regsitry:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">PORT&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">5000&lt;/span>
&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">REGISTRY&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>localhost:&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">PORT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>
docker run -d -p &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">PORT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>:5000 ghcr.io/oras-project/registry:v0.0.3-alpha
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Build and push an OCI image to the local registry with a tag:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">REPO&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">REGISTRY&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>/net-monitor
&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">IMAGE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">REPO&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>:v1
docker build -t &lt;span style="color:#000">$IMAGE&lt;/span> https://github.com/wabbit-networks/net-monitor.git#main
docker push &lt;span style="color:#000">$IMAGE&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>See how the image is not signed (the are no signing artifacts on the local repository that reference the just pushed image):&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">notation list --plain-http &lt;span style="color:#000">$IMAGE&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Generate a certificate key pair to sign the image:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">notation cert generate-test --default &lt;span style="color:#4e9a06">&amp;#34;wabbit-networks.io&amp;#34;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Sign the image with the certificate key just created:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">notation sign --plain-http &lt;span style="color:#000">$IMAGE&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now you need to configure the &lt;a href="https://github.com/notaryproject/specifications/blob/v1.0.0/specs/trust-store-trust-policy.md" target="_blank" rel="noopener">trust policy&lt;/a> to specify trusted identities which sign the artifacts, and level of signature verification to use:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">cat &amp;lt;&amp;lt;&lt;span style="color:#4e9a06">&amp;#34;EOF&amp;#34;&lt;/span> &amp;gt; ~/.config/notation/trustpolicy.json
&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;version&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;1.0&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;trustPolicies&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;wabbit-networks-images&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;registryScopes&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;*&amp;#34;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;signatureVerification&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;level&amp;#34;&lt;/span> : &lt;span style="color:#4e9a06">&amp;#34;strict&amp;#34;&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;trustStores&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;ca:wabbit-networks.io&amp;#34;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;trustedIdentities&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;*&amp;#34;&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
EOF
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Verify that the image is signed, against the trust store.&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">notation verify --plain-http &lt;span style="color:#000">$IMAGE&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>But now, let&amp;rsquo;s get more detail and see what is a signature.&lt;/p>
&lt;h2 id="inpspect-the-signature-artifacts">Inpspect the signature artifacts&lt;/h2>
&lt;p>As of now of Notation v0.12 a signature is an ORAS &lt;a href="https://github.com/oras-project/artifacts-spec" target="_blank" rel="noopener">artifact-spec&lt;/a> compatible OCI image, on an OCI registry that references an OCI image.
As a digest makes unique an artifact (i.e. an image), the &lt;code>subject&lt;/code> field of the signature image manifest references the signing content.&lt;/p>
&lt;p>Let&amp;rsquo;s check that on our local registry!&lt;/p>
&lt;h3 id="inspect-with-oras-cli">Inspect with ORAS CLI&lt;/h3>
&lt;p>First, install a ORAS CLI release with version &amp;lt; 0.16.0.&lt;/p>
&lt;blockquote>
&lt;p>Later we&amp;rsquo;ll see why not 0.16.&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ oras discover &lt;span style="color:#000">$IMAGE&lt;/span> -o json
&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;referrers&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;digest&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;sha256:6131e049f4e045614d575ade11e9c9b44e6b7fb081fdd0b8a27f1726329eb5ab&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;mediaType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/vnd.cncf.oras.artifact.manifest.v1+json&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;artifactType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/vnd.cncf.notary.v2.signature&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;size&amp;#34;&lt;/span>: &lt;span style="color:#0000cf;font-weight:bold">512&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;digest&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;sha256:cdb664bc205fccbfc06cff7310ea42fe8cf483deb2c9e77a3c829c5d3ecde037&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;mediaType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/vnd.cncf.oras.artifact.manifest.v1+json&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;artifactType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/vnd.cncf.notary.v2.signature&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;size&amp;#34;&lt;/span>: &lt;span style="color:#0000cf;font-weight:bold">512&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>And you can see that the artifacts digests match the signatures pushed by Notation.&lt;/p>
&lt;p>Now let&amp;rsquo;s see how is composed a &lt;code>application/vnd.cncf.notary.v2.signature&lt;/code> manifest, by picking the first signature:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ oras manifest fetch &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">REPO&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>@&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>oras discover &lt;span style="color:#000">$IMAGE&lt;/span> -o json &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r &lt;span style="color:#4e9a06">&amp;#39;.referrers[0].digest&amp;#39;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">)&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq
&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;mediaType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/vnd.cncf.oras.artifact.manifest.v1+json&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;artifactType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/vnd.cncf.notary.v2.signature&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;blobs&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;mediaType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/jose+json&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;digest&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;sha256:187e7739f84c8b7770dacfda80917ac1c671b92de192bdadf16c87ca0611d846&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;size&amp;#34;&lt;/span>: &lt;span style="color:#0000cf;font-weight:bold">2120&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;subject&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;mediaType&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;application/vnd.docker.distribution.manifest.v2+json&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;digest&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;sha256:79cf36c749e0e7445335567b97719bddaf57d0f465f9f36bcbe7ce0a25d02ec6&amp;#34;&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;size&amp;#34;&lt;/span>: &lt;span style="color:#0000cf;font-weight:bold">942&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;span style="color:#4e9a06">&amp;#34;annotations&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;io.cncf.oras.artifact.created&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;2022-11-14T18:38:51Z&amp;#34;&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>As you can see the &lt;code>subject&lt;/code> field references the Docker image &lt;a href="https://docs.docker.com/registry/spec/manifest-v2-2/" target="_blank" rel="noopener">manifest v2&lt;/a> of the signed image.&lt;/p>
&lt;h2 id="show-me-the-code">Show me the code&lt;/h2>
&lt;p>Now let&amp;rsquo;s see what the &lt;code>notation sign&lt;/code> command does.
&lt;a href="https://github.com/notaryproject/notation/blob/v0.11.0-alpha.4/cmd/notation/sign.go#L83" target="_blank" rel="noopener">&lt;code>runSign()&lt;/code>&lt;/a> is the core part of the command:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-go" data-lang="go">&lt;span style="color:#204a87;font-weight:bold">func&lt;/span> &lt;span style="color:#000">runSign&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">command&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">*&lt;/span>&lt;span style="color:#000">cobra&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Command&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">cmdOpts&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">*&lt;/span>&lt;span style="color:#000">signOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">error&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#8f5902;font-style:italic">// initialize
&lt;/span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#000">signer&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">cmd&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">GetSigner&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">&amp;amp;&lt;/span>&lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SignerFlagOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#8f5902;font-style:italic">// core process
&lt;/span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#000">desc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">prepareSigningContent&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">command&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Context&lt;/span>&lt;span style="color:#000;font-weight:bold">(),&lt;/span> &lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000">sig&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">signer&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Sign&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">command&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Context&lt;/span>&lt;span style="color:#000;font-weight:bold">(),&lt;/span> &lt;span style="color:#000">desc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#8f5902;font-style:italic">// write out
&lt;/span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#000">path&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">output&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">path&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">==&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#000">path&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#000">dir&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Path&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">CachedSignature&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">digest&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Digest&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">desc&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Digest&lt;/span>&lt;span style="color:#000;font-weight:bold">),&lt;/span> &lt;span style="color:#000">digest&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">FromBytes&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">sig&lt;/span>&lt;span style="color:#000;font-weight:bold">))&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">osutil&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">WriteFile&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">path&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">sig&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">ref&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">pushReference&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span> &lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">push&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#000;font-weight:bold">!(&lt;/span>&lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Local&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#000">ref&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">==&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">ref&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">==&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#000">ref&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">reference&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">_&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">pushSignature&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">command&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Context&lt;/span>&lt;span style="color:#000;font-weight:bold">(),&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">&amp;amp;&lt;/span>&lt;span style="color:#000">cmdOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SecureFlagOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">ref&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">sig&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">fmt&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Errorf&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;fail to push signature to %q: %v: %v&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000">ref&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000">desc&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Digest&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000">err&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000">fmt&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Println&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">desc&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Digest&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>First, a &lt;code>signer&lt;/code> is fetched. A signer here is a component that signs an artifact and generate and signature.&lt;/p>
&lt;p>&lt;a href="https://github.com/notaryproject/notation/blob/v0.11.0-alpha.4/cmd/notation/sign.go#L126" target="_blank" rel="noopener">&lt;code>prepareSigningContent()&lt;/code>&lt;/a> prepares the manifest &lt;a href="https://github.com/opencontainers/image-spec/blob/main/descriptor.md#oci-content-descriptors" target="_blank" rel="noopener">descriptor&lt;/a> to be signed:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-go" data-lang="go">&lt;span style="color:#204a87;font-weight:bold">func&lt;/span> &lt;span style="color:#000">prepareSigningContent&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span> &lt;span style="color:#000">context&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Context&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">*&lt;/span>&lt;span style="color:#000">signOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SignOptions&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87;font-weight:bold">error&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#000">manifestDesc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">getManifestDescriptorFromContext&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">&amp;amp;&lt;/span>&lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">RemoteFlagOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">reference&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SignOptions&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">identity&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">originReference&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span> &lt;span style="color:#000">identity&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#000">manifestDesc&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Annotations&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">map&lt;/span>&lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#204a87;font-weight:bold">string&lt;/span>&lt;span style="color:#000;font-weight:bold">]&lt;/span>&lt;span style="color:#204a87;font-weight:bold">string&lt;/span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;identity&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">identity&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">var&lt;/span> &lt;span style="color:#000">tsa&lt;/span> &lt;span style="color:#000">timestamp&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Timestamper&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">endpoint&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">timestamp&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span> &lt;span style="color:#000">endpoint&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">tsa&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#000">timestamp&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">NewHTTPTimestamper&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#204a87;font-weight:bold">nil&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">endpoint&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SignOptions&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000">pluginConfig&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">cmd&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">ParseFlagPluginConfig&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">pluginConfig&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SignOptions&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">manifestDesc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SignOptions&lt;/span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#000">Expiry&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">cmd&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">GetExpiry&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">expiry&lt;/span>&lt;span style="color:#000;font-weight:bold">),&lt;/span>
&lt;span style="color:#000">TSA&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">tsa&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000">PluginConfig&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">pluginConfig&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000;font-weight:bold">},&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>the &lt;code>signer&lt;/code> signs artifacts and generates signatures by delegating the &lt;a href="https://github.com/notaryproject/notation-go/blob/v0.11.0-alpha.4/signature/plugin.go#L46" target="_blank" rel="noopener">one or more operations&lt;/a> to the named plugin that will only generate a raw signature given a payload to sign.&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-go" data-lang="go">&lt;span style="color:#8f5902;font-style:italic">// Sign signs the artifact described by its descriptor and returns the marshalled envelope.
&lt;/span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">func&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">s&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">*&lt;/span>&lt;span style="color:#000">pluginSigner&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000">Sign&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span> &lt;span style="color:#000">context&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Context&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">desc&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SignOptions&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">([]&lt;/span>&lt;span style="color:#204a87;font-weight:bold">byte&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87;font-weight:bold">error&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#000">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">s&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">getMetadata&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000;font-weight:bold">!&lt;/span>&lt;span style="color:#000">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SupportsContract&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">plugin&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">ContractVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">fmt&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Errorf&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>
&lt;span style="color:#4e9a06">&amp;#34;contract version %q is not in the list of the plugin supported versions %v&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000">plugin&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">ContractVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SupportedContractVersions&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">HasCapability&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">plugin&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">CapabilitySignatureGenerator&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">s&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">generateSignature&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">desc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span> &lt;span style="color:#204a87;font-weight:bold">else&lt;/span> &lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">HasCapability&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">plugin&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">CapabilityEnvelopeGenerator&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">s&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">generateSignatureEnvelope&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">desc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">fmt&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Errorf&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;plugin does not have signing capabilities&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Finally, Notation will package this signature into a signature envelope, and generate and pushes the signature manifest, through &lt;a href="https://github.com/notaryproject/notation/blob/v0.11.0-alpha.4/cmd/notation/push.go#L90" target="_blank" rel="noopener">&lt;code>pushSignature()&lt;/code>&lt;/a>:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-go" data-lang="go">&lt;span style="color:#204a87;font-weight:bold">func&lt;/span> &lt;span style="color:#000">pushSignature&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span> &lt;span style="color:#000">context&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Context&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">*&lt;/span>&lt;span style="color:#000">SecureFlagOpts&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">ref&lt;/span> &lt;span style="color:#204a87;font-weight:bold">string&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">sig&lt;/span> &lt;span style="color:#000;font-weight:bold">[]&lt;/span>&lt;span style="color:#204a87;font-weight:bold">byte&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87;font-weight:bold">error&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#8f5902;font-style:italic">// initialize
&lt;/span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#000">sigRepo&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">getSignatureRepository&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">ref&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000">manifestDesc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">getManifestDescriptorFromReference&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">opts&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">ref&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#8f5902;font-style:italic">// core process
&lt;/span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// pass in nonempty annotations if needed
&lt;/span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span> &lt;span style="color:#000">sigMediaType&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">envelope&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">SpeculateSignatureEnvelopeFormat&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">sig&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">err&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#000">sigDesc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">_&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">:=&lt;/span> &lt;span style="color:#000">sigRepo&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">PutSignatureManifest&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">sig&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">sigMediaType&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">manifestDesc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">make&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#204a87;font-weight:bold">map&lt;/span>&lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#204a87;font-weight:bold">string&lt;/span>&lt;span style="color:#000;font-weight:bold">]&lt;/span>&lt;span style="color:#204a87;font-weight:bold">string&lt;/span>&lt;span style="color:#000;font-weight:bold">))&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000">err&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">!=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">notation&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Descriptor&lt;/span>&lt;span style="color:#000;font-weight:bold">{},&lt;/span> &lt;span style="color:#000">fmt&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Errorf&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;put signature manifest failure: %v&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">err&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">sigDesc&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87;font-weight:bold">nil&lt;/span>
&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="signing-protocols-jose-and-cose">Signing protocols: JOSE and COSE&lt;/h3>
&lt;p>As a detail, the &lt;a href="https://github.com/notaryproject/notation/blob/v0.11.0-alpha.4/internal/cmd/signer.go#L58" target="_blank" rel="noopener">supported signing protocols&lt;/a> are &lt;a href="https://www.rfc-editor.org/rfc/rfc7515" target="_blank" rel="noopener">JWS&lt;/a> and &lt;a href="https://www.rfc-editor.org/rfc/rfc9052" target="_blank" rel="noopener">COSE&lt;/a>.&lt;/p>
&lt;p>The &lt;a href="https://jose.readthedocs.io/en/latest/" target="_blank" rel="noopener">JOSE&lt;/a> Working Group produced a set of documents (&lt;a href="https://www.rfc-editor.org/rfc/rfc7515" target="_blank" rel="noopener">RFC7515&lt;/a>, &lt;a href="https://www.rfc-editor.org/rfc/rfc7516" target="_blank" rel="noopener">RFC7516&lt;/a>, &lt;a href="https://www.rfc-editor.org/rfc/rfc7517" target="_blank" rel="noopener">RFC7517&lt;/a>, &lt;a href="https://www.rfc-editor.org/rfc/rfc7518" target="_blank" rel="noopener">RFC7518&lt;/a>) that specified how to process encryption, signatures, and Message Authentication Code (MAC) operations and how to encode keys using JSON (like for JWS).&lt;/p>
&lt;p>JWS represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures.&lt;/p>
&lt;p>COSE describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization.
&lt;a href="https://www.rfc-editor.org/rfc/rfc7049" target="_blank" rel="noopener">CBOR&lt;/a> is a data format that was designed specifically to be small in terms of both messages transported and implementation size and to have a schema-free decoder.&lt;/p>
&lt;p>CBOR extended the data model of JavaScript Object Notation (JSON) by allowing for binary data directly without first converting it into a base64-encoded text string, among other changes.&lt;/p>
&lt;p>COSE is not a direct copy of the JOSE specification. In the process of creating COSE, decisions that were made for JOSE were re-examined.&lt;/p>
&lt;h2 id="whats-next">What&amp;rsquo;s next&lt;/h2>
&lt;p>It happened that ORAS worked to unify their artifact specification into a new OCI standard specification (Reference Types for &lt;a href="https://github.com/opencontainers/image-spec/pull/934" target="_blank" rel="noopener">image&lt;/a> and &lt;a href="https://github.com/opencontainers/distribution-spec/pull/335" target="_blank" rel="noopener">distribution&lt;/a> specs).&lt;/p>
&lt;p>We&amp;rsquo;re waiting to see a bump in the Notation Go library to &lt;a href="https://github.com/notaryproject/notation-go/issues/136" target="_blank" rel="noopener">support&lt;/a> the new Reference Type (and then Notation CLI) of the ORAS Go library (now release candidate &lt;a href="https://github.com/oras-project/oras-go/tree/v2.0.0-rc.4" target="_blank" rel="noopener">v2.0.0-rc.4&lt;/a>).&lt;/p>
&lt;p>ORAS CLI &lt;a href="https://github.com/oras-project/oras/releases/tag/v0.16.0" target="_blank" rel="noopener">v0.16.0&lt;/a> already leverages OCI artifacts, and that&amp;rsquo;s why in this demonstration we picked a previous version, as we demonstrate ORAS Artifact-based signatures.&lt;/p>
&lt;p>See you soon with updates on OCI Artifact-based signatures!&lt;/p></description></item><item><title>Blog: Announcing Notary v2 alpha 1</title><link>https://notaryproject.dev/blog/2021/announcing-notation-alpha1/</link><pubDate>Tue, 26 Oct 2021 00:00:00 +0000</pubDate><guid>https://notaryproject.dev/blog/2021/announcing-notation-alpha1/</guid><description>
&lt;p>Notary v1, otherwise known as Docker Content Trust, was released at at a time when there was one primary registry: Docker Hub. A lot has changed since then, some design choices around Trust on First Use (TOFU), key management, and a lack of content promotion within and across registries have become limiting factors for Docker Content Trust and Notary v1.&lt;/p>
&lt;p>At KubeCon EU 2019, container image signing was the main topic of interest for a small group in the community. By December 2019, a &lt;a href="https://github.com/notaryproject/meeting-notes/blob/main/meeting-notes-2019.md" target="_blank" rel="noopener">multi-cloud, multi-vendor meeting kicked off Notary v2&lt;/a>, as it was clear the time had come to solve the container image signing problem.
Since 2019, multiple prototypes have been built validating the intended experiences around the &lt;a href="https://github.com/notaryproject/notaryproject/blob/main/requirements/requirements.md#goals" target="_blank" rel="noopener">Notary v2 goals&lt;/a>, including how &lt;a href="https://theupdateframework.io/" target="_blank" rel="noopener">The Update Framework&lt;/a> metadata can be partitioned, supporting content promotion.&lt;/p>
&lt;p>&lt;em>&lt;strong>Today, we are happy to announce the &lt;a href="https://github.com/notaryproject/roadmap/blob/main/RELEASENOTES/v2.0.0.alpha-1.MD" target="_blank" rel="noopener">alpha 1 release&lt;/a> of the &lt;a href="https://github.com/notaryproject/notaryproject/" target="_blank" rel="noopener">Notary v2 project&lt;/a> is ready for your feedback.&lt;/strong>&lt;/em>&lt;/p>
&lt;p>Notary v2 enables signing of all artifacts (Container Images, Software Bill of Materials, Scan Results) stored in &lt;a href="https://github.com/opencontainers/distribution-spec" target="_blank" rel="noopener">OCI Distribution&lt;/a> based registries, with &lt;a href="https://github.com/oras-project/artifacts-spec/" target="_blank" rel="noopener">ORAS artifacts spec&lt;/a> enhancements.
A key tenet of Notary v2 is that it enables promotion of signed artifacts within and across registries, including air-gapped and private network environments.&lt;/p>
&lt;p>&lt;img src="../announcing-notation-alpha1/artifact-promotion.svg" alt="Graphic demonstrating promotion of an artifact, including building, importing, and deploying it">&lt;/p>
&lt;p>In addition to signature promotion, Notary v2 focuses on ease of use, with minimal dependencies. While Notary v2 can integrate with other supply chain efforts, there are no additional services required to sign or validate an artifact.
As artifacts get promoted, users/entities may add new signatures, attesting to the validity of the content for the target environment, enabling a secure supply chain workflow.&lt;/p>
&lt;p>Through signing, users choose the artifacts they trust, from the entities they trust, &lt;a href="https://stevelasker.blog/2021/09/24/separating-identity-from-location/" target="_blank" rel="noopener">decoupling location from identity&lt;/a>.&lt;/p>
&lt;p>The Notary v2 Alpha includes the following releases:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/notaryproject/notation/releases/tag/v0.7.0-alpha.1" target="_blank" rel="noopener">notation&lt;/a> - CLI enabling test-cert creation, cert/key configuration, sign and verify capabilities.&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation-go-lib/releases/tag/v0.7.0-alpha.1" target="_blank" rel="noopener">notation-go-lib&lt;/a> - a set of Go libraries that may be incorporated into other tools, providing sign, configuration and verify capabilities.&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notaryproject/releases/tag/v1.0.0-draft.1" target="_blank" rel="noopener">Notary v2 specs&lt;/a> - providing the specifications, such as the &lt;a href="https://github.com/notaryproject/notaryproject/blob/main/signature-specification.md" target="_blank" rel="noopener">signature specification&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>To get a sense for how users can use the notation cli, we&amp;rsquo;ll walk through a few quick examples.&lt;/p>
&lt;h3 id="sign--verify">Sign &amp;amp; Verify&lt;/h3>
&lt;p>Signing and verification with the notation cli is as simple as:&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">IMAGE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>localhost:5000/net-monitor:v1
notation cert generate-test --default &lt;span style="color:#4e9a06">&amp;#34;wabbit-networks.io&amp;#34;&lt;/span>
notation sign &lt;span style="color:#000">$IMAGE&lt;/span>
notation cert add --name &lt;span style="color:#4e9a06">&amp;#34;wabbit-networks.io&amp;#34;&lt;/span> ~/.config/notation/certificate/wabbit-networks.io.crt
notation verify &lt;span style="color:#000">$IMAGE&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="../announcing-notation-alpha1/sign-verify.gif" alt="Animated screencast showing an image being signed using the notation CLI">&lt;/p>
&lt;h3 id="add-and-sign-other-supply-chain-artifacts">Add and Sign other Supply Chain Artifacts&lt;/h3>
&lt;p>Notary v2 supports signing any artifacts stored in a registry, including SBOMs and Scan Results. Using &lt;a href="https://github.com/notaryproject/notation-go-lib/releases/tag/v0.7.0-alpha.1" target="_blank" rel="noopener">notation-go-lib&lt;/a>, tooling may incorporate these capabilities directly into various artifact CLIs.&lt;/p>
&lt;div class="highlight">&lt;pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">PRIVATE_REGISTRY&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>localhost:5050
&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">PRIVATE_REPO&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">PRIVATE_REGISTRY&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>/net-monitor
&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">PRIVATE_IMAGE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">PRIVATE_REPO&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>:v1
&lt;span style="color:#8f5902;font-style:italic"># Simulate an SBOM&lt;/span>
&lt;span style="color:#204a87">echo&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;{&amp;#34;version&amp;#34;: &amp;#34;0.0.0.0&amp;#34;, &amp;#34;artifact&amp;#34;: &amp;#34;&amp;#39;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">IMAGE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;&amp;#34;, &amp;#34;contents&amp;#34;: &amp;#34;good&amp;#34;}&amp;#39;&lt;/span> &amp;gt; sbom.json
&lt;span style="color:#8f5902;font-style:italic"># Push to the registry with the oras cli&lt;/span>
oras push &lt;span style="color:#000">$REPO&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> --artifact-type sbom/example &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> --subject &lt;span style="color:#000">$IMAGE&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> sbom.json:application/json
&lt;span style="color:#8f5902;font-style:italic"># Capture the digest of the SBOM, to sign it&lt;/span>
&lt;span style="color:#000">SBOM_DIGEST&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>oras discover -o json &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> --artifact-type sbom/example &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> &lt;span style="color:#000">$IMAGE&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r &lt;span style="color:#4e9a06">&amp;#34;.references[0].digest&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
notation sign &lt;span style="color:#000">$REPO&lt;/span>@&lt;span style="color:#000">$SBOM_DIGEST&lt;/span>
&lt;span style="color:#8f5902;font-style:italic"># Generate scan results with snyk&lt;/span>
docker scan --json &lt;span style="color:#000">$IMAGE&lt;/span> &amp;gt; scan-results.json
cat scan-results.json &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq
&lt;span style="color:#8f5902;font-style:italic"># Push the scan results to the registry, referencing the image&lt;/span>
oras push &lt;span style="color:#000">$REPO&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> --artifact-type application/vnd.org.snyk.results.v0 &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> --subject &lt;span style="color:#000">$IMAGE&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> scan-results.json:application/json
&lt;span style="color:#8f5902;font-style:italic"># Capture the digest of the scan result, to sign the scan results&lt;/span>
&lt;span style="color:#000">SCAN_DIGEST&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>oras discover -o json &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> --artifact-type application/vnd.org.snyk.results.v0 &lt;span style="color:#4e9a06">\
&lt;/span>&lt;span style="color:#4e9a06">&lt;/span> &lt;span style="color:#000">$IMAGE&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r &lt;span style="color:#4e9a06">&amp;#34;.references[0].digest&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
notation sign &lt;span style="color:#000">$REPO&lt;/span>@&lt;span style="color:#000">$SCAN_DIGEST&lt;/span>
&lt;span style="color:#8f5902;font-style:italic"># Only 1 tag, representing the one artifact&lt;/span>
curl &lt;span style="color:#000">$PRIVATE_REGISTRY&lt;/span>/v2/net-monitor/tags/list &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq
&lt;span style="color:#8f5902;font-style:italic"># Discover the additional attributes&lt;/span>
oras discover -o tree &lt;span style="color:#000">$PRIVATE_IMAGE&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="../announcing-notation-alpha1/additional-objects.gif" alt="Animated screencast showing an SBOM and scan results being pushed using ORAS and signed using the notation CLI">&lt;/p>
&lt;h2 id="notation-alpha-1-features">Notation Alpha 1 Features&lt;/h2>
&lt;p>The &lt;a href="https://github.com/notaryproject/notation/releases/tag/v0.7.0-alpha.1" target="_blank" rel="noopener">Notation alpha 1 release&lt;/a> supports the following &lt;a href="https://github.com/notaryproject/notaryproject/blob/main/requirements/requirements.md#goals" target="_blank" rel="noopener">Notary v2 goals&lt;/a>:&lt;/p>
&lt;ul>
&lt;li>Offline signature creation&lt;/li>
&lt;li>Signatures attesting to authenticity and/or certification&lt;/li>
&lt;li>Maintain the original artifact digest and collection of associated tags, supporting existing dev through deployment workflows&lt;/li>
&lt;li>Multiple signatures per artifact, enabling the originating vendor signature, public registry certification and user/environment signatures&lt;/li>
&lt;li>Signature persistance within an &lt;a href="https://github.com/opencontainers/distribution-spec" target="_blank" rel="noopener">OCI distribution-spec&lt;/a> based registry, with &lt;a href="https://github.com/oras-project/artifacts-spec/" target="_blank" rel="noopener">oras artifacts spec&lt;/a> enhancements&lt;/li>
&lt;li>Air-gapped environments, where the originating registry of content is not accessible&lt;/li>
&lt;li>Artifact and signature copying within and across &lt;a href="https://github.com/opencontainers/distribution-spec" target="_blank" rel="noopener">OCI distribution-spec&lt;/a> based registries, with &lt;a href="https://github.com/oras-project/artifacts-spec/" target="_blank" rel="noopener">oras artifacts spec&lt;/a> enhancements&lt;/li>
&lt;li>Verification of signatures, through a configuration based policy&lt;/li>
&lt;/ul>
&lt;p>Future versions of Notation will include:&lt;/p>
&lt;ul>
&lt;li>Certificate revocation&lt;/li>
&lt;li>Verification through policy, enabling environment specific validations&lt;/li>
&lt;li>OCI Distribution 1.0 support (registries that don&amp;rsquo;t yet support the oras artifacts spec enhancements)&lt;/li>
&lt;li>TUF meta-data support, enabling compromise resilience, revocation of keys and artifacts, and timeliness guarantees&lt;/li>
&lt;/ul>
&lt;h2 id="getting-started">Getting Started&lt;/h2>
&lt;p>Here are some resources to help get started with Notation and Notary V2:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/notaryproject/notation/releases/tag/v0.7.0-alpha.1" target="_blank" rel="noopener">Notation CLI Alpha 1 release&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation#notation-quick-start" target="_blank" rel="noopener">Notation Quick Start&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/notaryproject/notation#community" target="_blank" rel="noopener">Join the notary v2 community&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>