<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Alex Olsson on Medium]]></title>
        <description><![CDATA[Stories by Alex Olsson on Medium]]></description>
        <link>https://medium.com/@node42-dev?source=rss-29bb0d606532------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dHeqMbw_7QV4fei5PBlp2g.png</url>
            <title>Stories by Alex Olsson on Medium</title>
            <link>https://medium.com/@node42-dev?source=rss-29bb0d606532------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 14:11:54 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@node42-dev/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Peppol From a Raspberry Pi: The Access Point Is Becoming Just Another Node]]></title>
            <link>https://medium.com/@node42-dev/peppol-from-a-raspberry-pi-the-access-point-is-becoming-just-another-node-c06764294380?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/c06764294380</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[peppol]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Thu, 11 Jun 2026 06:31:00 GMT</pubDate>
            <atom:updated>2026-06-11T06:31:00.841Z</atom:updated>
            <content:encoded><![CDATA[<p>A few years ago, the phrase “Peppol Access Point” sounded like something that belonged inside a government procurement department, an enterprise integration team, or a vendor presentation full of architecture diagrams.</p><p>A few months ago, I made a Peppol transaction from a Raspberry Pi 5.</p><ul><li>Not a cloud cluster.</li><li>Not a bank-grade mainframe.</li><li>Not some sacred enterprise appliance hidden behind five layers of consulting.</li></ul><blockquote>A Raspberry Pi.</blockquote><p>And that small fact says something much bigger about where Peppol is heading.</p><p>Peppol has long been treated as infrastructure — important infrastructure, yes, but still infrastructure: regulated, certified, controlled, and often wrapped in vendor-heavy language. For many companies, Peppol has not felt like a network they participate in. It has felt like a service they buy access to.</p><p>But when small, cheap, edge-level hardware can initiate real Peppol traffic, the mental model starts to change. Peppol stops looking like a destination and starts looking like a protocol layer — and this is where things get interesting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BIBi5jyw7K6DMLi1tiKiOQ.png" /></figure><h3>The Access Point Is Becoming Less Magical</h3><p>The original Access Point model made perfect sense. Businesses needed secure, standardized document exchange. Governments needed compliance. Vendors needed predictable rules. Peppol provided the rails.</p><p>But every infrastructure layer eventually goes through the same transformation.</p><ul><li>First, it is specialized.</li><li>Then, it is standardized.</li><li>Then, it is automated.</li><li>Then, it becomes boring.</li></ul><p>And “boring” is not an insult — boring infrastructure is successful infrastructure.</p><p>Nobody is impressed that a web server can send an HTTPS request anymore. Nobody builds a business case around the fact that their system can send email. Nobody says, “We are strategically positioned because we can resolve DNS.”</p><blockquote>Today, being able to send and receive Peppol documents is still treated as a product feature. Soon, it may simply be expected behavior.</blockquote><h3>More Nodes, Less Gatekeeping</h3><p>As more open-source libraries, lightweight nodes, containerized deployments, cloud-native Access Points, and embedded integrations appear, Peppol becomes less dependent on a small number of large vendors controlling the experience.</p><p>This does not mean governance disappears. Peppol still needs trust, certificates, authorities, conformance, service metadata, and rules. Without that, it becomes just another fragmented document transport mess.</p><p>But the technical implementation layer is becoming more accessible and that changes the balance of power.</p><p>Software vendors can embed Peppol directly into their platforms. ERP systems can run closer to the network. National implementations can become more automated. Small service providers can build focused products instead of massive monoliths. Developers can test, simulate, and validate flows locally before touching production.</p><blockquote>The Access Point becomes less of a fortress, it becomes a node.</blockquote><h3>What happens when Peppol itself becomes a means to an end?</h3><p>For years, “Peppol support” has been sold as if it were the product, but most customers do not actually care about Peppol.</p><ul><li>They care that invoices arrive.</li><li>They care that orders are processed.</li><li>They care that compliance is handled.</li><li>They care that their accounting system, tax reporting, procurement workflow, and business partners all stay synchronized without manual work.</li></ul><blockquote>Peppol is not the business outcome — it is the transport and governance layer that makes the outcome possible. This distinction matters. Once the network becomes normal, the real value moves upward.</blockquote><p>The winning companies will not be the ones shouting “we support Peppol” the loudest, they will be the ones that make Peppol invisible.</p><ul><li>Invisible in onboarding.</li><li>Invisible in routing.</li><li>Invisible in validation.</li><li>Invisible in error handling.</li><li>Invisible in reconciliation.</li></ul><blockquote>The real product will be automation, intelligence, compliance, observability, and trust. Peppol will be underneath it all, doing what good infrastructure does: quietly working.</blockquote><p>For example, forward-thinking providers like <a href="https://qvalia.com/">Qvalia</a> are already adding AI-powered document processing and analysis on top of the Peppol network.</p><h3>The Future Is Not One Giant Platform</h3><p>If Peppol continues to mature as a common protocol and governance framework, then its future is not one massive platform. It is thousands of interoperable nodes, each doing a specific job, all connected through shared rules.</p><ul><li>Some will run in hyperscale clouds.</li><li>Some will run in national infrastructure.</li><li>Some will run inside ERP vendors.</li><li>Some will run in containers on modest hardware.</li><li>And yes, some can run on a Raspberry Pi.</li></ul><p>To be clear, this does not mean a Raspberry Pi is the right production platform for a regulated Access Point, nor that all these nodes are equal in operational capability.</p><p>A production-grade Access Point still requires security, monitoring, certificate handling, uptime, legal agreements, and support.</p><blockquote>But it proves the architectural point, Peppol is no longer technically exotic.</blockquote><h3>The Real Competition Starts After Connectivity</h3><p>When everyone can connect, connectivity stops being the differentiator. That marks the next phase. The question will no longer be: “Can you send Peppol?” It will be…</p><ul><li>Can you onboard a customer automatically?</li><li>Can you detect routing problems before documents fail?</li><li>Can you handle country-specific rules without hardcoding chaos?</li><li>Can you explain why a document was rejected?</li><li>Can you reconcile business events across systems?</li><li>Can you turn Peppol traffic into operational intelligence?</li></ul><p>That is where the serious engineering begins. Not in wrapping Peppol in more mystery, but in removing the friction around it.</p><h3>A Raspberry Pi Is a Warning Shot</h3><p>The Raspberry Pi transaction is not a gimmick.</p><blockquote>It is a signal.</blockquote><p>It says that the future of Peppol is not locked inside expensive enterprise platforms. It says the network can become more programmable, more distributed, and more accessible. It says that the value is moving away from merely having access to the rails and toward what you build on top of them.</p><p>Peppol will still need governance. It will still need certification. It will still need trust, but the implementation layer is opening up.</p><p>And when infrastructure opens up, markets change…</p><h3>Want to Go Deeper?</h3><p>Use the links below to get more information:</p><ul><li><a href="https://peppol.org/what-is-peppol/peppol-interoperability-framework/">OpenPeppol Interoperability Framework</a></li><li><a href="https://github.com/node42-dev/node42-edelivery">Node42 eDelivery — GitHub Repo</a></li><li><a href="https://qvalia.com/features/peppol-access-point">Qvalia Access Point Solutions</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c06764294380" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Peppol’s Nervous System is Here — Is Your Integration Ready for MLS?]]></title>
            <link>https://medium.com/@node42-dev/peppols-nervous-system-is-here-is-your-integration-ready-for-mls-87df92bbe37f?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/87df92bbe37f</guid>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[peppol]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Tue, 12 May 2026 09:31:00 GMT</pubDate>
            <atom:updated>2026-05-12T09:31:00.781Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Message Level Status (MLS) represents the most important architectural upgrade to Peppol since the switch from AS2 to AS4. While the change brings much-needed transparency, it also surfaces implementation challenges that many countries and service providers are still working through.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UEr86eycKSa64IhSKwaaGw.png" /></figure><h3>The Long-Standing Visibility Gap</h3><p>For years, Peppol invoice delivery operated with limited end-to-end visibility. A sender’s Access Point (C2) would transmit a document to the receiver’s Access Point (C3). An AS4 transport acknowledgement confirmed receipt at the gateway — but what happened after that remained largely opaque.</p><ul><li>Did the document pass validation?</li><li>Was it successfully delivered to the buyer’s system (C4)?</li><li>Were there business-level issues?</li></ul><p>These questions often went unanswered in a standardized way. The earlier Message Level Response (MLR) attempted to address this but saw low adoption because it depended on end-user (C4) participation and optional capability declarations.</p><p><strong>Peppol Message Level Status (MLS) v1.0.0</strong>, finalized on May 22, 2025, introduces a standardized, provider-to-provider feedback mechanism that significantly improves this situation.</p><blockquote>For the first time, Peppol gains a standardized provider-level feedback loop that can be monitored operationally across networks and jurisdictions.</blockquote><h3>What MLS Actually Is</h3><p>MLS operates at the <strong>service provider layer</strong> (C3 → C2) and is independent of end-user involvement. It uses the new <strong>Service Provider Identification Scheme (SPIS)</strong> for addressing.</p><p>MLS makes the three operational feedback layers in Peppol more explicit:</p><ul><li><strong>Layer 1 — Protocol Status</strong>: AS4 transport acknowledgements (gateway delivery only)</li><li><strong>Layer 2 — Messaging Status: </strong>MLR (C4-scoped feedback) and MLS (C3-initiated, validation outcome and delivery to C4) both provide message-level feedback. MLS fills the gap where C4 participation was absent; it does not replace MLR where it is contractually required.</li><li><strong>Layer 3 — Business Level Response</strong>: Buyer’s commercial decision on the document (e.g. order rejection for business reasons). Separate UBL document type. Unaffected by MLS adoption.</li></ul><p>MLS is designed to be enforceable at the service provider level, making reliable feedback possible without requiring every end-user to implement additional processes.</p><h3>Technical Foundations of MLS</h3><h4>SBDH Extensions</h4><p>MLS uses two optional <strong>BusinessScope</strong> elements:</p><ul><li>MLS_TO: Specifies the recipient of the MLS (defaults to the sender’s SPID)</li><li>MLS_TYPE: Controls response behavior (FAILURE_ONLY= rejections only, ALWAYS_SEND= all outcomes)</li></ul><h4>SPIS — The New Identification Layer</h4><p>A critical prerequisite for MLS is the Service Provider Identification Scheme (SPIS). Service providers now need a formal SPID registered in the SMP with MLS capabilities.</p><h4>MLS Response States</h4><p>C3 must produce at most one terminal MLS per inbound business document with one of the following terminal states:</p><ul><li>RE — Rejected (validation failure or permanent delivery failure to C4)</li><li>AP — Accepted with positive confirmation</li><li>AB — Accepted without positive confirmation (best-effort delivery)</li></ul><p>Rejection reasons are detailed (SV, BV, etc.), while Schematron warnings alone do not trigger rejection.</p><blockquote>MLS must <strong>not</strong> be sent in response to another MLS or MLR — the protocol is intentionally non-recursive.</blockquote><h3>Implementation Challenges Across Jurisdictions</h3><p>While MLS solves a real problem, its roll-out highlights several systemic difficulties that affect multiple countries, particularly those implementing <strong>Continuous Transaction Controls (CTC)</strong> or real-time reporting models.</p><p><strong>1. SPIS and Identifier Maturity</strong> Many markets are still finalizing SPIS registration processes and SMP capability declarations. The placeholder ICD code required careful handling during early adoption phases.</p><p><strong>2. Parallel Reporting Channels (C5 Integration)</strong> In countries with tax-authority-as-C5 models, MLS only covers the invoice delivery path (C3 → C4). It does not automatically report status for parallel submissions to the tax authority. This creates the need for national extensions and careful error-handling design.</p><p><strong>3. Validation and Timeline Alignment</strong> Countries with country-specific CIUS extensions (e.g., additional rules on top of PINT or BIS) must ensure alignment between generic Peppol validation and national requirements. Tight legislative timelines can compress testing periods for MLS capability.</p><p><strong>4. Operational Handling of Validation Failures</strong><br> Validation failures remain a major operational challenge because troubleshooting and reporting are often handled manually between service providers, customers, and support teams. However, MLS introduces standardized, machine-readable feedback with detailed validation and rejection information, reducing ambiguity and improving operational visibility.</p><p><strong>Examples of Markets Navigating These Challenges</strong></p><ul><li><strong>United Arab Emirates (DCTCE model)</strong>: The UAE has adopted a 5-corner Peppol architecture with PINT AE and parallel FTA reporting. The mandatory phase for larger businesses brings ambitious timelines. Service providers must manage both Peppol MLS flows and separate FTA reporting channels, while handling non-Peppol buyers.</li><li><strong>Slovakia (ViDA implementation)</strong>: Slovakia requires MLS support in its Peppol Testbed certification for “Digitálni poštári” (Digital Postmen). The model includes parallel Tax Data Document (TDD) submission to the Financial Administration. This creates complex but clearly defined separation between MLS (delivery status) and tax reporting obligations.</li></ul><p>These two markets are among the early large-scale adopters of MLS in CTC environments, which is why their experiences are particularly instructive for the broader Peppol community.</p><h3>What Service Providers Should Prioritize</h3><p>To support MLS v1.0.0 effectively:</p><ul><li><strong>SMP Registration</strong>: Register your SPID and MLS reception capability</li><li><strong>SBDH Handling</strong>: Correctly process MLS_TO and MLS_TYPE elements (with proper fallback to Operational Guideline defaults)</li><li><strong>MLS Generation</strong>: Use reliable libraries such as Philip Helger’s peppol-commons (peppol-mls module)</li><li><strong>Operational Discipline</strong>: Implement exactly one terminal MLS per document, respect non-recursive rules, and handle C5 reporting paths separately</li><li><strong>Testing</strong>: Validate against national testbeds (especially where MLS is part of certification)</li></ul><blockquote>The <strong>MLS specification</strong> and <strong>accompanying operational guidance</strong> contain important details on timing, retries, and default behaviors that should not be overlooked.</blockquote><h3>Looking Ahead</h3><p>MLS closes a long-standing visibility gap in the Peppol network. Its success will depend on widespread SPIS adoption, full alignment with the Operational Guideline, and smooth integration with national CTC requirements.</p><p>Service providers who invest in robust MLS implementation now will be better positioned as more countries move toward mandatory structured e-invoicing and real-time reporting. The infrastructure is evolving quickly — those who treat MLS as core infrastructure rather than a checkbox will gain a clear competitive advantage.</p><h3>References</h3><p>The mechanisms described in this article are based on the official Peppol specifications. Use the links below to get more information:</p><ul><li><a href="https://docs.peppol.eu/edelivery/specs/mls/v1.0.0/mls/">Peppol MLS Specification v1.0.0</a></li><li><a href="https://docs.peppol.eu/edelivery/policies/OpenPeppol-SP-ID-Scheme%201.0.0.pdf">SPIS documentation</a></li><li><a href="https://mof.gov.ae/wp-content/uploads/2025/09/Ministerial-Decision-no.-243-of-2025-on-the-Electronic-Invoicing-System.pdf">UAE Ministerial Decisions 243/244</a></li><li><a href="https://www.e-invoice.app/guides/slovakia-e-invoicing">Slovak Law 385/2025</a></li><li><a href="https://github.com/phax/peppol-commons?tab=readme-ov-file#peppol-mls">Peppol Commons</a></li></ul><h3>Acknowledgements</h3><p>Many thanks to Anders at <a href="https://qvalia.com/">Qvalia</a> for proofreading the article and contributing valuable practical suggestions during review.</p><p><em>Anders has successfully implemented Peppol MLS and passed both testbeds, including complex 5-corner CTC setups in markets such as the UAE and Slovakia, using a Node.js-based Peppol solution.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=87df92bbe37f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Future: AI Can Now Tell You Why Your Peppol Delivery Failed]]></title>
            <link>https://medium.com/@node42-dev/the-future-ai-can-now-tell-you-why-your-peppol-delivery-failed-727af54eb216?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/727af54eb216</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[peppol]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Mon, 30 Mar 2026 12:31:00 GMT</pubDate>
            <atom:updated>2026-03-30T12:31:00.593Z</atom:updated>
            <content:encoded><![CDATA[<p>Your invoice was delivered. The AS4 receipt confirmed it. Your counterpart never received it. Everything was technically correct. Nothing worked.</p><p>This is not a hypothetical. This happens in production Peppol networks today — and often operators have no idea why.</p><p>Participant identifiers are hashed into deterministic DNS queries. DNS resolves the responsible SMP. The SMP returns signed metadata describing the receiving Access Point. TLS secures the transport. AS4 delivers the document.</p><p><em>Every layer is formally defined. Every layer is verifiable.</em></p><h4>And yet, when delivery fails, operators are left staring at:</h4><ul><li>Raw DNS records</li><li>SMP XML metadata</li><li>TLS certificate chains</li><li>HTTP status codes</li></ul><p>All technically correct — yet often of limited use for real operational debugging.</p><blockquote>Because Peppol provides transport — not <strong>interpretation.</strong> That distinction matters more than most people in the ecosystem realize.</blockquote><h3>The Real Questions Are Unanswered</h3><p>Most of today’s error resolution entails local scripts and generic tools that are good at collecting facts, but they cannot tell you what those facts mean.</p><h4>They can tell you:</h4><ul><li>Which SMP was resolved</li><li>Which endpoint was returned</li><li>Which certificate was presented</li></ul><h4>They cannot answer:</h4><ul><li>Is this configuration compliant?</li><li>Is this a transient issue or a structural misconfiguration?</li><li>Which exact layer is responsible for this delivery failure?</li></ul><p>This is the missing layer in Peppol today. Not transport. Not security. <strong>Interpretation.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*525A43C84n7hgd4mzhOXEg.png" /></figure><h3>The real story is a two-layer value proposition:</h3><h4>Layer 1 — Node42 Discovery</h4><p>The <strong>JSON</strong> and <strong>SVG</strong> outputs from Node42 already gives operators structured, actionable insight that raw Peppol tools don’t provide. This alone is a significant step forward — most operators are working with unstructured protocol artifacts.</p><h4>Layer 2: Node42 Discovery AI</h4><p>Node42 approached this problem differently. Instead of treating discovery as the final step, we treat it as the input to an AI diagnostic engine.</p><blockquote>The Node42 Discovery returns a JSON structure which is essentially a deterministic, machine-readable representation of Peppol network state.</blockquote><p>Each discovery produces a structured, timestamped record of the complete resolution chain:</p><ul><li>SML lookup</li><li>SMP metadata validation</li><li>Certificate chain verification</li><li>Endpoint connectivity</li></ul><p><strong>The structured output can be provided to an AI model for interpretation</strong> — specifically a model with access to a vector store containing the full corpus of Peppol specifications, BIS documentation, and governance publications.</p><blockquote><strong>The Node42 AI Engine then applies a reasoning layer</strong> — that translates this data into natural-language diagnostics, risk assessments, and remediation guidance.</blockquote><h3>Why This Matters?</h3><p>Peppol is a decentralized system. There is no central authority validating operational correctness in real time.</p><p>Every Access Point and SMP operator is responsible for maintaining correct configuration. Even small misconfigurations silently break interoperability — for every participant trying to reach them.</p><p>Without interpretation, these failures remain invisible. An AI intelligence layer makes them visible. And more importantly, <strong>understandable.</strong></p><h3>A Necessary Evolution</h3><p>Knowing the protocol is correct — is not enough. You need to know <strong>when correctness breaks — and why.</strong></p><h4>Peppol solved the hardest problems:</h4><ul><li>Decentralized participant discovery</li><li>Cryptographic trust infrastructure</li><li>Secure, interoperable transport</li></ul><p><strong>These were extraordinary achievements. The protocol works.</strong></p><p>But as the network scales globally — driven by real-time invoicing mandates across EU, APAC, and LATAM — operational visibility becomes equally critical.</p><h3>What We Are Building</h3><p>The <strong>Node42 AI</strong> intelligence layer transforms Peppol discovery from observation into diagnosis.</p><p>It answers not what happened — but what it means, whether delivery will succeed, and exactly what needs to change if it won’t.</p><ul><li>It is not a monitoring dashboard.</li><li>It is not an alerting tool.</li></ul><h4><strong>It is an AI interpretation engine for Peppol infrastructure state.</strong></h4><h3>Want to Go Deeper?</h3><p>Use the links below to get more information:</p><ul><li><a href="https://peppol.org/what-is-peppol/peppol-interoperability-framework/">OpenPeppol Interoperability Framework</a></li><li><a href="https://docs.peppol.eu/edelivery/smp/Peppol-EDN-Service-Metadata-Publishing-1.4.0-2025-02-06.pdf">Peppol eDelivery Network SMP Specification v1.4.0</a></li><li><a href="https://docs.peppol.eu/edelivery/sml/Peppol-EDN-Service-Metadata-Locator-1.3.0-2025-02-06.pdf">Peppol Service Metadata Locator (SML) v1.3.0</a></li><li><a href="https://docs.peppol.eu/edelivery/as4/specification/">Peppol AS4 Profile v2.0.3</a></li><li><a href="https://peppol.helger.com/public">Peppol Practical</a></li><li><a href="https://www.node42.dev/docs/discovery">Node42 Discovery API</a></li><li><a href="https://www.node42.dev/">Node42 Web UI</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=727af54eb216" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Peppol’s 4-Corner Trust Model: What Actually Enforces Trust]]></title>
            <link>https://medium.com/@node42-dev/peppols-4-corner-trust-model-what-actually-enforces-trust-167adfabd60f?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/167adfabd60f</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[peppol]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Mon, 23 Mar 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-03-23T13:31:00.730Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sEiAOzSGUMxH1fA9_cA0VA.png" /></figure><p>Peppol’s architecture is built on a deceptively simple idea: participants never connect to each other directly. Instead, messages are routed indirectly through certified intermediary Access Points. This structure — known as the <strong>Four Corner Model</strong> — is not just a network topology. It is a deliberate trust architecture.</p><blockquote>This separation is what makes Peppol scalable. It is also what makes it enforceable.</blockquote><p>Trust is not established between businesses directly — it is enforced through infrastructure: certificate hierarchies, signed metadata, SML-anchored DNS resolution, and mandatory transport rules. Every document flows through a controlled chain of accountability.</p><blockquote><em>At first glance, the Four Corner Model looks like a routing pattern.</em></blockquote><p>In reality, it is a distributed trust mechanism designed to prevent fragmentation, eliminate proprietary lock-in, and ensure that identity, capability, and transport security are validated before a single invoice is exchanged.</p><h3>Why Four Corners?</h3><ol><li><strong>Separation of concerns</strong>: C1/C4 handle business logic while C2/C3 handle transmission</li><li><strong>Outsourcing</strong>: Small companies can use hosted Access Points (C2/C3) without building infrastructure</li><li><strong>Interoperability</strong>: Any C2 can send to any C3 using the same protocol</li><li><strong>Legal complianc</strong>e: C2/C3 provide audit trails, archiving, and proof of delivery</li></ol><blockquote>The business document is encrypted by C2 (sender’s AP) and decrypted by C3 (receiver’s AP). C1 sends the plaintext document to C2, which encrypts it before transmission. C3 decrypts it and delivers plaintext to C4. <strong>The encryption protects the document in transit between Access Points, not end-to-end from C1 to C4.</strong></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8kQB7x30-WiXl2JaCwNBpA.png" /><figcaption>The Four Corner model</figcaption></figure><h3>The Trust Model</h3><p>Peppol uses certificates for three distinct purposes.</p><h4>1. TLS Certificate → Transport Identity</h4><ul><li><strong>Purpose</strong>: Secure the HTTPS connection</li><li><strong>Issuer</strong>: Any trusted CA (Let’s Encrypt, DigiCert, etc.)</li><li><strong>Validation</strong>: Standard PKI chain of trust</li><li><strong>Location</strong>: Web server configuration</li><li><strong>Lifetime</strong>: Typically 90 days (Let’s Encrypt) to several years</li><li><strong>What it proves</strong>: The server you’re talking to owns this domain</li></ul><h4>2. Signing Certificate → Message Integrity &amp; Non-Repudiation</h4><ul><li><strong>Purpose</strong>: Sign the AS4 message &lt;eb:Messaging&gt; + Payload</li><li><strong>Issuer</strong>: Peppol CA</li><li><strong>Validation</strong>: Must chain to Peppol trust anchor</li><li><strong>Location</strong>: Included in message as &lt;wsse:BinarySecurityToken&gt;</li><li><strong>Lifetime</strong>: 2 years</li><li><strong>What it proves</strong>: This message came from this specific Access Point and hasn’t been tampered with</li></ul><h4>3. Encryption Certificate → Payload Confidentiality</h4><ul><li><strong>Purpose</strong>: Encrypt the business document</li><li><strong>Issuer</strong>: Peppol CA</li><li><strong>Validation</strong>: Retrieved from SMP, must chain to Peppol trust anchor</li><li><strong>Location</strong>: Retrieved from SMP before sending; included in message for verification</li><li><strong>Lifetime</strong>: 2 years</li><li><strong>What it proves</strong>: Only the intended receiver can decrypt this payload</li></ul><h4>Same Certificate, Different Roles</h4><p>Peppol Access Points <strong>use the same X.509 certificate for both signing and encryption</strong>, but these remain logically distinct operations with separate security purposes:</p><ul><li><strong>Signing</strong>: Uses the private key to create a digital signature</li><li><strong>Encryption</strong>: Uses the recipient’s public key to encrypt the session key</li></ul><h4>The Peppol PKI Hierarchy</h4><pre>Root CA: DigiCert One Trust Lifecycle Root CA G3<br>└─ Intermediate CA: Peppol Access Point CA - G3 (Production)<br>   └─ AP Certificate: CN=POP000001, O=Your Company<br>   <br>Root CA: DigiCert One Trust Lifecycle Root CA G3<br>└─ Intermediate CA: Peppol Access Point TEST CA - G3 (Test/Sandbox)<br>   └─ Test AP Certificate: CN=POP000001, O=Your Company</pre><blockquote><strong>Production and test networks have separate CA chains. Never mix them</strong>. Your truststore must contain the correct chain for the environment.</blockquote><h4>Why This Separation Matters</h4><ul><li><strong>Security boundary clarity</strong>: Transport security (TLS) is independent from message security (WS-Security). You can send AS4 messages through proxies/load balancers that terminate TLS — the message-level security is preserved.</li><li><strong>Different lifetimes</strong>: TLS certs can be short-lived (Let’s Encrypt 90 days), Peppol certs are normally annual. You can rotate TLS certs without touching Peppol certs.</li><li><strong>Different issuers</strong>: You control your TLS cert provider. Peppol controls the message cert CA.</li><li><strong>Non-repudiation</strong>: Message signatures provide legal proof of origin. TLS doesn’t.</li></ul><h3>The Delivery You Can’t Dispute</h3><p>Peppol’s security model is designed to produce cryptographic evidence at every stage of transmission. This ensures that invoices, orders, and other business documents can be exchanged with verifiable proof of origin, integrity, and receipt across organizational and national boundaries.</p><pre>[C1: Sender]<br>    ↓ (creates business document)<br>[C2: Sender&#39;s Access Point]<br>    ↓ (signs &amp; encrypts, sends via AS4)<br>[C3: Receiver&#39;s Access Point]<br>    ↓ (decrypts &amp; validates, delivers)<br>[C4: Receiver]</pre><h4>This legal reliability is built on several cryptographic guarantees:</h4><ul><li><strong>Digital signatures</strong> — Prove the sender’s identity and ensure the message cannot be forged</li><li><strong>Message timestamps</strong> — Embedded in the signed header, providing a verifiable record of when the message was sent and received</li><li><strong>Digest verification</strong> — Cryptographically binds the receipt to the exact message content</li><li><strong>Non-repudiation</strong> — Both sender and receiver possess signed proof of transmission and receipt</li><li><strong>Full audit trail</strong> — Each step of the exchange can be independently verified</li><li><strong>Tamper evidence</strong> — Any modification invalidates the cryptographic signatures immediately</li></ul><blockquote>Together, these guarantees create a verifiable chain of evidence, making Peppol suitable for legally binding document exchange in regulated and cross-border environments.</blockquote><p><strong>Peppol’s security model secures the transport layer between Access Points (C2–C3), not the full path from sender to receiver (C1–C4).</strong> Access Points must decrypt and inspect the content to perform the validation that makes Peppol legally reliable in the first place.</p><blockquote>The trust model is therefore not purely cryptographic. It is institutional and legal, built on contractual obligations, audits, and GDPR compliance rather than end-to-end encryption. <strong>Access Points are not passive routers — they are accountable intermediaries.</strong></blockquote><p>Peppol trades full confidentiality for something more pragmatic: radical interoperability, lightweight onboarding, and a governance layer strong enough to enforce rules without requiring every participant to become a cryptographer or infrastructure architect.</p><p>The network’s genius lies in that compromise — it democratized e-invoicing by minimizing friction. Endpoints resolve publicly, messages route through relays trusted through governance rather than end-to-end cryptographic isolation, and confidentiality rests on transport-layer encryption and signed receipts rather than zero-knowledge end-to-end proofs.</p><blockquote>This is not a bug — it’s the explicit design philosophy. But it is also why it is often misunderstood.</blockquote><p>From the outside, the network appears simple — just send a document from A to B. In reality, every exchange involves multiple layers of resolution, validation, certificate handling, and transport rules that must align perfectly. When something breaks, it rarely fails loudly. It fails somewhere along that chain.</p><p>Understanding that chain is no longer optional. As adoption grows and use cases expand, the challenge is not redefining the model — but making its behavior visible, predictable, and testable in practice.</p><p>The systems that succeed in this ecosystem will not be the ones that abstract everything away, but the ones that make the underlying mechanics transparent enough to trust.</p><h3>Want to Go Deeper?</h3><p>Use the links below to get more information:</p><ul><li><a href="https://peppol.org/">Peppol</a></li><li><a href="https://docs.peppol.eu/edelivery/">OpenPeppol eDEC Specifications</a></li><li><a href="https://www.testbed.peppol.org/">Peppol Testbed</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=167adfabd60f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Fully Working Peppol AS4 Sender in Node.js — In ~500 Lines of Code]]></title>
            <link>https://medium.com/@node42-dev/a-fully-working-peppol-as4-sender-in-node-js-in-500-lines-of-code-bad807b0e071?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/bad807b0e071</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[peppol]]></category>
            <category><![CDATA[e-invoicing]]></category>
            <category><![CDATA[node42]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Mon, 09 Mar 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-06-04T09:16:47.825Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_XxDaLvRfjnLljXHAEW2Lw.png" /></figure><p>Peppol has a reputation for being complicated. If you look at the transport stack alone, it’s easy to see why. The Peppol transport layer is built on technologies that look intimidating at first glance:</p><ul><li>SOAP</li><li>WS-Security</li><li>XML Digital Signatures</li><li>Encryption</li><li>MIME attachments</li></ul><p>If you search the ecosystem today, you’ll mostly find implementations built on large Java frameworks. These systems power production Access Points across the network, and they<strong> </strong>are excellent at what they do.</p><p>But they also give the impression that Peppol messaging requires <strong>tens of thousands of lines of infrastructure code</strong>. Recently, I wanted to test something. What if we stripped the protocol down to its essentials?</p><p>What if we implemented only what is strictly required to <strong>discover a participant, construct an AS4 message, sign it, encrypt it, and send it</strong>?</p><ul><li>No large frameworks.</li><li>No external crypto tools.</li><li>No heavy dependencies.</li></ul><blockquote><strong>Just pure modern Node.js.</strong></blockquote><h3>The Current Landscape</h3><p>But why reinvent the wheel if you don’t have to? <strong>I began by looking at what already exists</strong> in terms of lightweight, local Peppol senders.</p><blockquote>As it turns out, such implementations are rare. The few that exist — none found in Node.js — rely on external tools or heavy native dependencies, introducing installation complexity and tight coupling to the host system.</blockquote><h3>The experiment</h3><p>So I started a small project as part of the <strong>Node42</strong> tooling ecosystem: a <strong>pure Node.js Peppol sender</strong> that performs the entire sending pipeline:</p><ol><li>Resolve a participant via SML</li><li>Retrieve metadata from SMP</li><li>Extract the receiving AP endpoint and certificate</li><li>Build the AS4 SOAP envelope</li><li>Apply WS-Security signing</li><li>Encrypt the payload</li><li>Construct the multipart MIME message</li><li>Send the message to the receiving AP</li><li>Validate the receipt</li><li>Persist the entire transaction for analysis</li></ol><p><strong>All of that turned out to be… surprisingly small.</strong> The core transport logic is roughly a few hundred lines of code. Not thousands, not tens of thousands. Just a clear sequence of deterministic transformations.</p><h3>Why it works today</h3><p>Ten years ago this would have been much harder. But modern Node.js already provides most of what AS4 requires:</p><ul><li>strong cryptographic primitives through OpenSSL</li><li>stable streaming APIs</li><li>reliable HTTP clients</li><li>mature XML tooling</li></ul><p>Once those pieces are available, the rest is largely <strong>specification work,</strong> reading the standards carefully and implementing exactly what they specify. In practice, the sending pipeline becomes something conceptually simple:</p><h4><strong>UBL document</strong></h4><ul><li>canonicalize XML</li><li>calculate digest</li><li>sign envelope</li><li>encrypt payload</li><li>build MIME message</li><li>POST to Access Point</li></ul><blockquote>Each step is deterministic.</blockquote><h3>The real challenge isn’t sending</h3><p>Interestingly, implementing the sender itself was not the hardest part. The harder part of working with Peppol is something different: <strong>observability</strong>.</p><p>Anyone who has operated an Access Point knows the situation. A message fails somewhere in the network. Logs appear, SOAP envelopes are dumped. Digests and signatures are inspected manually.</p><blockquote>And somewhere in the chain between discovery, metadata, certificates, canonicalization, encryption, and transport… something breaks. The problem is rarely obvious.</blockquote><p>While building the <strong>Node42</strong> diagnostic platform and the Node.js sender extension, I focused on something else: <strong>making the protocol visible</strong>. Each run can persist a complete set of artifacts, including:</p><ul><li>discovery results</li><li>SMP metadata</li><li>canonicalized XML</li><li>calculated digests</li><li>the final SOAP envelope</li><li>the complete multipart MIME message</li><li>the AS4 receipt</li><li>execution context</li></ul><p>In other words: a full <strong>forensic record of the transaction</strong>. Instead of a black box, each message becomes something you can inspect step-by-step.</p><h3>Treating Peppol as a protocol, not a platform</h3><p>Most large Peppol implementations are designed as full <a href="https://qvalia.com/features/peppol-access-point">Access Point</a> platforms. They manage:</p><ul><li>message queues</li><li>retries</li><li>routing</li><li>persistence</li><li>monitoring</li><li>administration interfaces</li><li>multi-tenant environments</li></ul><p>Those features are essential for operating an <a href="https://qvalia.com/features/peppol-access-point">Access Point</a>, but they are not part of the <strong>core transport protocol</strong>. When you separate those layers, Peppol messaging becomes much easier to reason about. The sender becomes simply:</p><ul><li><strong>discovery</strong></li><li><strong>message construction</strong></li><li><strong>security transforms</strong></li><li><strong>transport</strong></li></ul><blockquote>Each stage can be inspected and validated independently.</blockquote><h3>A small tool with an unexpected use</h3><p>What started as an experiment is turning into something slightly different: a <strong>protocol probe</strong>. Because the sender is small and deterministic, it can be used to debug interoperability issues between Access Points.</p><p>Instead of relying on large stacks, <strong>a developer can send a controlled AS4 message and inspect every step of the process</strong>. In a way, the tool behaves more like familiar protocol utilities:</p><ul><li>curl for HTTP</li><li>dig for DNS</li><li>openssl s_client for TLS</li></ul><blockquote>Simple tools that expose the mechanics of a protocol.</blockquote><h3>Why open source matters here</h3><p>The Peppol ecosystem has always benefited from open reference implementations. Projects like <strong>phoss SMP</strong> and <strong>Phase4</strong> helped many organizations understand how the network works internally and today effectively serve as de-facto reference implementations for the network.</p><blockquote>Publishing a minimal sender continues that tradition. <strong>Not because the code itself is revolutionary, but because it fills a gap — a working, readable Node.js implementation that demonstrates something useful.</strong></blockquote><p>Peppol messaging is not mysterious enterprise middleware. It’s a protocol. And protocols become easier to understand when their mechanics are visible.</p><h3>The bigger picture</h3><p>This sender is part of a broader effort around <strong>Node42</strong>, a set of tools focused on making Peppol infrastructure easier to analyze and understand. So far that work has included:</p><ul><li>discovery diagnostics</li><li>infrastructure tracing</li><li>protocol analysis</li></ul><p>Adding a minimal local sender closes an important gap: the ability to <strong>generate and observe messages end-to-end</strong>.</p><blockquote><strong>One practical benefit of this approach is that sensitive credentials never leave your environment. </strong>The sender runs locally, using your own <a href="https://qvalia.com/features/peppol-access-point">Access Point</a> certificate and keys, meaning there is no need to hand over private material to third-party services or external platforms.</blockquote><p>For organizations operating in regulated environments, this can significantly simplify security considerations and avoid introducing additional compliance scopes such as ISO 27001 for external providers.</p><h3>A small observation</h3><p>When working with complex systems, we often assume that the difficulty lies in the protocol itself. But sometimes the complexity comes from the layers built around it.</p><p>Peppol transport is a good example. Once you peel away the surrounding infrastructure, what remains is surprisingly elegant. Sometimes the best way to understand a protocol is simply to <strong>build one message and watch what happens</strong>.</p><h3>Want to Go Deeper?</h3><p>If you’d like to explore the project or experiment with the sender yourself, the repository is now available on GitHub. Short CLI demos are also available on the <strong>Node42 YouTube channel</strong> if you’d like to see the sender in action.</p><ul><li><a href="https://github.com/node42-dev/n42-edelivery">GitHub Repo</a></li><li><a href="https://www.npmjs.com/package/@n42/edelivery">npm package</a></li><li><a href="https://www.youtube.com/watch?v=H_p9N9Qiasw">YouTube Demo</a></li><li><a href="https://www.node42.dev/">Node42 Website</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bad807b0e071" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Peppol AS4 Under the Microscope: From TCP Handshake to Encrypted Invoice]]></title>
            <link>https://medium.com/@node42-dev/peppol-as4-under-the-microscope-from-tcp-handshake-to-encrypted-invoice-4da0e02b4e3c?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/4da0e02b4e3c</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[peppol]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Mon, 02 Mar 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-03-02T14:56:23.222Z</atom:updated>
            <content:encoded><![CDATA[<p>If you’ve ever implemented a Peppol Access Point, you’ve likely encountered a familiar frustration: the documentation explains what to configure, but rarely how the protocol actually works.</p><p>This article <strong>tears down the abstraction layers</strong> — from TCP handshake to encrypted invoice — revealing the cryptographic machinery that makes Peppol legally enforceable across countries.</p><figure><img alt="A magnifying glass examining a digital certificate and padlock over a network diagram, representing cryptographic security and inspection of Peppol AS4 message transmission." src="https://cdn-images-1.medium.com/max/1024/1*2MHoFyZwgIhqYYMjBiMysg.png" /><figcaption>The cryptographic machinery beneath every Peppol transaction</figcaption></figure><blockquote>Some details are simplified to focus on the core transmission and security mechanisms. <strong>The objective is to explain how Peppol AS4</strong> message exchange actually works in practice, <strong>without covering every minor specification detail</strong>.</blockquote><h3>What Is Peppol AS4, Really?</h3><p>Well, it isn’t just<strong> “SOAP with security”</strong>. It’s a precisely layered stack where each layer has a specific job, and understanding these layers is critical for debugging transaction issues.</p><h4>Peppol AS4 is built on progressively constrained specifications</h4><p>where the hierarchy is as follows:</p><h4>OASIS ebMS3 standard — base messaging framework:</h4><ul><li>Requires <strong>WS-Security</strong> (unlike full ebMS3 where it’s optional)</li><li>Mandates specific <strong>MEPs</strong> (Message Exchange Patterns)</li></ul><h4>eDelivery AS4 v1.14 — further constrains:</h4><ul><li>Mandates <strong>TLS for transport</strong></li><li>Requires <strong>XML Signature</strong> and <strong>XML Encryption</strong></li><li>Specifies exact algorithms (RSA-SHA256, AES-128-GCM, etc.)</li><li>Defines <strong>conformance profiles</strong> (ebHandler, Light Client)</li><li>Defines <strong>Four Corner topology</strong> for intermediated exchanges</li><li>Adds <strong>SBDH</strong> (Standard Business Document Header) support</li></ul><h4>Peppol AS4 Profile v2.0 — adds final constraints:</h4><ul><li><strong>One-Way Push MEP</strong> only</li><li>Messages must be <strong>signed</strong> and <strong>encrypted</strong></li><li>Exactly <strong>one encrypted payload </strong>(the business document)</li><li>Payload must be wrapped in <strong>SBDH</strong></li><li>Peppol <strong>PKI certificates only</strong></li><li><strong>Binary Security Token</strong> (BST) for certificate exchange</li><li>Dynamic <strong>discovery via SML/SMP</strong></li><li>Requires <strong>synchronous signed AS4 Receipts</strong> (Non-Repudiation of Receipt)</li></ul><h4>Why This Layering Matters?</h4><p>Because each layer can fail independently…</p><ul><li>TLS failures happen before SOAP</li><li>WS-Security signature failures happen after SOAP parsing</li><li>ebMS3 validation happens after security processing</li><li>Peppol-specific validation happens last</li></ul><blockquote>Understanding the order helps you identify where problems occur.</blockquote><h3>Message Security vs. Transport Security</h3><p>Before any AS4 message is exchanged, a standard TLS 1.2+ handshake establishes a secure HTTPS connection between Access Points.</p><blockquote>The Peppol AS4 profile does not mandate mutual TLS. An Access Point that enforces it as a connection requirement is non-compliant with the specification.</blockquote><p>TLS authenticates the server endpoint, not the sending Access Point itself. The actual sender identity is established at the application layer using the Peppol certificate embedded in the WS-Security header. This separation allows TLS termination at load balancers or proxies without breaking message-level trust.</p><h4>Two Certificates, Two Distinct Security Roles</h4><p>Peppol uses separate certificates for transport security and message security. These serve fundamentally different purposes and are never interchangeable:</p><h4>TLS Certificate</h4><ul><li><strong>Purpose</strong>: Secure the HTTPS connection itself</li><li><strong>Issuer</strong>: Any CA from Mozilla’s trusted root certificate list (Let’s Encrypt, DigiCert, GlobalSign, etc.)</li><li><strong>Cannot be</strong>: Self-signed</li><li><strong>Required</strong>: Must achieve SSL Labs grade “A”</li><li><strong>Location</strong>: Web server configuration (Apache, nginx, Tomcat, etc.)</li><li><strong>Lifetime</strong>: Typically 90 days (Let’s Encrypt) to several years</li><li><strong>Used for</strong>: Establishing encrypted TLS connection before any AS4 message exchange</li></ul><h4>Peppol Certificate</h4><ul><li><strong>Purpose</strong>: Sign and encrypt AS4 messages</li><li><strong>Issuer</strong>: Peppol CA</li><li><strong>Location</strong>: Included in AS4 message as &lt;wsse:BinarySecurityToken&gt;</li><li><strong>Lifetime</strong>: 2 years</li><li><strong>Used for</strong>: Creating digital signatures on messages, encrypting payloads</li><li><strong>Retrieved from</strong>: SMP as part of the signed &lt;smp:ServiceMetadata&gt; containing the receiver’s public certificate</li></ul><blockquote>The SSL Labs grading methodology is subject to change, meaning an “A” rating today may not represent the same criteria in the future.</blockquote><h3>Message Structure — The Layers Inside</h3><p>A Peppol AS4 message is a structured container of nested transport, messaging, and cryptographic layers. Each layer serves a specific role in ensuring secure, verifiable, and interoperable delivery. The complete anatomy is broken down below, from outer transport to inner business payload:</p><h4>HTTP Layer</h4><ul><li><strong>Method:</strong> POST</li><li><strong>Content-Type</strong>: multipart/related with boundaries</li><li><strong>Contains:</strong> &lt;soap:Envelope&gt; and &lt;xenc:EncryptedData&gt; (payload) as separate MIME parts</li></ul><h4>SOAP 1.2 Envelope</h4><ul><li><strong>Header</strong>: contains all metadata and security (<strong>ebMS3 messaging metadata</strong> and <strong>WS-Security</strong> elements)</li><li><strong>Body</strong>: empty — the encrypted payload travels as a separate MIME part referenced by &lt;eb:PayloadInfo&gt;</li></ul><blockquote>This design avoids XML canonicalization and size limitations by keeping the encrypted business document outside the SOAP envelope while still cryptographically binding it via signature references.</blockquote><p>The &lt;soap:Envelope&gt; forms the control structure of the AS4 message, encapsulating all protocol metadata and cryptographic security information. The &lt;soap:Header&gt; contains two critical sections:</p><h4>ebMS3 (ebXML Messaging Services 3.0)</h4><ul><li>&lt;eb:MessageInfo&gt;: Unique message ID and timestamp</li><li>&lt;eb:PartyInfo&gt;: Sender/receiver AP identities (from certificate CNs)</li><li>&lt;eb:CollaborationInfo&gt;: Process ID (Service), Document Type ID (Action)</li><li>&lt;eb:MessageProperties&gt;: Original sender and final recipient Peppol participant IDs</li><li>&lt;eb:PayloadInfo&gt;: Reference to encrypted MIME attachment</li></ul><h4>OASIS WS-Security 1.1</h4><ul><li>&lt;wsse:BinarySecurityToken&gt;: Sender’s X.509 certificate (public key)</li><li>&lt;ds:Signature&gt;: Digital signature covering &lt;eb:Messaging&gt; and encrypted payload</li><li>&lt;xenc:EncryptedKey&gt;: Session key encrypted with receiver’s public key</li></ul><p>The actual business document, as mentioned before travels as a separate MIME part, not embedded in the SOAP body but inside &lt;xenc:EncryptedData&gt;</p><h4>Encrypted Data</h4><ul><li>Compressed SBDH + Business Document</li><li>Encrypted using AES-128-GCM with random IV</li><li>Session key is in &lt;xenc:EncryptedKey&gt; element</li></ul><blockquote>The AS4 specification itself does not define hard message size limits.<br> However, within the Peppol network, Service Level Requirements apply.<br> For post-award message exchange services (e.g., invoices), an <strong>Access Point must support messages up to 100 MB</strong>. For pre-award procurement, the required capability is up to 2 GB.</blockquote><blockquote>Individual service providers may choose to accept larger messages, but they cannot enforce limits below these required thresholds and remain compliant.</blockquote><h3>Cryptographic Processing Order</h3><h4>When sending a Peppol AS4 message:</h4><ul><li><strong>SMP Lookup</strong>: Query SMP for recipient’s (C3) endpoint URL and certificate</li><li><strong>Verify SMP Signature</strong>: Validate &lt;smp:ServiceMetadata&gt; signature to ensure the received data was published by an authorized SMP (normally cached)</li><li><strong>Parse Recipient’s certificat</strong>e: extract from SMP &lt;ds:X509Certificate&gt;, decode (Base64) and parse the X.509 structure</li><li><strong>Check Expiry</strong>: Verify (C3) cert NotBefore &lt;= <strong>now</strong> &lt;= NotAfter</li><li><strong>Build Chain</strong>: Construct chain from (C3) cert to Peppol Root CA</li><li><strong>Verify Chain</strong>: Validate that (C3) cert chains to trusted Peppol CA</li><li><strong>Check Revocation</strong>: OCSP/CRL check (optional but recommended)</li><li><strong>Validate Business Document</strong>: Check against UBL/CII schemas and Schematron rules (implementation specific, could also be an earlier step)</li><li><strong>Build and Compress Payload</strong>: (gzip) SBDH + Business Document</li><li><strong>Generate Session Key</strong>: Create random 128-bit key (AES-128-GCM) key for payload encryption</li><li><strong>Encrypt Payload</strong>: Encrypt compressed payload with session key (AES-128-GCM)</li><li><strong>Encrypt Session Key</strong>: Encrypt session key with (C3) public key (RSA-OAEP-MGF1-SHA256) then embed in &lt;xenc:EncryptedKey&gt; within the &lt;soap:Header&gt;</li><li><strong>Calculate Digests</strong>: Compute (SHA-256) digests of &lt;eb:Messaging&gt; and the encrypted payload</li><li><strong>Sign Message</strong>: Sign digests with sender’s (C2) private key (RSA-SHA256)</li><li><strong>Include Sender’s Certificate</strong>: Embed sender’s (C2) cert in &lt;wsse:BinarySecurityToken&gt;</li><li><strong>Construct MIME message</strong>: Build &lt;soap:Envelope&gt; with all headers and encrypted payload in &lt;xenc:EncryptedData&gt;</li><li><strong>Send</strong>: via HTTPS POST to (C3) endpoint with boundaries that separates SOAP and payload parts</li></ul><h4>When receiving a Peppol AS4 message:</h4><blockquote><em>Any step that fails returns an AS4 Error signal instead of a receipt, with the appropriate </em>EBMS<em> error code.</em></blockquote><ul><li><strong>Parse: </strong>incoming Content-Type: multipart/related<strong> </strong>request and extract boundary parameter</li><li><strong>Parse: </strong>&lt;soap:Envelope&gt; and extract &lt;soap:Header&gt; and &lt;soap:Body&gt;</li><li><strong>Parse Sender’s </strong>(C2) <strong>certificate</strong>:<strong> </strong>extract from&lt;wsse:BinarySecurityToken&gt;, decode (Base64) and parse the X.509 structure</li><li><strong>Check Expiry</strong>: Verify (C2) cert NotBefore &lt;= <strong>now</strong> &lt;= NotAfter</li><li><strong>Build Chain</strong>: Construct chain from (C2) cert to Peppol Root CA</li><li><strong>Verify Chain</strong>: Validate that (C2) cert chains to trusted Peppol CA</li><li><strong>Check Revocation</strong>: OCSP/CRL check (optional but recommended)</li><li><strong>Verify Message Signature</strong>: Use public key from (C2) cert to verify the XML Digital Signature (&lt;ds:Signature&gt;) in the &lt;soap:Header&gt;</li><li><strong>Verify Digest</strong>: Recalculate (SHA-256) digests of signed elements and compare with &lt;ds:DigestValue&gt; in &lt;ds:SignedInfo&gt;</li><li><strong>Decrypt Session Key</strong>: Use receiver’s (C3) private key to decrypt session key from &lt;xenc:EncryptedKey&gt;</li><li><strong>Decrypt Payload</strong>: Use session key to decrypt payload (AES-128-GCM) from &lt;xenc:EncryptedData&gt;</li><li><strong>Check Duplicate</strong>: Compare&lt;eb:MessageId&gt;with message log (reject if duplicate)</li><li><strong>Validate Timestamp</strong>: Reject messages with &lt;eb:Timestamp&gt; older than (implementation-defined) minutes or in the future (clock skew tolerance)</li><li><strong>Decompress</strong>: (gunzip) the decrypted payload</li><li><strong>Extract SBDH</strong>: Parse the Standard Business Document Header</li><li><strong>Validate Business Document</strong>: Check against UBL/CII schemas and Schematron rules (optional)</li><li><strong>Generate Receipt</strong>: and sign with (C3) private key</li><li><strong>Return Receipt: </strong>as<strong> </strong>synchronous response to original HTTP POST</li></ul><h3>Receipt and Delivery Guarantees</h3><h4>The AS4 Receipt — What It Actually Means</h4><p>After successfully receiving and processing a message, the receiving Access Point sends back an <strong>AS4 Receipt</strong>. This is a signed acknowledgment that serves multiple purposes.</p><h4>What the Receipt Proves</h4><p>Non-Repudiation of Receipt (NRR) contains cryptographic digest values of the original message, signed by the receiving Access Point. This provides verifiable proof that:</p><ul><li><strong>The receiver got the message</strong>: They had to compute the digests</li><li><strong>The message was intact</strong>: Digest values match what sender calculated</li><li><strong>The receiver can’t deny it</strong>: Their signature is cryptographic proof</li><li><strong>Legal evidence</strong>: Can be used in dispute resolution</li></ul><h4>Synchronous Receipts</h4><p>Peppol AS4 uses synchronous receipts only:</p><ul><li>Receipt is returned in the HTTP response to the original HTTP POST request</li><li>HTTP 200 with receipt in body means SUCCESS (meaning protocol-level success only — it does not imply business acceptance or downstream processing).</li><li>HTTP 4xx/5xxor absence of a receipt mean FAILURE (retry behavior is implementation-defined)</li></ul><blockquote>The receipt is not merely an acknowledgment. It is a cryptographic artifact signed by the receiving Access Point, containing digest values of the original message. This creates verifiable proof that a specific Access Point received and validated a specific message at a specific time.</blockquote><h3>Receipt Processing Flow</h3><h4>Sender side:</h4><ul><li>Send AS4 message via HTTP POST</li><li>Wait for HTTP response</li><li>Parse response — is it a receipt or an error?</li><li>If receipt: Verify signature, check &lt;eb:RefToMessageId&gt; matches</li><li>Store receipt for non-repudiation</li><li>Mark message as delivered</li></ul><h4>Receiver side:</h4><ul><li>Receive AS4 message</li><li>Decrypt, verify signature, validate structure</li><li>If valid: Generate receipt with digests from original message</li><li>Sign receipt with receiver’s private key</li><li>Return receipt in HTTP response (synchronously)</li><li>Process business document</li></ul><h3>Delivery Guarantees</h3><h4>What AS4 Receipt Guarantees:</h4><ul><li>Message was received by the Access Point</li><li>Message was well-formed and valid</li><li>Message was decrypted and signature verified</li><li>Cryptographic proof of receipt</li></ul><h4>What AS4 Receipt Does NOT Guarantee:</h4><ul><li>Business document was delivered to end user</li><li>Business document was processed successfully</li><li>Business document was accepted (vs rejected for business reasons)</li><li>Payment was made, order was fulfilled, etc.</li></ul><blockquote>These business-level acknowledgments are out of scope for AS4. They’re handled at the business document level (e.g., UBL Application Response).</blockquote><h4>Error Signals vs Receipts</h4><p>If something goes wrong, the receiver sends an <strong>Error Signal</strong> instead of a receipt, <strong>common error codes</strong>:</p><ul><li>EBMS:0001: ValueNotRecognized</li><li>EBMS:0002: FeatureNotSupported</li><li>EBMS:0003: ValueInconsistent</li><li>EBMS:0004: Other (with description)</li><li>EBMS:1001: FailedAuthentication</li><li>EBMS:1002: FailedDecryption</li><li>EBMS:1003: SignatureValidationFailed</li></ul><blockquote>Understanding the full transmission and cryptographic chain clarifies why many AS4 failures are not random, but deterministic — occurring at a specific validation layer in a strictly ordered processing flow.</blockquote><h4>References</h4><p>The mechanisms described in this article are based on the official Peppol specifications. Use the links below to get more information:</p><ul><li><a href="https://docs.oasis-open.org/ebxml-msg/ebms/v3.0/core/ebms_core-3.0-spec.html">OASIS ebMS3 Core Specification</a></li><li><a href="https://www.oasis-open.org/standard/as4profilev1-0/">OASIS AS4 Profile Specification</a></li><li><a href="https://ec.europa.eu/digital-building-blocks/sites/spaces/DIGITAL/pages/467117656/eDelivery+AS4+-+1.14">CEF eDelivery AS4 Profile v1.14</a></li><li><a href="https://docs.peppol.eu/edelivery/as4/specification">Peppol AS4 Profile v2.0.3</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4da0e02b4e3c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[12 Hidden Pitfalls in Peppol Discovery: Troubleshooting checklist]]></title>
            <link>https://medium.com/@node42-dev/12-hidden-pitfalls-in-peppol-discovery-troubleshooting-checklist-026766505a1a?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/026766505a1a</guid>
            <category><![CDATA[peppol]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[node42]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[e-invoicing]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Mon, 23 Feb 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-06-04T09:27:10.723Z</atom:updated>
            <content:encoded><![CDATA[<p>Peppol’s distributed architecture is elegant — until something breaks. Because discovery spans SML/SMP, certificates, and caching layers, failures often happen without clear error messages.</p><p>A participant lookup that should take milliseconds can fail for various reasons, and you will rarely receive a conclusive diagnostic response. Even seemingly compliant setups can still encounter frustrating silent failures in the real world.</p><p><strong>But my AP passed the Testbed!? — Why the errors?</strong></p><blockquote>Passing the <strong>Peppol Testbed</strong> is a self-assessment tool for initial compliance that verifies basic conformance but does not guarantee handling of all edge case scenarios.</blockquote><p>The <strong>Peppol Testbed</strong> primarily <strong>covers</strong> standard <strong>good-case</strong> and basic <strong>bad-case</strong> <strong>scenarios </strong>(e.g., invalid certificates or large messages) without delving into production-like complexities such as sporadic DNS resolution failures, high-load caching behaviors, or interactions with country-specific extensions.</p><figure><img alt="A chaotic desk with tangled cables, scattered invoice papers, AS4 protocol labels, and a computer monitor displaying “FAILED — Transaction Failed” in bold red, representing silent failures in Peppol document exchange." src="https://cdn-images-1.medium.com/max/1024/1*9VhXmEwyPrlcpdmTRe-kBA.png" /><figcaption>When transactions fail, the visible error is rarely the real cause</figcaption></figure><h3>This guide catalogs 12 common (often hidden) failure modes</h3><p>with explanations of why they happen.</p><p><strong>1. Participant ID schemes — 80+ supported (ISO 6523 ICD list), each with validation rules. Wrong scheme? Discovery fails silently</strong>.</p><p>Peppol relies on the ISO 6523 International Code Designator (ICD) list for participant identifiers, which spans over 700 registered codes globally, with more than 80 active schemes in use within Peppol.</p><p>Each scheme has specific validation rules, such as regex patterns, check digits (e.g., Luhn or MOD11 algorithms), and structure requirements. For example, the French SIRENE scheme (ICD 0002) uses a 9- or 14-digit format with Luhn check digits.</p><p>If an incorrect scheme is used (e.g., mismatched ICD prefix), participant discovery via the Service Metadata Locator (SML) or Publisher (SMP) fails without explicit error feedback to the sender, as the hashed lookup in DNS/SML simply returns no match, leading to silent non-delivery.</p><blockquote>This is a common complexity, as invalid IDs cause “silent failures” in dynamic discovery.</blockquote><p><strong>2. Multiple profiles per participant — A company might support 10+ document types, each with process identifiers, extension possibilities.</strong></p><p>A single Peppol participant can register multiple profiles in their SMP entry, supporting various document types (e.g., invoices, orders, credit notes) under different business processes.</p><p>Official code lists show over 50 document types, and a company could realistically support 10+ (e.g., BIS Billing 3.0 for invoices plus PINT variants for international extensions). Each includes process identifiers (e.g., urn:fdc:peppol.eu:edec:bis:reporting:1.0) and allows extensions for country-specific customizations.</p><blockquote>This flexibility adds complexity in managing capabilities, as senders must query SMP for supported types to avoid mismatches.</blockquote><p><strong>3. Redirects and migrations — Participants can switch SMPs; old metadata must be cleaned, or stale caches cause delivery failures.</strong></p><p>Participants can migrate to a new SMP (e.g., during service provider changes), and redirects (via SMP entries) handle forwarding. However, old metadata must be explicitly deleted or updated in the SML/SMP; failure to do so leads to stale data persisting in Access Point (AP) caches, resulting in delivery to outdated endpoints.</p><blockquote>Documentation stresses proper cleanup during migrations to prevent failures. This is a noteworthy hidden pitfall, because unrefreshed caches from migrations can cause “delivery failures” without clear indicators.</blockquote><p><strong>4. Signing and security — SMP responses are XMLDSig-signed (now SHA-256 required post-1.3 updates); invalid signatures block the whole chain.</strong></p><p>SMP responses are signed using XML Digital Signature (XMLDSig) to ensure integrity and authenticity. As of SMP specification 1.3.0 (effective 2023–2024, with phase-in), SHA-256 is mandatory for digests and signatures (replacing SHA-1 for security).</p><p>Invalid signatures cause the receiving AP to reject the metadata, blocking the discovery and delivery chain entirely.</p><blockquote>Signature validation failures “block the whole chain,” especially during updates, and are widely seen in issue trackers. Note that <strong>phoss SMP was already compliant with SHA-256 by v5.x</strong> — this pitfall primarily affects operators running legacy custom implementations or older third-party tools.</blockquote><p><strong>5. Caching pitfalls — Access Points cache results for performance, but expiration, revocation, or changes mean you must detect and refresh — or send to the wrong place.</strong></p><p>Most AP implementations cache SMP metadata (e.g., endpoints, certificates) to optimize performance, but metadata includes expiration dates (xs:dateTime format; missing means “eternal”).</p><p>Changes, revocations (e.g., via PKI), or expirations require refresh mechanisms; failure to detect/refresh leads to sending documents to incorrect or revoked endpoints.</p><blockquote>Stale caches are a frequent cause of “wrong place” deliveries. Official guides warn of these pitfalls, emphasizing revocation checks and cache invalidation.</blockquote><p><strong>6. Certificate management and updates — Specific processes required for certificate changes (e.g., expiration); standard updates don’t suffice, leading to registration or lookup blocks.</strong></p><p>SMP certificates (used for SML interactions and signing) require a dedicated update process separate from general SMP metadata changes.</p><p>Expiring or invalid certificates prevent SMP registration in the SML or cause signature validation failures during lookups, blocking participant discovery.</p><blockquote>Multiple sources — blogs, GitHub discussions, and practitioner experience — consistently highlight mismatches (e.g., using test certs in prod) as common causes of 401 Unauthorized errors or failed registrations. Incomplete certificate chains (e.g., missing intermediates) also lead to authentication failures.</blockquote><p><strong>7. DNS propagation delays — Changes to participant or SMP DNS records (NAPTR) can take minutes to hours to propagate, causing temporary discovery failures.</strong></p><p>The SML uses distributed DNS for participant addressing, and updates (e.g., after registration, migration, or deletion) involve NAPTR records that may not replicate immediately across nodes, leading to inconsistent lookups and silent failures during that window.</p><blockquote>Implementation guides note this as a standard DNS pitfall in Peppol, exacerbated during migrations.</blockquote><p><strong>8. Intermittent SML/DNS issues — Sporadic lookup failures due to network or DNS resolution problems, often resolving unpredictably.</strong></p><p>SML lookups rely on DNS queries, and transient network issues can cause exceptions like “Identifier not registered in SML,” even for valid participants.</p><p>These are not SML-side but often client-side DNS resolution glitches, affecting production more than test environments.</p><blockquote>GitHub issues describe these as “come and go” problems, recommending tools like nslookup for debugging. For a faster, Peppol-specific alternative without touching the command line, the Node42 Web UI handles this directly.</blockquote><p><strong>9. HTTPS mandatory migration — As of February 1, 2026, SMPs must use HTTPS on port 443 with approved TLS certs; non-compliance causes service interruptions.</strong></p><p>SMPs must now exclusively use HTTPS for APIs, with TLS certs from approved CAs (not OpenPeppol PKI certs).</p><p>Failure to migrate leads to inaccessibility, disrupting metadata retrieval and document exchange.</p><blockquote>Improper certificate setup or missed migration deadlines will cause service disruptions.</blockquote><p><strong>10. Outdated SMP software versions — Older versions incompatible with current specs (e.g., CNAME to NAPTR migration), leading to registration failures.</strong></p><p>The SML historically used CNAME-based DNS records for participant addressing. OpenPeppol deprecated this in favor of NAPTR records as part of the post-2025 infrastructure modernization. NAPTR records carry richer routing information and align with how modern DNS-based service discovery is expected to work at scale.</p><blockquote>SMP tools like phOSS SMP versions prior to v7.2.7 lack full support for the CNAME to NAPTR migration. While v7.2.7+ handles NAPTR, upgrading to v8+ is recommended to ensure full compatibility with all post-2025 infrastructure changes, including HTTPS enforcement and ongoing specification updates.</blockquote><p><strong>11. Unregistered SMP deletion risks — Unregistering an SMP without migrating participants deletes all linked DNS entries, disrupting addressing.</strong></p><p>SMP unregistration from SML cascades to delete participant DNS records if not preceded by migration, causing widespread discovery failures for those participants.</p><blockquote>Guides stress manual migration to avoid this pitfall.</blockquote><p>12. <strong>PKI Certificate Migration (G2 → G3) — OpenPeppol G2 certificates stop being issued after February 11, 2026 and are fully revoked April 1, 2026; any SMP or AP still relying on G2 certs after that date fails SML authentication entirely.</strong></p><p>The OpenPeppol PKI is transitioning from its G2 (Generation 2) root to G3. This affects both SMP certificates (used for SML registration and SMP response signing) and AP certificates (used for AS4 message signing and encryption).</p><p>Because the revocation happens at the PKI root level, no amount of reconfiguration fixes it — the cert itself must be replaced. APs that cache certificate validity can also be caught off guard if they don’t actively check revocation status (OCSP/CRL) on each transaction.</p><blockquote>A particularly nasty edge case exists between <strong>T1</strong> (February 11) and <strong>T2</strong> (April 1, 2026): APs <strong>must simultaneously trust both G2 and G3 chains</strong> during this window. An AP that has migrated its truststore to G3-only will silently reject incoming AS4 messages from peers still on G2 — with no informative error. This makes the transition window itself a source of intermittent delivery failures even for providers who have done everything right on their own side.</blockquote><h4><strong>Why Discovery Matters More Than Ever</strong></h4><p>If you’ve made it through all 12 pitfalls (and there are a great deal more not covered here), you’re probably thinking:</p><p><strong>“That’s a lot that can go wrong…” — </strong>You’d be right.</p><p>As Peppol expands globally with real-time invoicing mandates, discovery failures become critical business issues. A misconfigured certificate or stale cache can silently break delivery for hours…</p><h4>Want to Go Deeper?</h4><ul><li><a href="https://docs.peppol.eu/edelivery/">OpenPeppol eDEC Specifications</a></li><li><a href="https://www.testbed.peppol.org/">Peppol Testbed</a></li><li><a href="https://peppol.helger.com/public">Peppol Practical</a></li><li><a href="https://www.node42.dev/docs/discovery">Node42 Discovery API</a></li><li><a href="https://www.node42.dev/">Node42 Web UI</a></li><li><a href="https://qvalia.com/features/peppol-access-point">Qvalia Access Point Solutions</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=026766505a1a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Hidden Complexity of Peppol Discovery: A Visual Deep-Dive]]></title>
            <link>https://medium.com/@node42-dev/the-hidden-complexity-of-peppol-discovery-a-visual-deep-dive-31f6d608068c?source=rss-29bb0d606532------2</link>
            <guid isPermaLink="false">https://medium.com/p/31f6d608068c</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[node42]]></category>
            <category><![CDATA[e-invoicing]]></category>
            <category><![CDATA[peppol]]></category>
            <dc:creator><![CDATA[Alex Olsson]]></dc:creator>
            <pubDate>Mon, 16 Feb 2026 13:31:01 GMT</pubDate>
            <atom:updated>2026-02-16T13:31:01.136Z</atom:updated>
            <content:encoded><![CDATA[<p>The Peppol discovery process looks simple on the surface: type a company identifier, find its endpoint, send an e-invoice.</p><p>But behind that seamless experience lies a cleverly engineered yet surprisingly intricate system of distributed components, DNS tricks, strict governance, and potential failure points that make it robust — and occasionally frustrating.</p><figure><img alt="Visual representation of Peppol discovery showing a DNS NAPTR query to the Service Metadata Locator (SML), which resolves the participant identifier to its authoritative Service Metadata Publisher (SMP). The SMP is then queried to retrieve service metadata required for document delivery." src="https://cdn-images-1.medium.com/max/1024/1*fZ2U_JYn0tWA4AdTUo9B2A.png" /><figcaption>Participant discovery in the Peppol network</figcaption></figure><p>Peppol (now global beyond its Pan-European roots) relies on a four-corner model for document exchange — though a fifth corner for tax authorities is emerging in some jurisdictions.</p><blockquote><strong>The magic enabling any-to-any connectivity without prior agreements? </strong>Dynamic discovery via the Service Metadata Locator (SML) and Service Metadata Publishers (SMPs).</blockquote><p>Before we dive in, this article assumes basic familiarity with Peppol concepts. At a high level, the model resembles email delivery — but with an important architectural difference: routing is derived deterministically from the participant identifier itself.</p><h4><strong>The discovery core components</strong></h4><p>can be understood as follows:</p><ul><li><strong>Participant ID</strong> — globally unique identifier of the recipient (analogous to an email address, but used as a deterministic routing key)</li><li><strong>SML (Service Metadata Locator)</strong> — DNS-based routing layer that resolves the participant to its authoritative SMP</li><li><strong>SMP (Service Metadata Publisher)</strong> — capability directory that publishes signed metadata describing how to reach the participant</li><li><strong>AS4</strong> — secure transport protocol used by Access Points to exchange documents</li></ul><h4>DNS as a Cryptographic Routing Fabric</h4><p>the architectural breakthrough:</p><p>Peppol discovery is often described as a lookup process. In reality, this characterization understates the architectural innovation that makes the network scalable and decentralized.</p><blockquote>Peppol does not use DNS merely as a directory. It uses DNS as the routing fabric itself.</blockquote><p>A participant identifier is transformed using a cryptographic hash into a deterministic DNS name. This hash becomes a globally unique routing key that any Access Point can compute independently, without prior coordination, configuration, or centralized knowledge of the recipient.</p><p>This approach eliminates the need for a central routing database. Instead, it leverages DNS — one of the most resilient and globally distributed systems ever built — as the routing layer for business document delivery.</p><p>The use of cryptographic hashing also preserves privacy. The resulting DNS name reveals nothing about the original participant identifier, preventing passive enumeration while still allowing deterministic resolution.</p><blockquote>The result is a decentralized, privacy-preserving, and globally scalable routing system built entirely on standard DNS infrastructure.</blockquote><p>Peppol effectively transforms DNS into a cryptographic routing namespace, enabling any Access Point to route documents to any participant in the world without prior relationships or centralized coordination.</p><h4><strong>SML </strong>— <strong>The Centralized “Phone Book” Pointer</strong></h4><p>The SML is the network’s single root registry, but it is not involved in runtime discovery (operated under the governance of OpenPeppol and runs on infrastructure provided by the European Commission’s eDelivery BDMSL service). It doesn’t store full details; it just maps a participant’s unique ID (e.g., schemeID + value like iso6523:0191:123456789) to the URL of their chosen SMP.</p><p>How? It uses DNS in a non-obvious way. The participant ID is hashed (MD5 historically, now SHA-256 per current specifications), and turned into a special subdomain under e.g., acc.edelivery.tech.ec.europa.eu. A sender’s Access Point does a standard DNS lookup (no fancy API calls), gets the SMP hostname back. This leverages DNS’s global speed, redundancy, and caching while keeping the system decentralized in feel.</p><h4><strong>SMP </strong>— <strong>The Detailed Capability Directory</strong></h4><p>Once you have the SMP URL, query it (REST interface) for the participant. The SMP returns signed XML metadata: supported document types (e.g., Peppol BIS Billing 3.0), transport profile (usually AS4), endpoint address/URL of the recipient’s Access Point, and sometimes activation status or redirects.</p><h4><strong>This is where hidden complexity explodes</strong></h4><p>And these are just a few examples of the many gotchas that could derail an implementation:</p><ul><li><strong>Participant ID schemes</strong> — dozens supported (ISO 6523 ICD list), each with validation rules. Wrong scheme? Discovery fails silently.</li><li><strong>Multiple profiles per participant</strong> — A company might support 10+ document types, each with process identifiers, extension possibilities.</li><li><strong>Redirects and migrations</strong> — Participants can switch SMPs; old metadata must be cleaned, or stale caches cause delivery failures.</li><li><strong>Signing and security </strong>— SMP responses are XMLDSig-signed (now SHA-256 required post-1.3 updates); invalid signatures block the whole chain.</li><li><strong>Caching pitfalls</strong> — Access Points cache results for performance, but expiration, revocation, or changes mean you must detect and refresh — or send to the wrong place.</li></ul><h4>Visualizing the Flow</h4><p>The visualization below shows what happens from initial query to the point of sending:</p><ul><li>Sender obtains <strong>Recipient ID</strong> → generates <strong>Hash</strong></li><li><strong>DNS query to SML</strong> → <strong>SMP URL</strong> returned</li><li><strong>SMP Lookup </strong>→ <strong>Signed metadata</strong> with AP endpoint</li><li><strong>Verify SMP signature</strong> and <strong>validate AP certificate</strong></li><li><strong>Ready to send</strong> (via AS4) to recipient’s Access Point</li></ul><p>The actual document transmission (AS4 protocol, encryption, signatures, receipts) is a whole other layer of complexity — a topic for an upcoming post.</p><figure><img alt="Interactive Node42 discovery trace diagram showing the complete Peppol participant lookup path from SML DNS query at the top, through SMP metadata retrieval in the middle section, down to Access Point endpoint validation at the bottom. The visualization displays multiple hierarchical nodes connected by lines, with each node representing a step in the discovery process including DNS records, certificate validation, and endpoint configuration." src="https://cdn-images-1.medium.com/max/1024/1*qaGI-J0dPxWUwL11g3GEGA.png" /><figcaption>Peppol discovery chain visualized by Node42 Discovery API</figcaption></figure><blockquote>Any break — DNS propagation delay, SMP downtime, hash mismatch, expired cert — breaks delivery. No fallback routing exists by design (decentralized resilience).</blockquote><h4>Why the “Hidden” Complexity Matters</h4><ul><li><strong>For implementers</strong> — Building or integrating an Access Point? You must handle DNS quirks, XML parsing, signature validation, error codes from SML/SMP.</li><li><strong>For businesses </strong>— “Why isn’t my invoice arriving?” Often traces back to discovery misconfiguration, not the document itself.</li><li><strong>Scalability &amp; global reach</strong> — As Peppol expands (Asia, Australia, etc.), more SMPs, more IDs, more edge cases.</li></ul><p>In a world pushing real-time e-invoicing mandates, this elegant DNS+SMP dance keeps Peppol interoperable without a monolithic hub. But master it, and you unlock truly borderless B2B exchange. Or ignore it, and spend days debugging why invoices vanish into the void…</p><h4>Want to Go Deeper?</h4><p>The discovery mechanism described in this article is based on the official Peppol specifications. Use the links below to get more information:</p><ul><li><a href="https://peppol.org/what-is-peppol/peppol-interoperability-framework/">OpenPeppol Interoperability Framework</a></li><li><a href="https://docs.peppol.eu/edelivery/smp/Peppol-EDN-Service-Metadata-Publishing-1.4.0-2025-02-06.pdf">Peppol eDelivery Network SMP Specification v1.4.0</a></li><li><a href="https://docs.peppol.eu/edelivery/sml/Peppol-EDN-Service-Metadata-Locator-1.3.0-2025-02-06.pdf">Peppol Service Metadata Locator (SML) v1.3.0</a></li><li><a href="https://docs.peppol.eu/edelivery/as4/specification/">Peppol AS4 Profile v2.0.3</a></li><li><a href="https://www.node42.dev/docs/discovery">Node42 Discovery API</a></li><li><a href="https://www.node42.dev/">Node42 Web UI</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31f6d608068c" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>