<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>A cloud-native verification engine Blog</title>
        <link>https://ratify.dev/blog</link>
        <description>A cloud-native verification engine Blog</description>
        <lastBuildDate>Tue, 28 Jan 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Announcing Ratify v1.4.0 - Revocation Checking with CRL Support, Enhanced Out-of-box Experience, and New Cloud Provider Support]]></title>
            <link>https://ratify.dev/blog/ratify-v1.4.0-is-available</link>
            <guid>https://ratify.dev/blog/ratify-v1.4.0-is-available</guid>
            <pubDate>Tue, 28 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We are thrilled to announce the release of Ratify v1.4.0! This milestone release introduces significant new features that enhance Ratify's capabilities as a trusted supply chain security tool. As always, we deeply appreciate the contributions from the community, which make these advancements possible.]]></description>
            <content:encoded><![CDATA[<p>We are thrilled to announce the release of <a href="https://github.com/ratify-project/ratify/releases/tag/v1.4.0" target="_blank" rel="noopener noreferrer" class="">Ratify v1.4.0</a>! This milestone release introduces significant new features that enhance Ratify's capabilities as a trusted supply chain security tool. As always, we deeply appreciate the contributions from the community, which make these advancements possible.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features">New Features<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="revocation-checking-with-certificate-revocation-list-crl-support">Revocation Checking with Certificate Revocation List (CRL) Support<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#revocation-checking-with-certificate-revocation-list-crl-support" class="hash-link" aria-label="Direct link to Revocation Checking with Certificate Revocation List (CRL) Support" title="Direct link to Revocation Checking with Certificate Revocation List (CRL) Support" translate="no">​</a></h3>
<p>Security in supply chain verification is critical, and this release marks an important step forward with the addition of revocation checking. Certificate revocation checking enhances security by ensuring that compromised or expired certificates are not used, thereby maintaining the integrity and trustworthiness of digital signatures. Ratify supports validating signing identity (certificate and certificate chain) revocation status.</p>
<p>The CRL implementation uses Notation libraries and follows the <a href="https://github.com/notaryproject/specifications/blob/v1.1.0/specs/trust-store-trust-policy.md#crls" target="_blank" rel="noopener noreferrer" class="">Notary Project specification</a>. Since <a href="https://notaryproject.dev/blog/2025/announcing-notation-v1-3/" target="_blank" rel="noopener noreferrer" class="">Notation v1.3.0</a>, Ratify users can now use revocation checking by default if your images are signed by <a href="https://notaryproject.dev/docs/user-guides/how-to/directory-structure/#caches" target="_blank" rel="noopener noreferrer" class="">Notation</a> since CRL cache is enabled by default to enhance performance. It enables end-to-end revocation checking for validating image signature since reduced network traffic to the CRL server which minimizes potential server throttling and enhanced performance with lower latency. See <a href="https://ratify.dev/docs/plugins/verifier/notation#certificate-revocation-check-crl" target="_blank" rel="noopener noreferrer" class="">Certificate Revocation Check (CRL) guidance</a> for details.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="streamlined-notary-project-trust-policy-attributes-in-helm-chart">Streamlined Notary Project Trust Policy Attributes in Helm Chart<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#streamlined-notary-project-trust-policy-attributes-in-helm-chart" class="hash-link" aria-label="Direct link to Streamlined Notary Project Trust Policy Attributes in Helm Chart" title="Direct link to Streamlined Notary Project Trust Policy Attributes in Helm Chart" translate="no">​</a></h3>
<p>To provide an out-of-the-box experience for users, this release adds more Notary Project trust policy attributes to the <code>values.yaml</code> of the Ratify Helm Chart. This enhancement addresses three major scenarios outlined in <a href="https://github.com/ratify-project/ratify/issues/1965" target="_blank" rel="noopener noreferrer" class="">this issue</a>, simplifying configuration and streamlining deployment processes for these common use cases:</p>
<ul>
<li class="">The signed images are stored in a public registry</li>
<li class="">The signed images are stored in a private registry with certificates stored in AKV</li>
<li class="">The signed images are stored in a both public and private registry.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="alibaba-cloud-rrsa-store-authentication-provider">Alibaba Cloud RRSA Store Authentication Provider<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#alibaba-cloud-rrsa-store-authentication-provider" class="hash-link" aria-label="Direct link to Alibaba Cloud RRSA Store Authentication Provider" title="Direct link to Alibaba Cloud RRSA Store Authentication Provider" translate="no">​</a></h3>
<p>Ratify community continues to expand its support for cloud-native ecosystems with the introduction of a new authentication provider for the Alibaba Cloud RRSA Store. Users leveraging Alibaba Cloud’s RRSA can now seamlessly integrate with Ratify, enabling secure artifact signing and verification within their workflows. This feature reflects our commitment to supporting a diverse and growing range of platforms in the cloud-native landscape. As a new partner of Ratify, Alibaba Cloud also created a <a href="https://ratify.dev/docs/quickstarts/ratify-on-alibabacloud" target="_blank" rel="noopener noreferrer" class="">guidance</a> on how to use Ratify on Alibaba Cloud using Alibaba Cloud Container Service for Kubernetes (ACK) and Alibaba Cloud Container Registry (ACR).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-enhancements">Other enhancements<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#other-enhancements" class="hash-link" aria-label="Direct link to Other enhancements" title="Direct link to Other enhancements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="image-signing">Image signing<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#image-signing" class="hash-link" aria-label="Direct link to Image signing" title="Direct link to Image signing" translate="no">​</a></h3>
<p>Ratify official images are now signed by Notation and Cosign to ensure their integrity and authenticity. This helps defend against supply chain attacks by preventing tampered or untrusted images from being deployed in production environments. For more information, see the <a href="https://ratify.dev/docs/troubleshoot/security/#signature-validation" target="_blank" rel="noopener noreferrer" class="">Signature Validation document</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-diagnostic-experience">Enhanced Diagnostic Experience<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#enhanced-diagnostic-experience" class="hash-link" aria-label="Direct link to Enhanced Diagnostic Experience" title="Direct link to Enhanced Diagnostic Experience" translate="no">​</a></h3>
<p>This release also adds <code>timestamp</code> and <code>traceID</code> in verification response to help users identity the failing request easily. The default constraint template is updated to report the <code>timestamp</code> and <code>traceID</code> when validation fails.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-heartfelt-thanks-to-our-contributors">A Heartfelt Thanks to Our Contributors<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#a-heartfelt-thanks-to-our-contributors" class="hash-link" aria-label="Direct link to A Heartfelt Thanks to Our Contributors" title="Direct link to A Heartfelt Thanks to Our Contributors" translate="no">​</a></h2>
<p>Open-source projects thrive on the energy and dedication of their contributors. We are delighted to welcome five new contributors who have joined us in this release. Their efforts in refining the codebase, adding features, and addressing issues have been invaluable. To our new contributors: thank you for your hard work and passion for making Ratify better!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-get-started">How to Get Started<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#how-to-get-started" class="hash-link" aria-label="Direct link to How to Get Started" title="Direct link to How to Get Started" translate="no">​</a></h2>
<p>To start exploring Ratify v1.4.0:</p>
<ul>
<li class="">Check out the <a href="https://github.com/ratify-project/ratify/releases/tag/v1.4.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> for a detailed overview of changes and improvements.</li>
<li class="">Upgrade to the latest release by following the <a href="https://ratify.dev/docs/quick-start" target="_blank" rel="noopener noreferrer" class="">installation guide</a>.</li>
<li class="">Provide feedback by opening issues or discussions on our <a href="https://github.com/ratify-project/ratify/issues" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-ratify-community">Join the Ratify Community<a href="https://ratify.dev/blog/ratify-v1.4.0-is-available#join-the-ratify-community" class="hash-link" aria-label="Direct link to Join the Ratify Community" title="Direct link to Join the Ratify Community" translate="no">​</a></h2>
<p>Ratify’s growth is driven by an engaged and collaborative community. Whether you’re a developer, security professional, or just starting with supply chain security, we welcome your input and involvement. Join the community on our GitHub Discussions, Slack channel, community meeting, or share your ideas for improving Ratify.</p>
<p>Thank you for your continued support, and we look forward to hearing your feedback on this exciting release!</p>]]></content:encoded>
            <category>verification</category>
        </item>
        <item>
            <title><![CDATA[Ratify v1.3.0 is available!]]></title>
            <link>https://ratify.dev/blog/ratify-v1.3.0-is-available</link>
            <guid>https://ratify.dev/blog/ratify-v1.3.0-is-available</guid>
            <pubDate>Mon, 16 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We are excited to announce the release of Ratify v1.3.0!]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce the release of <a href="https://github.com/ratify-project/ratify/releases/tag/v1.3.0" target="_blank" rel="noopener noreferrer" class="">Ratify v1.3.0</a>!</p>
