<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: PKI security</title>
    <description>The latest articles on DEV Community by PKI security (@pki-channnel).</description>
    <link>https://dev.to/pki-channnel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4134970%2Ffc27163b-3c3c-411c-a9c5-169d8d46b82c.png</url>
      <title>DEV Community: PKI security</title>
      <link>https://dev.to/pki-channnel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pki-channnel"/>
    <language>en</language>
    <item>
      <title>Make provenance travel with public-interest images: a C2PA handoff checklist for small teams</title>
      <dc:creator>PKI security</dc:creator>
      <pubDate>Sat, 10 Oct 2026 00:40:46 +0000</pubDate>
      <link>https://dev.to/pki-channnel/make-provenance-travel-with-public-interest-images-a-c2pa-handoff-checklist-for-small-teams-118h</link>
      <guid>https://dev.to/pki-channnel/make-provenance-travel-with-public-interest-images-a-c2pa-handoff-checklist-for-small-teams-118h</guid>
      <description>&lt;p&gt;A community organization photographs a local event. A volunteer edits the images, a colleague uploads them, and a partner republishes one with a new caption. By the time a reader asks where the photograph came from, nobody is sure which copy was approved.&lt;/p&gt;

&lt;p&gt;This hypothetical handoff is ordinary enough to be easy to overlook. For public-interest information, a lost original or changed caption can make a correction much harder. Small teams need a process that survives a change of person, tool, and file.&lt;/p&gt;

&lt;h2&gt;
  
  
  C2PA helps with provenance; the handoff still needs people
&lt;/h2&gt;

&lt;p&gt;C2PA can bind signed provenance records to an asset. Those records may describe creation, editing, and source materials. They provide evidence about the asset's history within the scope of what was recorded. They do not certify the truth of a caption, grant publication rights, or guarantee that all previous activity is known. See the &lt;a href="https://spec.c2pa.org/specifications/specifications/2.4/explainer/Explainer.html" rel="noopener noreferrer"&gt;official C2PA explainer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The practical aim is to preserve both the useful technical evidence and the human context needed to interpret it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkwd3b5rb7v7h3zkbnn4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkwd3b5rb7v7h3zkbnn4g.png" alt="Keep the received file separate from the publication copy. Pass on the source, caption, permissions and contact privately. Record the credential result for what the reader receives. Name an owner who can update the caption and notify recipients." width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conceptual illustration with fictional scenes, not a real verification result. The recorded fields depend on the file and software.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preserve the original&lt;/strong&gt;: Keep the received file separate from the publication copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carry the context&lt;/strong&gt;: Pass on the source, caption, permissions and contact privately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the delivered copy&lt;/strong&gt;: Record the credential result for what the reader receives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan corrections&lt;/strong&gt;: Name an owner who can update the caption and notify recipients.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keep four things distinguishable
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Why keep it separate?&lt;/th&gt;
&lt;th&gt;Suggested handling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Received original&lt;/td&gt;
&lt;td&gt;Later transforms may change the file and its readable provenance&lt;/td&gt;
&lt;td&gt;Preserve it with appropriate access controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Working and publication copies&lt;/td&gt;
&lt;td&gt;The approved edit and the delivered file may differ&lt;/td&gt;
&lt;td&gt;Give each version an identifier and record its role&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caption and source notes&lt;/td&gt;
&lt;td&gt;Text outside the image is not automatically covered by image verification&lt;/td&gt;
&lt;td&gt;Track the caption, source URL, and unresolved claims&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private coordination record&lt;/td&gt;
&lt;td&gt;Contact details and sensitive context need not be public&lt;/td&gt;
&lt;td&gt;Keep access restricted and assign a responsible person&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is a proposed operating checklist, not a standard mandated by C2PA. A file hash can help distinguish two exact byte sequences, but it does not prove a photograph's truth, authorship, or permission status.&lt;/p&gt;

&lt;h2&gt;
  
  
  At intake: ask what you actually received
&lt;/h2&gt;

&lt;p&gt;Record who supplied the file to the team, where it was obtained, and which facts are confirmed or unknown. Do not fill in a missing capture time from memory. Keep the received caption beside the file, and mark any later caption revisions separately.&lt;/p&gt;

&lt;p&gt;Clarify the intended publication and any restrictions with the relevant people. A record that can be verified cryptographically is not evidence that a person depicted agreed to every possible reuse.&lt;/p&gt;

&lt;h2&gt;
  
  
  During editing: preserve the chain you can explain
&lt;/h2&gt;

&lt;p&gt;Work on a copy. Note the tool, version, and operations that matter for understanding the image. Where your supported workflow produces a new manifest for an edited asset, retain the relationship to its ingredients as intended by that workflow.&lt;/p&gt;

&lt;p&gt;Do not add a new record to an old photograph and describe that as recovery of its complete past. A new record can describe the operation now performed; it cannot create trustworthy knowledge of earlier events that were never recorded. The &lt;a href="https://spec.c2pa.org/specifications/specifications/2.2/guidance/Guidance.html" rel="noopener noreferrer"&gt;implementation guidance&lt;/a&gt; is a starting point for planning supported edit and distribution workflows.&lt;/p&gt;

