<?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>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" rel="noopener noreferrer"&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>
