{"id":17286,"date":"2026-08-17T16:49:12","date_gmt":"2026-08-17T16:49:12","guid":{"rendered":"https:\/\/dmsretail.com\/RetailNews\/the-great-certificate-size-explosion-ipsec-series-part-7\/"},"modified":"2026-08-17T16:49:12","modified_gmt":"2026-08-17T16:49:12","slug":"the-great-certificate-size-explosion-ipsec-series-part-7","status":"publish","type":"post","link":"https:\/\/dmsretail.com\/RetailNews\/the-great-certificate-size-explosion-ipsec-series-part-7\/","title":{"rendered":"The Great Certificate Size Explosion &#8211; IPsec Series, Part 7"},"content":{"rendered":"<p> <p><a href=\"https:\/\/dmsretail.com\/online-workshops-list\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-496\" src=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png\" alt=\"Retail Online Training\" width=\"729\" height=\"91\" srcset=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png 729w, https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90-300x37.png 300w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/a><\/p><br \/>\n<\/p>\n<div>\n<p class=\"code-line\" dir=\"auto\" data-line=\"6\">In Part 6 we met the post-quantum signatures and learned\u00a0<em>why<\/em>\u00a0authentication has a sneakier quantum deadline than key exchange. Now let\u2019s get tactile. We\u2019re going to generate real post-quantum keys and certificates with our own hands, line them up next to the classics, and\u00a0<strong>weigh them<\/strong>. The size story is the single most important thing to internalise about post-quantum authentication, and the best part is you measure it yourself with nothing fancier than\u00a0<code>ls<\/code>. Everything runs in a throwaway <code>alpine<\/code>\u00a0container with OpenSSL, so all you need is Docker.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"10\"\/>\n<p class=\"code-line\" dir=\"auto\" data-line=\"14\"><strong>OpenSSL<\/strong>\u00a0is the first mainstream OpenSSL with\u00a0<strong>native<\/strong> support for all three NIST PQC algorithms (ML-KEM, ML-DSA, and SLH-DSA) built right in. No external plugins, no patches, no extra add-ons to install. If you\u2019ve got 3.5 or newer, you generate post-quantum keys and certificates with plain, ordinary OpenSSL commands, the same kind you\u2019d use for any classical key (check your version with <code>openssl version<\/code>).<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"14\"><strong>Wait, if OpenSSL does ML-KEM, why did we use strongSwan for the key exchange?<\/strong>\u00a0Fair question. OpenSSL is a crypto\u00a0<em>library<\/em>, not a VPN; its PQC support is wired into\u00a0<strong>TLS and certificates<\/strong>, not IKEv2. So OpenSSL is perfect for\u00a0<em>making and inspecting<\/em>\u00a0the keys and certificates here, but it can\u2019t run an IKEv2 handshake. That\u2019s why anything happening on the actual VPN wire (the key exchange in Parts 4\u20135, and the authentication coming up in Part 8) is strongSwan\u2019s job. Two tools, two jobs.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"18\">A tiny throwaway container gives us a clean 3.5+ environment in seconds:<\/p>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"20\">docker run --<span class=\"hljs-built_in\">rm<\/span> -it alpine:3.22 sh&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"24\">Then inside you install openssl:<\/p>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"26\">apk add --no-cache openssl&#13;\nopenssl version          &#13;\n<span class=\"hljs-built_in\">mkdir<\/span> -p \/pqauth &amp;&amp; <span class=\"hljs-built_in\">cd<\/span> \/pqauth&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"32\">All commands below run in that same shell.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"34\"\/>\n<h2 id=\"step-1-confirm-the-pqc-algorithms-are-really-there\" class=\"code-line\" dir=\"auto\" data-line=\"36\">Step 1: Confirm the PQC algorithms are there<\/h2>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"38\">openssl list -signature-algorithms | grep -iE <span class=\"hljs-string\">\"ml-dsa|slh-dsa|ed25519\"<\/span>&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"42\">You\u2019ll see the ML-DSA and SLH-DSA families listed, for example:<\/p>\n<pre><code class=\"code-line\" dir=\"auto\" data-line=\"44\">{ 1.3.101.112, ED25519 } @ default&#13;\n{ 2.16.840.1.101.3.4.3.18, id-ml-dsa-65, ML-DSA-65, MLDSA65 } @ default&#13;\n{ 2.16.840.1.101.3.4.3.20, id-slh-dsa-sha2-128s, SLH-DSA-SHA2-128s } @ default&#13;\n...&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"51\">There they are: straight from OpenSSL\u2019s default provider, no plugins required.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"53\"\/>\n<h2 id=\"step-2-mint-a-self-signed-cert-for-the-whole-line-up\" class=\"code-line\" dir=\"auto\" data-line=\"55\">Step 2: Mint a self-signed cert<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"57\">We\u2019ll generate a key\u00a0<em>and<\/em>\u00a0a self-signed certificate for eight algorithms in one loop. Quick note on the yardstick: a\u00a0<strong>self-signed certificate<\/strong>\u00a0(subject = issuer, signed with its own key) is the cleanest possible comparison: it bundles exactly one public key and one signature with no external CA, so the size reflects\u00a0<em>only<\/em>\u00a0the algorithm\u2019s footprint. We also output\u00a0<strong>DER<\/strong>\u00a0(the compact binary encoding that actually travels on the wire), not the base64 PEM text you usually see.<\/p>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"59\">algs=<span class=\"hljs-string\">\"ED25519:ed25519 EC:ecp256 RSA:rsa3072 ML-DSA-44:mldsa44 ML-DSA-65:mldsa65 ML-DSA-87:mldsa87 SLH-DSA-SHA2-128s:slh128s SLH-DSA-SHA2-128f:slh128f\"<\/span>&#13;\n&#13;\n<span class=\"hljs-keyword\">for<\/span> entry <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-variable\">$algs<\/span>; <span class=\"hljs-keyword\">do<\/span>&#13;\n    alg=<span class=\"hljs-variable\">${entry%%:*}<\/span>; name=<span class=\"hljs-variable\">${entry##*:}<\/span>&#13;\n    <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$alg<\/span>\"<\/span> <span class=\"hljs-keyword\">in<\/span>&#13;\n        RSA) openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$name<\/span>.key\"<\/span> ;;&#13;\n        EC)  openssl genpkey -algorithm EC  -pkeyopt ec_paramgen_curve:P-256 -out <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$name<\/span>.key\"<\/span> ;;&#13;\n        *)   openssl genpkey -algorithm <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$alg<\/span>\"<\/span> -out <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$name<\/span>.key\"<\/span> ;;&#13;\n    <span class=\"hljs-keyword\">esac<\/span>&#13;\n    openssl req -x509 -new -key <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$name<\/span>.key\"<\/span> -out <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$name<\/span>.crt\"<\/span> -days 365 -subj <span class=\"hljs-string\">\"\/CN=<span class=\"hljs-variable\">$name<\/span>-peer\"<\/span> -outform DER&#13;\n<span class=\"hljs-keyword\">done<\/span>&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"73\">Notice that for the post-quantum algorithms, generating a key uses the\u00a0<em>exact same one-liner<\/em> as a classical one; only the algorithm name changes. That\u2019s the beauty of OpenSSL 3.5: post-quantum isn\u2019t a separate, special workflow, it\u2019s just another algorithm you pass to the same command.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"75\"\/>\n<h2 id=\"step-3-the-payoff-weigh-them\" class=\"code-line\" dir=\"auto\" data-line=\"77\">Step 3: Weigh them<\/h2>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"79\"><span class=\"hljs-built_in\">ls<\/span> -la *.crt | awk <span class=\"hljs-string\">'{print $5\"  \"$9}'<\/span> | <span class=\"hljs-built_in\">sort<\/span> -n&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"83\">Brace yourself:<\/p>\n<pre><code class=\"code-line\" dir=\"auto\" data-line=\"85\">326    ed25519.crt&#13;\n389    ecp256.crt&#13;\n1043   rsa3072.crt&#13;\n3987   mldsa44.crt&#13;\n5516   mldsa65.crt&#13;\n7474   mldsa87.crt&#13;\n8139   slh128s.crt&#13;\n17371  slh128f.crt&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"96\">Look at that jump! Let\u2019s put it in plain terms with the underlying numbers:<\/p>\n<table class=\"code-line\" dir=\"auto\" data-line=\"98\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"98\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"98\">\n<th>Algorithm<\/th>\n<th>Security<\/th>\n<th>Public key<\/th>\n<th>Signature<\/th>\n<th>Cert (DER)<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"100\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"100\">\n<td>Ed25519<\/td>\n<td>~128-bit<\/td>\n<td>32 B<\/td>\n<td>64 B<\/td>\n<td>326 B<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"101\">\n<td>ECDSA P-256<\/td>\n<td>~128-bit<\/td>\n<td>65 B<\/td>\n<td>~70 B<\/td>\n<td>389 B<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"102\">\n<td>RSA-3072<\/td>\n<td>~128-bit<\/td>\n<td>384 B<\/td>\n<td>384 B<\/td>\n<td>1043 B<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"103\">\n<td><strong>ML-DSA-44<\/strong><\/td>\n<td>NIST L2<\/td>\n<td>1312 B<\/td>\n<td>2420 B<\/td>\n<td>3987 B<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"104\">\n<td><strong>ML-DSA-65<\/strong><\/td>\n<td>NIST L3<\/td>\n<td>1952 B<\/td>\n<td>3309 B<\/td>\n<td>5516 B<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"105\">\n<td><strong>ML-DSA-87<\/strong><\/td>\n<td>NIST L5<\/td>\n<td>2592 B<\/td>\n<td>4627 B<\/td>\n<td>7474 B<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"106\">\n<td>SLH-DSA-128s<\/td>\n<td>NIST L1<\/td>\n<td>32 B<\/td>\n<td>7856 B<\/td>\n<td>8139 B<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"107\">\n<td>SLH-DSA-128f<\/td>\n<td>NIST L1<\/td>\n<td>32 B<\/td>\n<td>17088 B<\/td>\n<td>17371 B<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"code-line\" dir=\"auto\" data-line=\"109\">An Ed25519 certificate is just\u00a0<strong>326 bytes<\/strong>. The equivalent ML-DSA-65 cert is\u00a0<strong>5516 bytes<\/strong>, roughly\u00a0<strong>17\u00d7 larger<\/strong>. And SLH-DSA-128f? Its signature\u00a0<em>alone<\/em>\u00a0is\u00a0<strong>17088 bytes<\/strong>, bigger than many entire web pages. Notice SLH-DSA\u2019s quirk too: a tiny 32-byte public key, but a gigantic signature.\u00a0<em>Whoa.<\/em><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"109\"><strong>Wait, why isn\u2019t the cert just key + signature?<\/strong>\u00a0Good catch. For ML-DSA-65, key (1952 B) + signature (3309 B) = 5261 B, yet the cert is 5516 B, about 255 B more. A certificate isn\u2019t a simple concatenation; it\u2019s a structured X.509 document embedding the key and signature alongside metadata (version, serial, validity dates, issuer\/subject names, algorithm OIDs, a few extensions, plus ASN.1\/DER framing on every field). That overhead is roughly\u00a0<em>fixed<\/em>\u00a0(~230\u2013260 B) regardless of algorithm, which is why it dominates a tiny Ed25519 cert but barely registers on a chunky ML-DSA one.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"113\"\/>\n<h2 id=\"why-this-size-story-matters-so-much\" class=\"code-line\" dir=\"auto\" data-line=\"115\">Why size matters<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"117\">Handshakes don\u2019t carry one cert; they carry\u00a0<strong>certificate chains\u00a0<em>plus<\/em>\u00a0a handshake signature<\/strong>. Swap a 3-cert ECDSA chain (~1.2 KB total) for an ML-DSA-65 chain and you\u2019re suddenly shipping\u00a0<strong>15\u201320 KB<\/strong>\u00a0in the handshake. In IKEv2 that means the\u00a0<code>IKE_AUTH<\/code>\u00a0exchange balloons and leans hard on\u00a0<strong>fragmentation<\/strong>: the same pressure ML-KEM put on\u00a0<code>IKE_INTERMEDIATE<\/code>\u00a0back in the key-exchange pillar, but now on the authentication leg.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"119\">And \u201cleaning hard on fragmentation\u201d isn\u2019t just a minor detail. Fragmentation was designed as an occasional fallback for the rare oversized message; post-quantum flips that so\u00a0<em>almost every<\/em>\u00a0handshake is large and fragmented. That brings real costs:<\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"121\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"121\"><strong>Packet loss hurts more.<\/strong>\u00a0An N-fragment message reassembles only if\u00a0<em>all N<\/em>\u00a0arrive; lose one and the whole thing retransmits. On lossy links, big PQC handshakes retransmit more and latency spikes.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"122\"><strong>Middleboxes are hostile to fragments.<\/strong>\u00a0Firewalls, NATs, and load balancers routinely drop or mishandle fragmented UDP, producing handshakes that fail in really hard-to-debug ways.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"123\"><strong>Bigger pre-auth attack surface.<\/strong>\u00a0These bytes fly\u00a0<em>before<\/em>\u00a0the peer has proven who it is, so a responder must buffer and reassemble fragments from a not-yet-authenticated initiator: extra state an attacker can try to overload.<\/li>\n<\/ul>\n<p class=\"code-line\" dir=\"auto\" data-line=\"125\">None of this\u00a0<em>breaks<\/em>\u00a0PQC auth (strongSwan handles it), but it\u2019s why \u201cthe certs got bigger\u201d turns into round trips, retransmits, and middlebox trouble at scale. We\u2019ll watch exactly this happen on the wire in Part 8.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"127\"\/>\n<h2 id=\"step-4-speed-are-they-slow\" class=\"code-line\" dir=\"auto\" data-line=\"129\">Step 4: Are they slow?<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"131\">A common worry, so before we sign anything ourselves (we\u2019ll do that in Step 5), here\u2019s what to expect per signature:<\/p>\n<table class=\"code-line\" dir=\"auto\" data-line=\"133\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"133\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"133\">\n<th>Algorithm<\/th>\n<th>Signing<\/th>\n<th>Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"135\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"135\">\n<td>Ed25519 \/ ECDSA<\/td>\n<td>~instant<\/td>\n<td>so fast the timing is dominated by just launching the command<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"136\">\n<td>ML-DSA-44\/65\/87<\/td>\n<td>~instant<\/td>\n<td>sits right alongside the classics<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"137\">\n<td>SLH-DSA-128f<\/td>\n<td>a few ms<\/td>\n<td>noticeably heavier<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"138\">\n<td>SLH-DSA-128s<\/td>\n<td>~100+ ms<\/td>\n<td>dramatically slower to sign<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"code-line\" dir=\"auto\" data-line=\"140\">The takeaway:\u00a0<strong>ML-DSA signs and verifies right alongside Ed25519 and ECDSA<\/strong>, while\u00a0<strong>SLH-DSA\u2019s\u00a0<code>s<\/code>\u00a0(\u201csmall\u201d) variants are hugely slower.<\/strong>\u00a0That slowness is\u00a0<em>exactly<\/em>\u00a0why SLH-DSA is reserved for things you sign rarely (a root CA signs a handful of certs a year, so who cares if each takes 100 ms?) rather than a busy TLS terminator doing thousands of handshakes a second. You\u2019ll feel that difference for yourself with the\u00a0<code>time<\/code>\u00a0command in Step 5.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"142\"\/>\n<h2 id=\"step-5-sign-verify-and-tamper\" class=\"code-line\" dir=\"auto\" data-line=\"144\">Step 5: Sign, verify, tamper<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"146\">Certificates are about\u00a0<em>trust<\/em>, and trust comes from signatures that can\u2019t be forged. Let\u2019s prove it.<\/p>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"148\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"transfer 1000 to tom\"<\/span> &gt; msg.txt&#13;\nopenssl pkeyutl -sign -inkey mldsa65.key -rawin -<span class=\"hljs-keyword\">in<\/span> msg.txt -out msg.sig&#13;\n<span class=\"hljs-built_in\">wc<\/span> -c &lt; msg.sig          &#13;\n&#13;\n&#13;\nopenssl pkey -<span class=\"hljs-keyword\">in<\/span> mldsa65.key -pubout -out mldsa65.pub&#13;\nopenssl pkeyutl -verify -pubin -inkey mldsa65.pub -rawin -<span class=\"hljs-keyword\">in<\/span> msg.txt -sigfile msg.sig&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"158\">You should see\u00a0<code>Signature Verified Successfully<\/code>. Note the clean split: signing used the\u00a0<strong>private<\/strong>\u00a0key, verifying used\u00a0<em>only<\/em>\u00a0the\u00a0<strong>public<\/strong>\u00a0key. That\u2019s the whole point of public-key signatures: signing is private, verifying is public.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"160\">Now tamper with the message and watch it fail:<\/p>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"162\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"transfer 1000 to mallory\"<\/span> &gt; msg.txt&#13;\nopenssl pkeyutl -verify -pubin -inkey mldsa65.pub -rawin -<span class=\"hljs-keyword\">in<\/span> msg.txt -sigfile msg.sig&#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"167\"><code>Signature Verification Failure<\/code>. Change a single byte and the post-quantum signature rejects it: exactly the unforgeable integrity guarantee we depend on, now resting on lattice math instead of elliptic curves.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"169\">Want to\u00a0<em>feel<\/em>\u00a0the SLH-DSA difference? Time it:<\/p>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"171\">time openssl pkeyutl -sign -inkey slh128s.key -rawin -<span class=\"hljs-keyword\">in<\/span> msg.txt -out slh.sig&#13;\n<span class=\"hljs-built_in\">wc<\/span> -c &lt; slh.sig          &#13;\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"176\">Noticeably slower, and the signature more than twice the ML-DSA size. That\u2019s the hash-based trade-off in action: ultra-cautious security, but you\u2019d never want it on a high-volume handshake.<\/p>\n<hr class=\"code-line\" dir=\"auto\" data-line=\"184\"\/>\n<h2 id=\"what-we-just-did\" class=\"code-line\" dir=\"auto\" data-line=\"186\">What we just did<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"188\">You generated post-quantum certificates, measured the size hit with your own hands, watched ML-DSA and SLH-DSA sign and verify (and reject a forgery), and felt the SLH-DSA speed penalty. The \u201ccerts get bigger\u201d story is no longer something you read; it\u2019s something you weighed.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"190\">But certificates sitting in a folder are only half the fun. In\u00a0<strong>Part 8<\/strong>\u00a0we hand these certs to strongSwan and use them to mutually authenticate a\u00a0<em>real<\/em>\u00a0IKEv2 VPN tunnel: classical ECDSA first, then bleeding-edge post-quantum ML-DSA. We\u2019ll watch the handshake balloon and fragment exactly as predicted, and stand right at the bleeding edge where this stuff is still being built. See you there!<\/p>\n<\/p><\/div>\n<p><p><a href=\"https:\/\/dmsretail.com\/online-workshops-list\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-496\" src=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png\" alt=\"Retail Online Training\" width=\"729\" height=\"91\" srcset=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png 729w, https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90-300x37.png 300w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/a><\/p><br \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Part 6 we met the post-quantum signatures and learned\u00a0why\u00a0authentication has a sneakier quantum deadline than key exchange. Now let\u2019s get tactile. We\u2019re going to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":17287,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-17286","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/posts\/17286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/comments?post=17286"}],"version-history":[{"count":0,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/posts\/17286\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/media\/17287"}],"wp:attachment":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/media?parent=17286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/categories?post=17286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/tags?post=17286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}