&lt;p&gt;Avoid placing sensitive contact details into a record just because the software offers a field. C2PA's &lt;a href="https://spec.c2pa.org/specifications/specifications/2.4/security/Harms_Modelling.html" rel="noopener noreferrer"&gt;harms analysis&lt;/a&gt; explains why privacy and later rediscovery of earlier information need consideration before publication.&lt;/p&gt;

&lt;h2&gt;
  
  
  At delivery: check what a reader receives
&lt;/h2&gt;

&lt;p&gt;An upload completing successfully is not evidence that the final delivered file has the same readable provenance as the original. A content management system, thumbnail service, or content delivery network may transform the image.&lt;/p&gt;

&lt;p&gt;Have the reviewer obtain the actual delivered copy and note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which URL and file were checked;&lt;/li&gt;
&lt;li&gt;the verifier and version, including relevant trust configuration;&lt;/li&gt;
&lt;li&gt;which recorded details were readable and which checks completed;&lt;/li&gt;
&lt;li&gt;any errors or unknowns, without relabeling them as proof of false content;&lt;/li&gt;
&lt;li&gt;whether the surrounding caption still matches the approved explanation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article reports no measured preservation rate and no completed tool comparison. Run and record these checks in your own environment before making a claim about your pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make correction ownership part of the package
&lt;/h2&gt;

&lt;p&gt;Before handing a file to a partner, decide who receives a correction request and who contacts downstream publishers. Keep a short version note that can be shared without exposing private sources. Replacing one copy on your own website does not recall copies held elsewhere.&lt;/p&gt;

&lt;p&gt;A useful handoff ends with a statement such as: “This is the approved publication copy. The date in the caption remains unconfirmed. Contact the designated editor before reusing it as evidence of a current event.” It gives the next person something concrete to act on.&lt;/p&gt;

&lt;p&gt;PKI Channel's &lt;a href="https://pki-channel.com/ja/articles/c2pa-implementation-playbook?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=owned_media&amp;amp;utm_content=own-b059-1"&gt;implementation playbook in Japanese&lt;/a&gt; and &lt;a href="https://pki-channel.com/ja/articles/c2pa-image-sharing-test?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=owned_media&amp;amp;utm_content=own-b059-2"&gt;image-sharing verification guide in Japanese&lt;/a&gt; provide further checklists for planning this work. The goal is not to attach a badge to every picture. It is to make the evidence, limits, and responsibility travel with the image.&lt;/p&gt;




&lt;p&gt;AI was used for research assistance, writing and illustration.&lt;/p&gt;

</description>
      <category>security</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Missing Content Credentials is not a guilty verdict: build a fair upload flow</title>
      <dc:creator>PKI security</dc:creator>
      <pubDate>Sat, 10 Oct 2026 00:37:40 +0000</pubDate>
      <link>https://dev.to/pki-channnel/missing-content-credentials-is-not-a-guilty-verdict-build-a-fair-upload-flow-106</link>
      <guid>https://dev.to/pki-channnel/missing-content-credentials-is-not-a-guilty-verdict-build-a-fair-upload-flow-106</guid>
      <description>&lt;p&gt;Imagine a neighborhood newsroom accepting photographs after a storm. One contributor uses a new camera with provenance support. Another sends a useful photograph from an older phone. A third avoids identifying metadata because publication could put someone at risk.&lt;/p&gt;

&lt;p&gt;These are hypothetical contributors, not the results of an experiment. They illustrate a design problem: an upload form can turn a technical signal into an unfair judgment about a person.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not make the absence of Content Credentials a verdict that a photograph is false.&lt;/strong&gt; C2PA's own &lt;a href="https://spec.c2pa.org/specifications/specifications/2.4/security/Harms_Modelling.html" rel="noopener noreferrer"&gt;harms analysis&lt;/a&gt; discusses the risk of treating content without credentials as untrustworthy. A fair flow needs a path for incomplete evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the credential contributes
&lt;/h2&gt;

&lt;p&gt;C2PA specifies ways to bind provenance claims to a digital asset and sign those claims. Provenance may describe creation, editing, or source materials. A verifier can evaluate the binding, signature, and other applicable requirements. The result depends on what was recorded and on the verification environment.&lt;/p&gt;