<p>Ratify is now a CNCF sandbox project! We sincerely thank the exceptional community for invaluable contributions and unwavering support in reaching this significant milestone.
Ratify is a verification framework that ensures container images and supply chain artifacts stored in a registry are thoroughly vetted and trustworthy.
By <a href="https://notaryproject.dev/blog/2023/announcing-major-release/#integration-with-admission-controller-for-kubernetes-usage" target="_blank" rel="noopener noreferrer" class="">integrating Ratify into your Kubernetes</a> workflow,
you can safeguard your application deployment against potential threats and vulnerabilities, thereby greatly enhancing the security of your applications.</p>
<p>Read further to learn about the exciting new features and how they can be beneficial to you!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features-and-deprecations">Features and deprecations<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#features-and-deprecations" class="hash-link" aria-label="Direct link to Features and deprecations" title="Direct link to Features and deprecations" translate="no">​</a></h2>
<p>Key features in this release include:</p>
<ul>
<li class="">Support of validating Notary Project signatures with timestamping</li>
<li class="">Support of periodic retrieval of keys and certificates stored in a KMS (Key Management System)</li>
<li class="">Introducing new configuration for Cosign keyless verification</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-of-validating-notary-project-signatures-with-timestamping">Support of validating Notary Project signatures with timestamping<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#support-of-validating-notary-project-signatures-with-timestamping" class="hash-link" aria-label="Direct link to Support of validating Notary Project signatures with timestamping" title="Direct link to Support of validating Notary Project signatures with timestamping" translate="no">​</a></h3>
<p>Ratify now supports verifying Notary Project signatures with timestamping.
Since <a href="https://notaryproject.dev/blog/2024/announcing-notation-v1-2/" target="_blank" rel="noopener noreferrer" class="">Notation v1.2.0 release</a>, Notary Project supports <a href="https://www.rfc-editor.org/rfc/rfc3161" target="_blank" rel="noopener noreferrer" class="">RFC 3161</a>-compliant timestamping.
This enhancement extends the trust of signatures created within the certificate's validity period by trusting on a Timestamping Authority (TSA),
enabling successful signature verification even after the certificates have expired.
Timestamping reduces costs by eliminating the need to periodically re-sign images due to certificate expiry, which is critical when using short-lived certificates.
To validate Notary Project signatures that include timestamps from a TSA, it's essential for a verifier to determine trusted entities both as the image signer and as the TSA. In Ratify, trust stores and trust policies can be configured in the Notation verifier to establish this trust. For more information, see the <a href="https://ratify.dev/docs/next/plugins/verifier/notation/#configuration" target="_blank" rel="noopener noreferrer" class="">configuration of Notation verifier</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-of-periodic-retrieval-of-keys-and-certificates-stored-in-a-kms">Support of periodic retrieval of keys and certificates stored in a KMS<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#support-of-periodic-retrieval-of-keys-and-certificates-stored-in-a-kms" class="hash-link" aria-label="Direct link to Support of periodic retrieval of keys and certificates stored in a KMS" title="Direct link to Support of periodic retrieval of keys and certificates stored in a KMS" translate="no">​</a></h3>
<p>Users configure keys and certificates through Key Management Providers (KMP) resources for signature verification. Without specifying versions in KMP resources, Ratify fetches the latest versions. Keys or certificates may rotate for security reasons, and automatic rotation is a common practice. When rotated, new versions are created, making the current versions outdated. Before Ratify v1.3.0, users had to manually update KMP resources when versions were rotated or disabled. This could result in verification failures for new versions if updates were not performed promptly. From v1.3.0 onwards, the <code>refreshInterval</code> parameter is introduced for KMP resources allowing periodic checks for the latest versions and status validation. Future updates will also support keeping a specified number of previous versions to validate older signatures that may still be in use.</p>
<p>Please note that currently, only the KMP of Azure Key Vault has this support. Let us know if you need support for other KMPs. For more information, see the <a href="https://ratify.dev/docs/next/reference/custom%20resources/key-management-providers#azure-key-vault" target="_blank" rel="noopener noreferrer" class="">Azure Key Vault KMP configuration</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-new-configuration-for-cosign-keyless-verification">Introducing new configuration for Cosign keyless verification<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#introducing-new-configuration-for-cosign-keyless-verification" class="hash-link" aria-label="Direct link to Introducing new configuration for Cosign keyless verification" title="Direct link to Introducing new configuration for Cosign keyless verification" translate="no">​</a></h3>
<p>Starting with version 1.2.0, trust policies have been introduced for Cosign signature verification, allowing users to fine tune verification policies. This release enhances the feature by adding support for Cosign keyless verification. For more information, see the <a href="https://ratify.dev/docs/next/plugins/verifier/cosign#keyless" target="_blank" rel="noopener noreferrer" class="">Cosign verifier keyless configuration</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-enhancements">Other enhancements<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#other-enhancements" class="hash-link" aria-label="Direct link to Other enhancements" title="Direct link to Other enhancements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="improving-error-messages-for-artifact-verification">Improving error messages for artifact verification<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#improving-error-messages-for-artifact-verification" class="hash-link" aria-label="Direct link to Improving error messages for artifact verification" title="Direct link to Improving error messages for artifact verification" translate="no">​</a></h3>
<p>Clear and concise error messages help users understand what went wrong and how to fix it, reducing support requests and downtime. For developers, well-written error messages provide specific details that can assist in diagnosing and resolving bugs or system issues. Improving error messages is an ongoing initiative at Ratify project. In this release, we've refined the error messages related to artifact verification as per the <a href="https://github.com/notaryproject/ratify/blob/v1.3.0/docs/proposals/Error-Messages-Improvements.md" target="_blank" rel="noopener noreferrer" class="">proposal</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhancing-security">Enhancing security<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#enhancing-security" class="hash-link" aria-label="Direct link to Enhancing security" title="Direct link to Enhancing security" translate="no">​</a></h3>
<p>Since this release, we have strengthened the security posture of the Ratify project through several key implementations:</p>
<p><strong>Docker Build Attestations</strong>: We now generate attestations, including provenance and a Software Bill of Materials (SBOM), for Ratify dev images. This improves transparency in the build process, ensuring better traceability and accountability of image contents. For more information, see the <a href="https://ratify.dev/docs/next/troubleshoot/security/#build-attestations" target="_blank" rel="noopener noreferrer" class="">Build attestations document</a>.</p>
<p><strong>Image Signing</strong>: Ratify dev images are now signed to ensure their integrity and authenticity. This helps defend against supply chain attacks by preventing tampered or untrusted images from being deployed in production environments. For more information, see the <a href="https://ratify.dev/docs/next/troubleshoot/security/#signature-validation" target="_blank" rel="noopener noreferrer" class="">Signature Validation document</a>.</p>
<p><strong>Vulnerability Scanning Workflow</strong>: We've implemented an automated workflow to scan Go projects, their dependencies, and Ratify images for known vulnerabilities. This proactive measure ensures that any potential security issues are identified and addressed early.</p>
<p><strong>OpenSSF Best Practices Badge</strong>: By adopting the Open Source Security Foundation (OpenSSF) best practices, we've earned the best practices badge. This reflects our commitment to industry-standard security practices, enhancing the project's trustworthiness and overall security posture.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="acknowledgements">Acknowledgements<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>The Ratify release team wants to thank the entire Ratify community for all the activities and engagements that has been vital for helping the project grow and reach this milestone.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-now">Try it now<a href="https://ratify.dev/blog/ratify-v1.3.0-is-available#try-it-now" class="hash-link" aria-label="Direct link to Try it now" title="Direct link to Try it now" translate="no">​</a></h2>
<p>Follow this <a href="https://ratify.dev/docs/next/quick-start" target="_blank" rel="noopener noreferrer" class="">quick start guide</a> to try out Ratify v1.3.0.</p>]]></content:encoded>
            <category>verification</category>
        </item>
        <item>
            <title><![CDATA[Ratify v1.2.0 is available!]]></title>
            <link>https://ratify.dev/blog/ratify-v1.2.0-is-available</link>
            <guid>https://ratify.dev/blog/ratify-v1.2.0-is-available</guid>
            <pubDate>Mon, 03 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We are thrilled to announce the release of Ratify v1.2.0!]]></description>
            <content:encoded><![CDATA[<p>We are thrilled to announce the release of Ratify v1.2.0!</p>
<p>Ratify is a verification framework that ensures all supply chain artifacts stored in a registry are thoroughly vetted and trustworthy. By <a href="https://notaryproject.dev/blog/2023/announcing-major-release/#integration-with-admission-controller-for-kubernetes-usage" target="_blank" rel="noopener noreferrer" class="">integrating Ratify into your Kubernetes</a> workflow, you can protect your deployment pipeline from potential threats and vulnerabilities, significantly enhancing the overall security of your applications.</p>
<p>Read on to discover the exciting new features and how they can benefit you!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-features-and-decprecations">Key Features and Decprecations<a href="https://ratify.dev/blog/ratify-v1.2.0-is-available#key-features-and-decprecations" class="hash-link" aria-label="Direct link to Key Features and Decprecations" title="Direct link to Key Features and Decprecations" translate="no">​</a></h2>
<p>Key features in this release include:</p>
<ul>
<li class="">Cosign Verifier Enhancements</li>
<li class="">Kubernetes Multi-Tenancy Support</li>
<li class="">Key Management Provider</li>
<li class="">OCI 1.1 support</li>
</ul>
<p>Deprecations:</p>
<ul>
<li class=""><code>CertificateStore</code> is deprecated in favor of <code>KeyManagementProvider</code> (KMP). Please migrate to <code>KeyManagementProvider</code> by following guide <a href="https://ratify.dev/docs/reference/custom%20resources/key-management-providers#migrating-from-certificatestore-to-kmp" target="_blank" rel="noopener noreferrer" class="">here</a>. Support will be removed in Ratify v2.0.0</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-brand-new-cosign-experience">A brand new Cosign experience!<a href="https://ratify.dev/blog/ratify-v1.2.0-is-available#a-brand-new-cosign-experience" class="hash-link" aria-label="Direct link to A brand new Cosign experience!" title="Direct link to A brand new Cosign experience!" translate="no">​</a></h2>
<p>Starting in v1.2.0, Ratify now has more comprehensive Cosign verification capabilities.</p>
<p>Verification of Cosign signatures is a critical validation. As such, the Cosign verifier is now a built-in verifier along with the Notation verifier. Beyond first class support, the Cosign verifier introduces a <code>Trust Policy</code> which binds a particular set of verification settings to a certain registry scope. Now, it's possible to specify multiple trust policies based on your registry, namespace, and/or image.</p>
<p>Cosign verification also includes a robust key experience that integrates directly with KMP resources. Expanded capabilities include: multiple key support from KMP or filesystem and RSA + elliptical keys across multiple sizes.</p>
<p>Watch this short demo to see the Cosign Verifier in action. Or check out the <a href="https://ratify.dev/docs/reference/verifiers/cosign" target="_blank" rel="noopener noreferrer" class="">documentation</a> for more information.</p>
<p><a href="https://asciinema.org/a/658139" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://asciinema.org/a/658139.svg" alt="asciicast" class="img_ev3q"></a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-multi-tenancy-in-kubernetes">Support for Multi-Tenancy in Kubernetes<a href="https://ratify.dev/blog/ratify-v1.2.0-is-available#support-for-multi-tenancy-in-kubernetes" class="hash-link" aria-label="Direct link to Support for Multi-Tenancy in Kubernetes" title="Direct link to Support for Multi-Tenancy in Kubernetes" translate="no">​</a></h2>
<p>Ratify now supports multi-tenancy, enabling organizations to share a single cluster among multiple teams by allowing users to define resources within a namespace scope.</p>
<p>This enhancement is seamlessly integrated, as users implicitly opt into multi-tenancy by applying namespace-specific resources such as NamespacedPolicy and NamespacedVerifier, without the need for an explicit feature flag.</p>
<p>Currenlty multi-tenancy supports the following resources: <code>Referrer Store</code>, <code>Verifier</code>, <code>Policy</code> and <code>Key Management Provider</code>, allowing these to be defined and managed within specific namespaces.</p>
<p>Additionally, cluster-wide resources can be set as defaults for namespaces that do not have specific resources defined, ensuring flexibility and efficient resource management across the organization.</p>
<p>Watch this step-by-step tutorial to see multi-tenancy in action. Or check out the <a href="https://ratify.dev/docs/reference/multi-tenancy" target="_blank" rel="noopener noreferrer" class="">documentation</a> for more information.</p>
<p><a href="https://asciinema.org/a/PO8RPcuZ2qyShif80c55WQipj" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://asciinema.org/a/PO8RPcuZ2qyShif80c55WQipj.svg" alt="asciicast" class="img_ev3q"></a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-of-the-key-management-provider">Introduction of the Key Management Provider<a href="https://ratify.dev/blog/ratify-v1.2.0-is-available#introduction-of-the-key-management-provider" class="hash-link" aria-label="Direct link to Introduction of the Key Management Provider" title="Direct link to Introduction of the Key Management Provider" translate="no">​</a></h2>
<p>In this release, we are introducing the <code>KeyManagementProvider</code> (KMP), a new resource designed to replace the existing <code>CertificateStore</code>.</p>
<p>A KMP represents keys and/or certificate that are consumed by a verifier. KMP contains various providers for different use cases, such as inline or cloud hosted key management solutions. Each provider is responsible for defining custom configuration and providing a set of public keys and/or x.509 certificates. Notation and Cosign verifiers can consume KMP resources to use during signature verification. Please refer to respective <a href="https://ratify.dev/docs/plugins/verifier/notation" target="_blank" rel="noopener noreferrer" class="">Notation</a> and <a href="https://ratify.dev/docs/plugins/verifier/cosign" target="_blank" rel="noopener noreferrer" class="">Cosign</a> verifier documentation on how to consume KMP.</p>
<p>This new feature aims to streamline key and certificate management, enhancing the efficiency and security of your operations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-invitation-to-contribute">An invitation to contribute!<a href="https://ratify.dev/blog/ratify-v1.2.0-is-available#an-invitation-to-contribute" class="hash-link" aria-label="Direct link to An invitation to contribute!" title="Direct link to An invitation to contribute!" translate="no">​</a></h2>
<p>We are thrilled to share that Ratify is currently <a href="https://github.com/cncf/sandbox/issues/96" target="_blank" rel="noopener noreferrer" class="">under review</a> to be adopted by the Cloud Native Computing Foundation (CNCF).</p>
<p>This marks an exciting opportunity for Ratify to become an open and inclusive project, welcoming contributions from the entire community. We encourage you to get involved, whether you're a developer, tester, or user. Your input and contributions are invaluable to us.</p>
<p>Join us in shaping the future of Ratify by contributing to the <a href="https://github.com/deislabs/ratify/blob/dev/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">project</a>!</p>]]></content:encoded>
            <category>verification</category>
        </item>
        <item>
            <title><![CDATA[Ratify v1.0.0 is available! An extensible verification framework for software supply chain security]]></title>
            <link>https://ratify.dev/blog/ratify-v1.0.0-is-available</link>
            <guid>https://ratify.dev/blog/ratify-v1.0.0-is-available</guid>
            <pubDate>Sun, 29 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[The Ratify maintainers are proud to announce the first major release v1.0.0 for production use!]]></description>
            <content:encoded><![CDATA[<p>The Ratify maintainers are proud to announce the first major release v1.0.0 for production use!</p>
<p>Ratify is an extensible verification framework for container images and other artifacts that can examine and author policies to audit existing resources in Kubernetes. Ratify can use and manage any number of custom verifiers for image metadata like signatures, SBOMs, vulnerability scan reports, and so on.</p>
<p>It helps users to validate the image integrity and authenticity in containers secure supply chain, ensuring your deployments are built from a trusted entity and that images haven't been tampered with since their creation.</p>
<p><img decoding="async" loading="lazy" src="https://ratify.dev/assets/images/ratify-e2e-e37eb519421498ff4c98b68334827ade.png" width="2714" height="1823" class="img_ev3q"></p>
<p>Ratify was <a href="https://cloudblogs.microsoft.com/opensource/2021/12/09/ratify-container-supply-chain-in-kubernetes/" target="_blank" rel="noopener noreferrer" class="">created and open-sourced</a> on December 9, 2021. After quickly iterating with 18 releases over the past two years, the Ratify framework has became more mature and extensible, and has now reached enterprise-grade quality. Users can easily run Ratify as an External Data Provider for <a href="https://open-policy-agent.github.io/gatekeeper/website/" target="_blank" rel="noopener noreferrer" class="">Gatekeeper</a> admission controller on Kubernetes with Helm.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notable-capabilities-in-this-release">Notable capabilities in this Release<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#notable-capabilities-in-this-release" class="hash-link" aria-label="Direct link to Notable capabilities in this Release" title="Direct link to Notable capabilities in this Release" translate="no">​</a></h2>
<ul>
<li class="">Ratify as a CLI binary for verifying artifacts stored in a registry</li>
<li class="">Support multiple verifiers including Notation, Cosign, and SBOM</li>
<li class="">Support dynamic configuration through CRD</li>
<li class="">TLS certificate management and rotation for mTLS service-to-service communication</li>
<li class="">Out-of-the-box observability: logging and prometheus metrics support</li>
<li class="">Extensible plugin design to support new verifier and referrer store plugins</li>
<li class="">High availability support (Experimental)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="extensible-plugin-design">Extensible plugin design<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#extensible-plugin-design" class="hash-link" aria-label="Direct link to Extensible plugin design" title="Direct link to Extensible plugin design" translate="no">​</a></h2>
<p>Ratify framework was designed from the beginning on an extensible plugin model without any affinity towards a particular verifier or storage model.
Ratify uses an extensible plugin architecture to enable extensibility and interoperability to support both the existing and new emerging needs of the artifact verification. Developers can easily <a href="https://ratify.dev/docs/1.0/quickstarts/creating-plugins" target="_blank" rel="noopener noreferrer" class="">create a new plugin</a> and integrate into Ratify ecosystem. See <a href="https://ratify.dev/docs/1.0/reference/ratify-framework-overview" target="_blank" rel="noopener noreferrer" class="">Framework overview</a> for details.</p>
<p><img decoding="async" loading="lazy" src="https://ratify.dev/assets/images/ratify-core-principals-47b814f0af08fa8f222886436ad77084.png" width="2070" height="1331" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-dynamic-configuration-through-crds">Support dynamic configuration through CRDs<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#support-dynamic-configuration-through-crds" class="hash-link" aria-label="Direct link to Support dynamic configuration through CRDs" title="Direct link to Support dynamic configuration through CRDs" translate="no">​</a></h2>
<p>Ratify supports updating its common configuration through Kubernetes CRDs using kubectl commands, delivering a Kubernetes-native experience for users. The configuration takes effect dynamically so that users have no need to restart the running Ratify Pod. There are four CRDs including Certificate Store, Policy, Store, and Verifier. You can see <a href="https://ratify.dev/docs/1.0/reference/crds/certificate-stores" target="_blank" rel="noopener noreferrer" class="">CRD reference docs</a> for details.</p>
<p><img decoding="async" loading="lazy" src="https://ratify.dev/assets/images/ratify-crd-ed2460da649632c99c3e5370f2e6a96b.png" width="2164" height="1430" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observability">Observability<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#observability" class="hash-link" aria-label="Direct link to Observability" title="Direct link to Observability" translate="no">​</a></h2>
<p>Observability is the process of gaining insight into the behavior and performance of applications running on Kubernetes, in order to monitor, troubleshoot, and identify issues more effectively.
Ratify introduces standardized logging component and metrics exporter for Prometheus in this release so that users can gather and visualize the metrics via a popular monitoring and logging stack with Prometheus, Grafana, and EFK.</p>
<p>With the rich metrics and verbose logs, it can help ensure the stability and performance of Kubernetes deployments and Ratify system, reduce verification request latency, system downtime and improve security posture.
All available metrics are listed in this <a href="https://ratify.dev/docs/1.0/reference/instrumentation#metrics-supported" target="_blank" rel="noopener noreferrer" class="">doc</a>. Refer to this <a href="https://ratify.dev/docs/1.0/reference/instrumentation#prometheus-and-grafana-setup" target="_blank" rel="noopener noreferrer" class="">guide</a> to build your own visualized dashboard for Ratify with Prometheus and Grafana.</p>
<p><img decoding="async" loading="lazy" src="https://ratify.dev/assets/images/ratify-grafana-7ce1e2fd0c88a7401ca25b4b5ce122c4.png" width="2426" height="1262" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ready-for-large-scale-scenarios">Ready for large-scale scenarios<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#ready-for-large-scale-scenarios" class="hash-link" aria-label="Direct link to Ready for large-scale scenarios" title="Direct link to Ready for large-scale scenarios" translate="no">​</a></h2>
<p>In order to provide security and reliability guarantees for production users in a large-scale deployment scenario, Ratify maintainers finished the load performance testing and published a performance report with detailed performance metrics. It demonstrates Ratify is ready for large-scale deployment scenario. See <a href="https://ratify.dev/docs/1.0/reference/performance/" target="_blank" rel="noopener noreferrer" class="">performance at scale</a> for details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="high-availability-experimental">High Availability (Experimental)<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#high-availability-experimental" class="hash-link" aria-label="Direct link to High Availability (Experimental)" title="Direct link to High Availability (Experimental)" translate="no">​</a></h2>
<p>For higher performance and availability requirements, Ratify can be set to run with multiple replicas and a shared state store.
Ratify supports High Availability (HA) using a distributed cache with Dapr and Redis under the hood. HA is an experimental feature in Ratify v1.0.0. Experimental features are intended for testing and evaluation purposes only and should not be used in production environments. See <a href="https://ratify.dev/docs/1.0/quickstarts/ratify-high-availability" target="_blank" rel="noopener noreferrer" class="">Install Ratify for High Availability</a> to set up an HA cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="brand-new-website">Brand-new website<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#brand-new-website" class="hash-link" aria-label="Direct link to Brand-new website" title="Direct link to Brand-new website" translate="no">​</a></h2>
<p>With the contribution from the community, the new <a href="https://ratify.dev/" target="_blank" rel="noopener noreferrer" class="">Ratify website (ratify.dev)</a> is launched along with the major release. All Ratify documentation has also been migrated from the code repository to the website repository. It provides friendly user experience for readers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adopted-and-trusted-by-industry-leaders">Adopted and trusted by industry leaders<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#adopted-and-trusted-by-industry-leaders" class="hash-link" aria-label="Direct link to Adopted and trusted by industry leaders" title="Direct link to Adopted and trusted by industry leaders" translate="no">​</a></h2>
<p>Ratify has been adopted in <a href="https://learn.microsoft.com/en-us/azure/aks/image-integrity" target="_blank" rel="noopener noreferrer" class="">AKS Image Integrity</a> and <a href="https://docs.aws.amazon.com/signer/latest/developerguide/kubernetes-verification.html" target="_blank" rel="noopener noreferrer" class="">AWS Signer</a> as the verification solution. As a vendor-neutral project, the early adoption status demonstrates the Ratify project's maturity and trustworthiness in the industry.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-it-in-action">See it in action<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#see-it-in-action" class="hash-link" aria-label="Direct link to See it in action" title="Direct link to See it in action" translate="no">​</a></h2>
<p>When deploy a signed image and another unsigned image to Kubernetes, Ratify will allow the signed image to be deployed only and deny the unsigned image deployment.</p>
<p><img decoding="async" loading="lazy" src="https://ratify.dev/assets/images/demo-short-5aa81ef0e16253073c217549f3597787.gif" width="1028" height="608" class="img_ev3q"></p>
<p>Learn signing and verification end-to-end tutorial with <a href="https://notaryproject.dev/" target="_blank" rel="noopener noreferrer" class="">Notation</a> and Ratify:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/qih39MXyptc?si=DZB3Dbu1OoB2p7CV" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<p>The Ratify maintainers are considering the following major features for the next milestone.</p>
<ul>
<li class="">Support verifying SBOM of a container image</li>
<li class="">Support verifying vulnerability reports of a container image</li>
<li class="">Multi-tenancy support</li>
</ul>
<p>The detailed issues for the next release are tracked in the <a href="https://github.com/ratify-project/ratify/milestone/15" target="_blank" rel="noopener noreferrer" class="">v1.1.0 milestone</a>.
We appreciate all kinds of input from the community. Feel free to reach out us on the <a href="https://cloud-native.slack.com/archives/C03T3PEKVA9" target="_blank" rel="noopener noreferrer" class="">Slack channel</a> or <a href="https://github.com/ratify-project/ratify/issues" target="_blank" rel="noopener noreferrer" class="">GitHub issues</a> to ask questions, provide feedback, or share ideas.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="acknowledgements">Acknowledgements<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>The Ratify team wants to thank the entire Ratify community for all the activity and engagement that has been vital for helping the project grow and reach this major milestone.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-now">Try it now<a href="https://ratify.dev/blog/ratify-v1.0.0-is-available#try-it-now" class="hash-link" aria-label="Direct link to Try it now" title="Direct link to Try it now" translate="no">​</a></h2>
<p>You can follow this <a href="https://ratify.dev/docs/1.0/quick-start" target="_blank" rel="noopener noreferrer" class="">quick start</a> to try Ratify v1.0.0 and signature verification demo within minutes.</p>]]></content:encoded>
            <category>verification</category>
        </item>
        <item>
            <title><![CDATA[Sign and verify an image with Notation, Ratify, and OPA Gatekeeper]]></title>
            <link>https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify</link>
            <guid>https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify</guid>
            <pubDate>Sat, 17 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[The signed container images enable users to assure deployments are built from a trusted entity and verify images haven't been tampered with since their creation. The signed image ensures integrity and authenticity before the user pulls an image into any environment and avoid attacks.]]></description>
            <content:encoded><![CDATA[<p>The signed container images enable users to assure deployments are built from a trusted entity and verify images haven't been tampered with since their creation. The signed image ensures integrity and authenticity before the user pulls an image into any environment and avoid attacks.</p>
<p><a href="https://notaryproject.dev/" target="_blank" rel="noopener noreferrer" class="">Notation</a> is a standards-based tool and library for signing and verifying OCI artifacts. It generates signatures and associates them with OCI artifacts to ensure integrity for the supply chain.</p>
<p><a href="https://github.com/ratify-project/ratify" target="_blank" rel="noopener noreferrer" class="">Ratify</a> is a verification engine as a binary executable and on Kubernetes which enables verification of artifact security metadata and admits for deployment only those that comply with policies you create. It works with <a href="https://github.com/open-policy-agent/gatekeeper" target="_blank" rel="noopener noreferrer" class="">OPA Gatekeeper</a> to provide fine-grained admission policy control capabilities for application deployment on Kubernetes.</p>
<p>This article walks you through the following end-to-end workflow:</p>
<ul>
<li class="">Build and sign an image in GHCR as a software publisher</li>
<li class="">Verify the signed image as a software consumer</li>
<li class="">Validating and enforcing only signed images are allowed to be deployed on Kubernetes</li>
</ul>
<p>The typical scenario is when you want to secure your containerized package for a GitHub repository, you can apply this workflow to your project to ensure image integrity between software publisher and consumer.</p>
<p><img decoding="async" loading="lazy" src="https://hackmd.io/_uploads/Byx012Nwn.png" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ul>
<li class="">Kubernetes v1.20 or higher (You can use <a href="https://minikube.sigs.k8s.io/docs/start/" target="_blank" rel="noopener noreferrer" class="">minikube</a> if you are new to Kubernetes)</li>
<li class="">Helm v3</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-an-oci-compatible-registry">Create an OCI-compatible registry<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#create-an-oci-compatible-registry" class="hash-link" aria-label="Direct link to Create an OCI-compatible registry" title="Direct link to Create an OCI-compatible registry" translate="no">​</a></h2>
<p>Create and run an OCI-compatible registry on your development computer using the <a href="https://github.com/distribution/distribution" target="_blank" rel="noopener noreferrer" class="">distribution/distribution</a> with the <a href="https://docs.docker.com/registry/spec/api/#deleting-an-image" target="_blank" rel="noopener noreferrer" class="">image deletion</a> enabled. The following command creates a registry that is accessible at <code>localhost:5001</code>.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run -d -p 5001:5000 -e REGISTRY_STORAGE_DELETE_ENABLED=true --name registry registry</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-an-image-to-the-registry">Add an image to the registry<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#add-an-image-to-the-registry" class="hash-link" aria-label="Direct link to Add an image to the registry" title="Direct link to Add an image to the registry" translate="no">​</a></h2>
<p>The following commands build and push the <a href="https://github.com/wabbit-networks/net-monitor#main" target="_blank" rel="noopener noreferrer" class="">wabbit-networks/net-monitor</a> container image to your container registry. Notation supports OCI v1.1 and v1.0 compliant registries. In this article, we use ghcr.io as a sample registry.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker build -t localhost:5001/net-monitor:v1 https://github.com/wabbit-networks/net-monitor.git#main</span><br></span></code></pre></div></div>
<p>Log in to ghcr.io with Docker. You can follow this <a href="https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic" target="_blank" rel="noopener noreferrer" class="">guide</a> to get the your personal GitHub Token.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">echo $CR_PAT | docker login ghcr.io -u $YOUR_USER_NAME --password-stdin</span><br></span></code></pre></div></div>
<p>Push the image to ghcr.io. You can record the image digest from the output.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker push ghcr.io/$namespace/net-monitor:v1</span><br></span></code></pre></div></div>
<p>You can record the image digest from the output. For example, the image digest is <code>ghcr.io/feynmanzhou/net-monitor@sha256:27c0290c485140c3c998e92c6ef23fba2bd9f09c8a1c7adb24a1d2d274ce3e8e</code>. Set the environment variable for this image digest.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">IMAGE=ghcr.io/$namespace/net-monitor@sha256:27c0290c485140c3c998e92c6ef23fba2bd9f09c8a1c7adb24a1d2d274ce3e8e</span><br></span></code></pre></div></div>
<p>Change the package visibility from private to public on GitHub Package settings. It will allow Notation and Ratify to pull the images from the GHCR registry without authentication configuration. See <a href="https://docs.github.com/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility" target="_blank" rel="noopener noreferrer" class="">Configuring a package's access control and visibility</a> for details.</p>
<p><img decoding="async" loading="lazy" src="https://hackmd.io/_uploads/rJzVse4v2.png" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-notation-cli">Install Notation CLI<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#install-notation-cli" class="hash-link" aria-label="Direct link to Install Notation CLI" title="Direct link to Install Notation CLI" translate="no">​</a></h2>
<p>Install the latest version on Linux. Follow the <a href="https://notaryproject.dev/docs/user-guides/installation/cli/" target="_blank" rel="noopener noreferrer" class="">installation guide</a> for other platforms.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl -LO https://github.com/notaryproject/notation/releases/download/v$NOTATION_VERSION/notation_$NOTATION_VERSION\_linux_amd64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tar xvzf  -C /usr/bin/ notation</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generate-a-test-key-and-self-signed-certificate">Generate a test key and self-signed certificate<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#generate-a-test-key-and-self-signed-certificate" class="hash-link" aria-label="Direct link to Generate a test key and self-signed certificate" title="Direct link to Generate a test key and self-signed certificate" translate="no">​</a></h2>
<p>Use <code>notation cert generate-test</code> to generate a test RSA key for signing artifacts, and a self-signed X.509 test certificate for verifying artifacts. Please note the self-signed certificate should be used for testing or development purposes only.</p>
<p>The following command generates a test key and a self-signed X.509 certificate. With the <code>--default</code> flag, the test key is set as a default signing key.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">notation cert generate-test --default "ratify-sample.io"</span><br></span></code></pre></div></div>
<p>Use <code>notation cert ls</code> to confirm the certificate is stored in the trust store.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">notation cert ls</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sign-the-image">Sign the image<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#sign-the-image" class="hash-link" aria-label="Direct link to Sign the image" title="Direct link to Sign the image" translate="no">​</a></h2>
<p>Sign the sample image with the flag <code>--signature-format</code> to use <a href="https://datatracker.ietf.org/doc/html/rfc8152/" target="_blank" rel="noopener noreferrer" class="">COSE</a> signature format. in ghcr.io.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">notation sign --signature-format cose $IMAGE</span><br></span></code></pre></div></div>
<p>The generated signature is pushed to the registry and the digest of the container image returned.</p>
<p>Use <code>notation ls</code> to show the signature associated with the container image.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ notation ls $IMAGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ghcr.io/feynmanzhou/net-monitor@sha256:27c0290c485140c3c998e92c6ef23fba2bd9f09c8a1c7adb24a1d2d274ce3e8e</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── application/vnd.cncf.notary.signature</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    └── sha256:f4c1e923d1f2a7b76513c889a0db548a093f422d06ac6b83ce7243e0c8fa7805</span><br></span></code></pre></div></div>
<p>You can find the signature has also been pushed to the GHCR registry associated with the signed image.</p>
<p><img decoding="async" loading="lazy" src="https://hackmd.io/_uploads/S1ZE3lEw2.png" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-trust-policy">Create a trust policy<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#create-a-trust-policy" class="hash-link" aria-label="Direct link to Create a trust policy" title="Direct link to Create a trust policy" translate="no">​</a></h2>
<p>To verify the container image, configure the trust policy to specify trusted identities that sign the artifacts, and level of signature verification to use. For more details, see <a href="https://github.com/notaryproject/notaryproject/blob/main/specs/trust-store-trust-policy.md#trust-policy" target="_blank" rel="noopener noreferrer" class="">trust policy spec</a>.</p>
<p>Create a JSON file with the following trust policy, for example:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF &gt; ./trustpolicy.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "version": "1.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "trustPolicies": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "name": "ratify-sample-images",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "registryScopes": [ "*" ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "signatureVerification": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "level" : "strict"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "trustStores": [ "ca:ratify-sample.io" ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "trustedIdentities": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "*"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span></code></pre></div></div>
<p>Import the trust policy configuration from a JSON file.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">notation policy import ./trustpolicy.json</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-the-image-signature-as-a-software-consumer">Verify the image signature as a software consumer<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#verify-the-image-signature-as-a-software-consumer" class="hash-link" aria-label="Direct link to Verify the image signature as a software consumer" title="Direct link to Verify the image signature as a software consumer" translate="no">​</a></h2>
<p>As a consumer, verify the signed image before using it.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">notation verify $IMAGE</span><br></span></code></pre></div></div>
<p>You can also check the signature digest and inspect the signature and its certificate information to make sure the image is produced from a trusted identity.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">notation inspect $IMAGE</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-the-containe-image-before-deploying-to-kubernetes">Verify the containe image before deploying to Kubernetes<a href="https://ratify.dev/blog/sign-and-verify-image-with-notation-ratify#verify-the-containe-image-before-deploying-to-kubernetes" class="hash-link" aria-label="Direct link to Verify the containe image before deploying to Kubernetes" title="Direct link to Verify the containe image before deploying to Kubernetes" translate="no">​</a></h2>
<p>Try out Ratify in Kubernetes through OPA Gatekeeper as the admission controller. It will enforce only signed images can be deployed to Kubernetes.</p>
<p>Set up Gatekeeper with <a href="https://open-policy-agent.github.io/gatekeeper/website/docs/externaldata" target="_blank" rel="noopener noreferrer" class="">external data</a>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">helm install gatekeeper/gatekeeper  \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --name-template=gatekeeper \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --namespace gatekeeper-system --create-namespace \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --set enableExternalData=true \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --set validatingWebhookTimeoutSeconds=5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --set mutatingWebhookTimeoutSeconds=2</span><br></span></code></pre></div></div>
<p>Install the lastest version of Ratify. Specify the certificate generated by Notation for verification purposes.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">helm repo add ratify https://notaryproject.github.io/ratify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">helm install ratify \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ratify/ratify --atomic \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --namespace gatekeeper-system \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --set-file notaryCert=ghcr-networks.io.crt</span><br></span></code></pre></div></div>
<p>Apply the constrait to enforce Gatekeeper policy to allow only signed images can be deployed on Kubernetes:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://notaryproject.github.io/ratify/library/default/template.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://notaryproject.github.io/ratify/library/default/samples/constraint.yaml</span><br></span></code></pre></div></div>
<p>Deploy the sample image signed by Notation. Ratify will verify if this image has a valid signature.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ kubectl run ratify-signed --image=$IMAGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/net-monitor@sha256:27c0290c485140c3c998e92c6ef23fba2bd9f09c8a1c7adb24a1d2d274ce3e8e</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pod/demo created</span><br></span></code></pre></div></div>
<p>Check the signature associated with the image.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">notation ls $IMAGE</span><br></span></code></pre></div></div>
<p>Deploy an unsigned image to Kubernetes cluster. The deployment has been denied since the image has not been signed and doesn't meet the deployment criteria.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ kubectl run demo --image=ghcr.io/feynmanzhou/notation/alpine@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [ratify-constraint] Subject failed verification: ghcr.io/feynmanzhou/notation/alpine@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870</span><br></span></code></pre></div></div>
<p>Inspect the logs to get the detailed error message from the Ratify Pod.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ kubectl logs ratify-xxxx -n gatekeeper-system</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "subject": "ghcr.io/feynmanzhou/notation/alpine@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "isSuccess": false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "message": "verification failed: no referrers found for this artifact"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">···</span><br></span></code></pre></div></div>
<p>Deploy a signed image with an expired certificate.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl run sample --image=ghcr.io/feynmanzhou/alpine:latest@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [ratify-constraint] Subject failed verification: ghcr.io/feynmanzhou/alpine:latest@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870</span><br></span></code></pre></div></div>
<p>Inspect the logs to get the detailed error message from the Ratify Pod. You can find that verification failed caused by an invalid signature.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "isSuccess": false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "verifierReports": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "isSuccess": false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "name": "notaryv2",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "message": "an error thrown by the verifier: failed to verify signature, err: signature is not produced by a trusted signer",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">···</span><br></span></code></pre></div></div>]]></content:encoded>
            <category>verification</category>
        </item>
    </channel>
</rss>