&lt;p&gt;This is useful evidence. It is not proof that the depicted event happened as described, that every earlier step was recorded, or that the uploader has permission to publish. The &lt;a href="https://spec.c2pa.org/specifications/specifications/2.4/explainer/Explainer.html" rel="noopener noreferrer"&gt;official explainer&lt;/a&gt; draws these boundaries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhg076n1g7nkh73eegne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhg076n1g7nkh73eegne.png" alt="A missing credential does not prove that a photo is false. Separate not found, invalid and unable to check. Ask for context or a source without demanding public identity. Record what is known and unknown before deciding." width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conceptual illustration with fictional scenes, not a real verification result. The recorded fields depend on the file and software.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep the submission&lt;/strong&gt;: A missing credential does not prove that a photo is false.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Describe the result&lt;/strong&gt;: Separate not found, invalid and unable to check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offer another route&lt;/strong&gt;: Ask for context or a source without demanding public identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review fairly&lt;/strong&gt;: Record what is known and unknown before deciding.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Model the result before choosing a badge
&lt;/h2&gt;

&lt;p&gt;For a beginner-friendly product, start with distinct states. The following labels are a proposed interface model, not C2PA API constants:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product state&lt;/th&gt;
&lt;th&gt;What to tell the contributor&lt;/th&gt;
&lt;th&gt;What happens next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not found&lt;/td&gt;
&lt;td&gt;We did not find readable provenance in this copy&lt;/td&gt;
&lt;td&gt;Keep the submission and offer another way to provide context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invalid&lt;/td&gt;
&lt;td&gt;Some verification checks did not pass&lt;/td&gt;
&lt;td&gt;Record the specific finding and route for review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unable to check&lt;/td&gt;
&lt;td&gt;This check could not be completed&lt;/td&gt;
&lt;td&gt;Explain the limitation and offer a retry or review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checks completed&lt;/td&gt;
&lt;td&gt;Show the supported findings and relevant recorded details&lt;/td&gt;
&lt;td&gt;Continue the editorial checks appropriate to the submission&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An invalid result is also not a complete explanation of what happened. A transformation, unsupported feature, changed asset, or other condition needs investigation in its actual context. Preserve the verifier's detailed result for an appropriately authorized reviewer; do not collapse every problem into “fake.”&lt;/p&gt;

&lt;p&gt;Use plain text as well as any icon. A red shield or green check alone hides the scope of the assessment and is inaccessible to some readers. C2PA's &lt;a href="https://spec.c2pa.org/specifications/specifications/2.2/ux/UX_Recommendations.html" rel="noopener noreferrer"&gt;UX guidance&lt;/a&gt; is useful when deciding how to reveal details without presenting provenance as a universal authenticity score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offer context without demanding public exposure
&lt;/h2&gt;

&lt;p&gt;A contributor might provide an original file, the original publication URL, or an explanation of where the image came from. Make clear which fields are optional, who can read them, and what will become public.&lt;/p&gt;

&lt;p&gt;Do not demand a public home address or precise location as the price of a fair review. An authorized editor may need a private follow-up channel, but that channel should not silently become part of a public image description. Collect information for a stated purpose, with the minimum access needed for that purpose.&lt;/p&gt;

&lt;p&gt;Also keep “permission to publish” separate from “provenance verified.” A well-formed record does not stand in for a discussion about consent, licensing, or the safety of people depicted. Those checks depend on your organization and the use of the image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the flow with three paper scenarios
&lt;/h2&gt;

&lt;p&gt;Before implementation, walk through these cases with your team:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An older device produces an image with no supported credential. Can the contributor still submit it for review?&lt;/li&gt;
&lt;li&gt;A supported image passes through a resizing service. If verification changes, can the editor inspect the received copy and the original separately?&lt;/li&gt;
&lt;li&gt;A contributor declines to expose identifying metadata. Is there a private route for necessary follow-up, rather than an automatic public credibility penalty?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are proposed review scenarios. No software, detector, or upload pipeline was tested for this article. They can help expose a flawed decision rule before you write code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the reviewer an outcome other than guilty or innocent
&lt;/h2&gt;

&lt;p&gt;A useful review note might read: “No readable credential was found in the submitted copy. The contributor supplied an original publication URL. The location claim remains unconfirmed.” That is more actionable than a single trust score.&lt;/p&gt;

&lt;p&gt;Keep a route for corrections and contributor responses. Provenance can make a submission easier to investigate; it should not make people with older devices, limited resources, or safety concerns disappear from the process.&lt;/p&gt;

&lt;p&gt;For further technical context, PKI Channel provides a &lt;a href="https://pki-channel.com/ja/articles/what-is-c2pa?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=owned_media&amp;amp;utm_content=own-b058-1"&gt;C2PA overview in Japanese&lt;/a&gt; and a &lt;a href="https://pki-channel.com/ja/articles/c2pa-verification-workflow?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=owned_media&amp;amp;utm_content=own-b058-2"&gt;verification workflow in Japanese&lt;/a&gt;. Use them to plan the checks, then document the exact tools and policies used in your own deployment.&lt;/p&gt;




&lt;p&gt;AI was used for research assistance, writing and illustration.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Your first HTTPS certificate renewal: issue, install, check</title>
      <dc:creator>PKI security</dc:creator>
      <pubDate>Thu, 08 Oct 2026 12:40:49 +0000</pubDate>
      <link>https://dev.to/pki-channnel/your-first-https-certificate-renewal-issue-install-check-25jo</link>
      <guid>https://dev.to/pki-channnel/your-first-https-certificate-renewal-issue-install-check-25jo</guid>
      <description>&lt;p&gt;Your hosting dashboard says that a new certificate is ready. Does that mean your visitors are using it?&lt;/p&gt;

&lt;p&gt;The answer depends on where HTTPS is managed. For your first renewal, write down who obtains the certificate, which service uses it, and how you will check the connection that a visitor actually makes. Those are separate questions, even when a hosting provider handles all of them for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fua9edniztzctmjbr8qjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fua9edniztzctmjbr8qjd.png" alt="Explanatory infographic: Obtain a new certificate, activate it in the service handling HTTPS, then observe a new verified connection to the public hostname. Identify who manages HTTPS. Reading a local file does not show what visitors receive, and one connection is only one observation. Keep private keys with the authorized service." width="800" height="1716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conceptual renewal workflow, not a production test result. Product-specific activation and checks depend on the actual HTTPS service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the service that handles HTTPS
&lt;/h2&gt;

&lt;p&gt;HTTPS protects web traffic using TLS, or Transport Layer Security. A server certificate helps a client authenticate the server. It contains a public key and information about the names it covers, among other fields. The corresponding private key stays with the authorized server-side service or key-management system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Transport_Layer_Security" rel="noopener noreferrer"&gt;MDN's TLS guide&lt;/a&gt; explains that modern hosting services often manage certificates and configure HTTPS on your behalf. Before adding your own renewal job, check the provider's documentation and your service settings.&lt;/p&gt;

&lt;p&gt;For a managed service, your work may be confirming that automatic renewal is enabled and finding the person responsible for alerts. For a self-managed server, you may also need a certificate client and a deployment procedure. A CDN, a load balancer, or a web server can be the component that handles the browser's TLS connection. A certificate on an application server behind it may cover a different connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Obtain the next certificate
&lt;/h2&gt;

&lt;p&gt;Renewal normally means obtaining a new certificate before the old one becomes unusable. It does not change the expiry date printed inside the old certificate.&lt;/p&gt;

&lt;p&gt;ACME, the Automated Certificate Management Environment protocol, lets a client automate certificate requests. In &lt;a href="https://letsencrypt.org/how-it-works/" rel="noopener noreferrer"&gt;Let's Encrypt's explanation&lt;/a&gt;, the client proves control of the requested domain and asks the CA, or Certificate Authority, to issue a certificate. Issuance is one stage of the work. The details of domain validation depend on the client and deployment.&lt;/p&gt;

&lt;p&gt;Record which names the certificate must cover and which client or provider is responsible. Also record where renewal failures are reported. A scheduled job without anyone receiving its failure notice is an incomplete handoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Make the HTTPS service use it
&lt;/h2&gt;

&lt;p&gt;A new file on disk is useful only if the relevant HTTPS service loads it. The installation path and activation procedure depend on the product. Some services reload configuration, some use a managed upload or secret, and others handle this automatically.&lt;/p&gt;

&lt;p&gt;Use the official procedure for your actual hosting platform. It should tell you which certificate chain and key format to supply, how to activate the change, and how to recover if activation fails. Do not assume a command from a different server product applies to yours.&lt;/p&gt;

&lt;p&gt;An existing connection may continue under its previous TLS state. Checking a new connection matters when you want to see what the service now presents.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Check what the client receives
&lt;/h2&gt;

&lt;p&gt;After activation, make a new connection to the public hostname using a client that performs normal certificate verification. Check the certificate it receives, including the intended names and validity period. Record the client, time, and hostname so another person can understand the observation.&lt;/p&gt;

&lt;p&gt;The rules for certificate path validation and service names are described in &lt;a href="https://www.rfc-editor.org/rfc/rfc5280.html" rel="noopener noreferrer"&gt;RFC 5280&lt;/a&gt; and &lt;a href="https://www.rfc-editor.org/rfc/rfc9525.html" rel="noopener noreferrer"&gt;RFC 9525&lt;/a&gt;. Finding the expected certificate fingerprint alone does not show that the client accepted its name and trust chain. Similarly, reading a local file does not show what a public endpoint serves.&lt;/p&gt;

&lt;p&gt;If your hostname reaches several servers or regions, one successful connection is only one observation. Your deployment procedure should explain which destinations need checking. A certificate check also does not replace an application health check.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worksheet for the next person
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Fill this in for one service&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who obtains the certificate?&lt;/td&gt;
&lt;td&gt;Provider or client, responsible person, alert destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What names must it cover?&lt;/td&gt;
&lt;td&gt;The actual hostnames visitors use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where does the browser's TLS connection end?&lt;/td&gt;
&lt;td&gt;The CDN, load balancer, or web server and its service name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How does that component load a replacement?&lt;/td&gt;
&lt;td&gt;Official procedure and activation step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What did a new client connection receive?&lt;/td&gt;
&lt;td&gt;Hostname, client, time, certificate details and verification result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What remains unobserved?&lt;/td&gt;
&lt;td&gt;Other destinations or checks still required by the deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is a planning worksheet, not a report of a production test. Filling in the boxes helps you identify missing responsibilities before the next renewal. Keep private keys and account credentials out of the worksheet.&lt;/p&gt;

&lt;p&gt;For a more detailed deployment flow and acceptance conditions, PKI Channel has a &lt;a href="https://pki-channel.com/ja/articles/acme-renewal-deployment-design?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=owned_media&amp;amp;utm_content=own-b020-1"&gt;renewal and deployment guide in Japanese&lt;/a&gt;. Its diagrams separate obtaining, deploying, activating, and observing the replacement. Use it as an additional reference alongside the documentation for your platform.&lt;/p&gt;




&lt;p&gt;AI was used for source review and drafting.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>security</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Design certificate rotation acceptance tests for every TLS termination point</title>
      <dc:creator>PKI security</dc:creator>
      <pubDate>Fri, 02 Oct 2026 06:09:14 +0000</pubDate>
      <link>https://dev.to/pki-channnel/design-certificate-rotation-acceptance-tests-for-every-tls-termination-point-lm4</link>
      <guid>https://dev.to/pki-channnel/design-certificate-rotation-acceptance-tests-for-every-tls-termination-point-lm4</guid>
      <description>&lt;p&gt;A renewal job exits successfully, the certificate file on disk changes, and one endpoint still serves the previous certificate. Those observations describe different parts of a deployment. Treat each part as an acceptance condition you can observe.&lt;/p&gt;

&lt;p&gt;This article gives you a worksheet for testing certificate rotation across your own TLS termination points. The worksheet is an operational proposal. The measured example below covers one local NGINX instance, not a production CA, a CDN, or every environment in the table.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the target before defining success
&lt;/h2&gt;

&lt;p&gt;Start with a hostname and the places that terminate TLS for it. A public load balancer, an ingress controller, and an upstream application may each hold different certificates. Decide which connection you intend to test, the expected leaf certificate, and the trust policy of the relevant client.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;Evidence to retain&lt;/th&gt;
&lt;th&gt;What it does not establish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New certificate obtained&lt;/td&gt;
&lt;td&gt;Certificate identity, validity, issuance result&lt;/td&gt;
&lt;td&gt;Deployment to a server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New certificate saved&lt;/td&gt;
&lt;td&gt;File or secret version and configured reference&lt;/td&gt;
&lt;td&gt;Loading by the running process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reload requested&lt;/td&gt;
&lt;td&gt;Configuration check, command exit, service log&lt;/td&gt;
&lt;td&gt;Which leaf a new client receives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expected leaf received&lt;/td&gt;
&lt;td&gt;Endpoint, SNI, timestamp, SHA-256 fingerprint&lt;/td&gt;
&lt;td&gt;Name, trust, validity or revocation acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS verification passed&lt;/td&gt;
&lt;td&gt;Expected name, trust configuration, time, result&lt;/td&gt;
&lt;td&gt;Acceptance under every browser or device policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All intended targets observed&lt;/td&gt;
&lt;td&gt;A row for every defined target&lt;/td&gt;
&lt;td&gt;Coverage of unspecified or unreachable targets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Certbot documents renewal hooks separately from renewal itself. NGINX also describes applying configuration changes as a process that can fail and retain the old configuration. Use the endpoint observation as a separate condition. &lt;a href="https://eff-certbot.readthedocs.io/en/stable/using.html#renewing-certificates" rel="noopener noreferrer"&gt;Certbot hooks&lt;/a&gt; and &lt;a href="https://nginx.org/en/docs/control.html" rel="noopener noreferrer"&gt;NGINX control&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the observation scope explicit
&lt;/h2&gt;

&lt;p&gt;Use a row for each target you can meaningfully select. Record IPv4 and IPv6 separately when both are used. If a managed edge service does not expose a stable way to select every node, record the sampling method and that limitation. A single successful request is not evidence for every edge node.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hostname, connect_address, port, sni, client_version, tls_backend,
trust_policy, expected_leaf_sha256, observed_leaf_sha256,
observed_at_utc, tls_result, coverage_limit, owner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;unknown&lt;/code&gt;, &lt;code&gt;unreachable&lt;/code&gt;, &lt;code&gt;mismatch&lt;/code&gt; and &lt;code&gt;verification_failed&lt;/code&gt; should remain distinct. This vocabulary is a suggested worksheet convention, not an ACME or TLS standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probe a selected address without changing the expected name
&lt;/h2&gt;

&lt;p&gt;The following Bash example uses OpenSSL 3.x. The address is illustrative. Replace it and the trust file with values approved for your own environment. &lt;code&gt;timeout&lt;/code&gt; is a separate utility, typically supplied by GNU coreutils on Linux.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'service.example.test'&lt;/span&gt;
&lt;span class="nv"&gt;ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'192.0.2.10:443'&lt;/span&gt;
&lt;span class="nb"&gt;timeout &lt;/span&gt;12s openssl s_client &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-connect&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-servername&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-verify_hostname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-verify_return_error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-no-CApath&lt;/span&gt; &lt;span class="nt"&gt;-no-CAstore&lt;/span&gt; &lt;span class="nt"&gt;-CAfile&lt;/span&gt; trusted-root.pem &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-showcerts&lt;/span&gt; &amp;lt;/dev/null
&lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'probe_exit=%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$rc&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SNI requests a server name; it does not itself verify the certificate name. &lt;code&gt;-showcerts&lt;/code&gt; displays the certificates sent by the server, rather than a verified path. Retain the verification result as well as the received leaf. This probe does not request online revocation checks or implement every browser policy. &lt;a href="https://docs.openssl.org/3.5/man1/openssl-s_client/" rel="noopener noreferrer"&gt;OpenSSL s_client&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduce failures at the boundary you want to test
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Evidence required&lt;/th&gt;
&lt;th&gt;Acceptable operational response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Disk changes while the process still serves the old leaf&lt;/td&gt;
&lt;td&gt;Different saved and served fingerprints&lt;/td&gt;
&lt;td&gt;Identify the loading or deployment step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration validation fails&lt;/td&gt;
&lt;td&gt;Nonzero check result and diagnostics&lt;/td&gt;
&lt;td&gt;Keep the known configuration and fix the error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One endpoint remains old&lt;/td&gt;
&lt;td&gt;Endpoint-specific observations&lt;/td&gt;
&lt;td&gt;Repair that target; do not request another certificate by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong SNI selects a default server&lt;/td&gt;
&lt;td&gt;Received leaf and requested name&lt;/td&gt;
&lt;td&gt;Correct the probe or virtual-host configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target cannot be reached&lt;/td&gt;
&lt;td&gt;Connection failure and observation scope&lt;/td&gt;
&lt;td&gt;Mark coverage incomplete rather than comparing an empty fingerprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate matches but verification fails&lt;/td&gt;
&lt;td&gt;Matching identity plus failed name/trust/time result&lt;/td&gt;
&lt;td&gt;Investigate the failed verification condition&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Test notification delivery and escalation separately. Having an error in a log does not prove the intended owner received it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A measured local example
&lt;/h2&gt;

&lt;p&gt;On October 2, 2026, we used Windows, NGINX 1.28.0 and OpenSSL 3.5.4 with a locally generated root, intermediate and leaf certificates. All connections went to loopback. We disabled NGINX SSL object inheritance explicitly for this fixture, so the reload test did not depend on cached file metadata.&lt;/p&gt;

&lt;p&gt;We observed four deployment checks: replacing the certificate on disk left the old leaf in new TLS connections; a configuration pointing to a missing certificate failed validation; the corrected reload command returned zero; subsequent strictly verified connections received the new leaf fingerprint. The final observation was required even after the reload command succeeded.&lt;/p&gt;

&lt;p&gt;The fixture did not issue a certificate through ACME, test production privileges, restart the OS, send alerts, or exercise a commercial load balancer. The scope is loading and observing a local TLS certificate.&lt;/p&gt;

&lt;p&gt;For a more extensive worked example, PKI Channel, which we operate, has an &lt;a href="https://pki-channel.com/ja/articles/acme-nginx-verified-lab?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=owned_media&amp;amp;utm_content=own-b013-1"&gt;NGINX and ACME lab with commands and recorded results (Japanese; local test CA)&lt;/a&gt;. That material also states the conditions still needed before applying the workflow to a public environment.&lt;/p&gt;

&lt;p&gt;Use the worksheet to define what you must observe next. Rotation is complete for the scope you tested when the expected certificate is being served, the intended client verification succeeds, and any unobserved targets have an explicit owner and follow-up decision.&lt;/p&gt;




&lt;p&gt;AI was used for source review and drafting. The local experiments above are limited to the stated versions and conditions.&lt;/p&gt;

</description>
      <category>tls</category>
      <category>devops</category>
      <category>security</category>
      <category>sre</category>
    </item>
    <item>
      <title>Build a PQC migration inventory that separates key exchange from certificate signatures</title>
      <dc:creator>PKI security</dc:creator>
      <pubDate>Mon, 21 Sep 2026 05:58:59 +0000</pubDate>
      <link>https://dev.to/pki-channnel/build-a-pqc-migration-inventory-that-separates-key-exchange-from-certificate-signatures-205j</link>
      <guid>https://dev.to/pki-channnel/build-a-pqc-migration-inventory-that-separates-key-exchange-from-certificate-signatures-205j</guid>
      <description>&lt;p&gt;A TLS service can negotiate a post-quantum hybrid key agreement while still authenticating with a traditional certificate chain. A single &lt;code&gt;pqc_ready: true&lt;/code&gt; field cannot describe that state usefully.&lt;/p&gt;

&lt;p&gt;Instead, give each connection two linked workstreams: &lt;strong&gt;key establishment&lt;/strong&gt; and &lt;strong&gt;authentication&lt;/strong&gt;. Then record what is specified, what the products support, what your tests observed, and what your trust policy accepts. Those are different kinds of evidence.&lt;/p&gt;

&lt;p&gt;This article proposes an inventory you can take to a platform review. The sample service and all sample results below are fictional; this is a planning template, not a deployment or benchmark report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one connection, not one application
&lt;/h2&gt;

&lt;p&gt;Consider a browser connecting to an edge gateway, which then opens another TLS connection to an origin API. The gateway-to-origin connection needs its own row. Success on the browser-facing connection does not establish anything about the second connection.&lt;/p&gt;

&lt;p&gt;Use a connection ID that joins the inventory to an owner, a change record, and a test report. Add the relying-party population explicitly: “supported desktop browsers” and “partner Java clients” are different acceptance scopes. If you use mutual TLS, inventory client authentication as well as server authentication.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What to record&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;connection_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client population, TLS terminator, destination, environment&lt;/td&gt;
&lt;td&gt;Prevents evidence from one hop being reused for another&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protection_need&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Data class, required confidentiality period, applicable obligations&lt;/td&gt;
&lt;td&gt;Helps prioritize the migration without inventing a universal deadline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;key_establishment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Protocol, offered groups, observed negotiated group, fallback policy&lt;/td&gt;
&lt;td&gt;Separates an enabled option from an observed connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;authentication&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Leaf public-key algorithm, handshake signature, issuer signatures across the chain&lt;/td&gt;
&lt;td&gt;A certificate’s subject key and its issuer’s signature are different dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;implementation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client/server/library versions, build options, provider or HSM dependencies&lt;/td&gt;
&lt;td&gt;Makes the claim reproducible and bounded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trust_policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CA, trust-store owners, relying-party requirements, approval evidence&lt;/td&gt;
&lt;td&gt;Cryptographic support alone does not establish acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;evidence&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Test ID, date, versions, configuration, path, observations, limitations&lt;/td&gt;
&lt;td&gt;Connects each result to the environment actually tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;change_control&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Owner, rollback condition, exception expiry, retirement condition&lt;/td&gt;
&lt;td&gt;Gives unresolved work a destination&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Store references to secret-management records, not private keys or access tokens, in this inventory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep standards evidence separate from deployment evidence
&lt;/h2&gt;

&lt;p&gt;As checked on &lt;strong&gt;21 September 2026&lt;/strong&gt;, these documents describe different layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Primary source&lt;/th&gt;
&lt;th&gt;What it supports&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Key encapsulation algorithm&lt;/td&gt;
&lt;td&gt;&lt;a href="https://csrc.nist.gov/pubs/fips/203/final" rel="noopener noreferrer"&gt;NIST FIPS 203&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Specifies ML-KEM; this is not a signature algorithm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digital signature algorithm&lt;/td&gt;
&lt;td&gt;&lt;a href="https://csrc.nist.gov/pubs/fips/204/final" rel="noopener noreferrer"&gt;NIST FIPS 204&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Specifies ML-DSA for generating and verifying signatures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS hybrid key agreement&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc10024.html" rel="noopener noreferrer"&gt;RFC 10024&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Defines X25519MLKEM768, SecP256r1MLKEM768 and SecP384r1MLKEM1024 for TLS 1.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X.509 representation&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9881.html" rel="noopener noreferrer"&gt;RFC 9881&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Specifies identifiers and conventions for ML-DSA public keys and signatures in certificates and CRLs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;RFC 10024 was published in August 2026. An old inventory that still calls this particular specification an Internet-Draft needs a version update. That update does &lt;strong&gt;not&lt;/strong&gt; prove that an installed TLS stack supports it.&lt;/p&gt;

&lt;p&gt;Likewise, RFC 9881 is not evidence that your issuing CA, browsers, trust stores, or operational tooling will accept a proposed certificate profile. Record each dependency against its own current documentation and actual tests. Include current errata when reviewing the standards; the NIST landing pages link to potential updates.&lt;/p&gt;

&lt;p&gt;The inventory below is an engineering proposal. It is not a schema mandated by those standards. It follows the broader goal of changing cryptography while preserving security and service continuity described in &lt;a href="https://csrc.nist.gov/pubs/cswp/39/upd1/considerations-for-achieving-crypto-agility/final" rel="noopener noreferrer"&gt;NIST CSWP 39upd1 on crypto agility&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use evidence states instead of a readiness checkbox
&lt;/h2&gt;

&lt;p&gt;For each workstream, maintain separate fields for specification, implementation, lab evidence, and production evidence. Use explicit states such as &lt;code&gt;unknown&lt;/code&gt;, &lt;code&gt;documented&lt;/code&gt;, &lt;code&gt;tested_pass&lt;/code&gt;, &lt;code&gt;tested_fail&lt;/code&gt;, and &lt;code&gt;not_applicable_with_reason&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Do not collapse them into an ordered score. A published specification and an unsupported client can coexist. A lab pass and a production failure can coexist. An empty field means unknown, never success.&lt;/p&gt;

&lt;p&gt;Here is a deliberately incomplete &lt;strong&gt;fictional&lt;/strong&gt; inventory record for a private API pilot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"example_only"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"connection_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"partner-client-to-private-api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"planned_lab"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example-platform-team"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"key_establishment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"protocol_target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TLS 1.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"group_target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X25519MLKEM768"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"specification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RFC 10024"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"implementation_support"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"observed_group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lab_evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_tested"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"production_evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_tested"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authentication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"current_leaf_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"current_handshake_signature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"current_chain_signatures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"migration_target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_selected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ca_support"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"trust_policy_acceptance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lab_evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_tested"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"production_evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_tested"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence_refs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fallback_policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"requires_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rollback_trigger"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"requires_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Identify both TLS implementations and the relying parties"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice what is missing: an assertion that the API is quantum-safe. Selecting a target group is a planning decision. It produces no measured compatibility or security result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the two workstreams different acceptance gates
&lt;/h2&gt;

&lt;p&gt;For &lt;strong&gt;key establishment&lt;/strong&gt;, propose a test matrix that includes supported and unsupported peers, the real network path, full handshakes and resumption, and the expected behavior when the target group cannot be used. Capture the negotiated group for the applicable handshake type, errors, and fallback decisions. Do not infer a fresh hybrid exchange from a resumed session without checking how that session established its keys. TLS 1.3 separates key exchange from authentication and permits different resumption modes; see &lt;a href="https://www.rfc-editor.org/rfc/rfc8446.html#section-2" rel="noopener noreferrer"&gt;RFC 8446, sections 2 and 4.2.9&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Measure handshake traffic, latency and resource usage against an explicitly defined baseline. Record sample size and conditions. Choose thresholds with the service owner; this article supplies no measured values or universal performance budget.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;authentication&lt;/strong&gt;, identify the leaf key, handshake signature and each certificate-chain signature separately. Test the proposed profile through issuance, delivery, path validation, renewal and the applicable revocation checks. Include every relying-party class in scope. For mutual TLS, repeat this for client certificates and server-side validation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;State you may record&lt;/th&gt;
&lt;th&gt;Claim it does not establish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A hybrid group is documented by the vendor&lt;/td&gt;
&lt;td&gt;Implementation support is documented for the named version&lt;/td&gt;
&lt;td&gt;Your deployed configuration negotiated that group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A lab handshake negotiated the target group&lt;/td&gt;
&lt;td&gt;That test passed on that path and version&lt;/td&gt;
&lt;td&gt;Certificate authentication migrated to PQ signatures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A private lab accepts an ML-DSA certificate chain&lt;/td&gt;
&lt;td&gt;That validation test passed under that trust configuration&lt;/td&gt;
&lt;td&gt;Public browsers or external partners accept it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A fallback connection succeeds&lt;/td&gt;
&lt;td&gt;Availability behavior matched the test expectation&lt;/td&gt;
&lt;td&gt;The fallback retained the target PQ property&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fallback and rollback deserve a recorded security consequence. A recovery path that restores service using traditional key establishment may be operationally useful, but it must remain visible as an exception to the target protection policy. Assign an owner, an expiry or review date, and a condition for removing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make evidence expire when its assumptions change
&lt;/h2&gt;

&lt;p&gt;A useful evidence reference points to a specific report with versions, configurations, client population, path, timestamp and limitations. Reopen affected acceptance gates when any of those assumptions changes. Examples include a TLS-inspection appliance added to the route, a library upgrade, or a new trust-store population.&lt;/p&gt;

&lt;p&gt;Retirement is another gate. “The new group is available” is different from “the old mode is no longer used within the stated scope.” Keep a residual-use inventory and time-bounded exceptions before closing the migration item.&lt;/p&gt;

&lt;p&gt;For the wider sequence from inventory through testing and retirement, our &lt;strong&gt;&lt;a href="https://pki-channel.com/ja/articles/pqc-migration?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=owned_media&amp;amp;utm_content=own-b004-1"&gt;PKI Channel migration roadmap (Japanese)&lt;/a&gt;&lt;/strong&gt; includes a stage diagram and completion criteria. It complements the connection-level worksheet here. PKI Channel is operated by the author account.&lt;/p&gt;

&lt;p&gt;Start your next review with one connection and two questions: &lt;strong&gt;what was actually observed for key establishment, and what was actually accepted for authentication?&lt;/strong&gt; If either answer has no bounded evidence, record the gap and its next owner.&lt;/p&gt;




&lt;p&gt;AI disclosure: This draft was researched and written by an AI agent under the publisher’s direction. The inventory and fictional example are proposals, not reports of tests we performed. Primary references were checked on 21 September 2026. Independent human technical review is pending.&lt;/p&gt;

</description>
      <category>security</category>
      <category>tls</category>
      <category>cryptography</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
