-
Notifications
You must be signed in to change notification settings - Fork 18
Peppol Specifics
This page lists all aspects of phoss-ap that are specific to the Peppol network. If the AP were to be adapted for a different e-delivery network, these are the areas that would need review and likely modification.
Peppol defines its own participant identifier scheme (iso6523-actorid-upis) with specific format rules.
| Identifier | Peppol format | Used in |
|---|---|---|
| Participant ID (sender/receiver) | Scheme + value, e.g. 0088:1234567890
|
Outbound submission, SMP lookup, SBDH, reporting |
| Document Type ID | Peppol-defined URN scheme | SMP lookup, SBDH, reporting |
| Process ID | Peppol-defined URN scheme | SMP lookup, SBDH, reporting |
| Seat ID | AP registration ID, e.g. POP000000
|
Configuration, inbound metadata |
Difference in other networks: Identifier formats, schemes, and registries would differ entirely.
Peppol mandates the use of a Standard Business Document Header (SBDH) as the envelope around the business document. The combined package (SBDH + payload) is the Standard Business Document (SBD).
- The AP creates the SBDH when the Sender Backend submits a raw document + metadata
- The AP extracts metadata from the SBDH when receiving a pre-built SBD
- SBDH extensions carry Peppol-specific fields (e.g.,
MLS_TO, C1 country code) - The SBDH Instance Identifier is the primary correlation key across MLS, reporting, and duplicate detection
Difference in other networks: Different envelope formats (or none). SBDH extensions are Peppol-specific.
Peppol uses a two-tier discovery mechanism:
- SML (Service Metadata Locator): DNS-based lookup to find which SMP hosts a given participant
- SMP (Service Metadata Publisher): REST service that returns the AS4 endpoint URL, certificate, and supported document types for a participant
The AP queries the SMP before each outbound send to resolve the C3 endpoint. The receiver verification step (IReceiverCheck) may also query the AP's own SMP registration.
Configuration: smpclient.truststore.*, peppol.stage (test vs. prod determines SML endpoint).
Difference in other networks: Different or no discovery protocol. Endpoint resolution may be static, registry-based, or use a completely different mechanism.
Peppol defines a specific AS4 profile on top of the OASIS ebMS3/AS4 standard, including:
- Specific PMode parameters (agreement, service, action values)
- One-way push MEP (Message Exchange Pattern)
- Mandatory message signing and encryption
- Synchronous AS4 Receipt expected
- Specific error codes, e.g.
EBMS:0004witherrorDetail = PEPPOL:NOT_SERVICED
The phase4 library (phase4-peppol-client, phase4-peppol-servlet) implements this Peppol-specific AS4 profile.
Difference in other networks: Different AS4 profile, different PMode parameters, or a completely different transport protocol.
Peppol operates its own Public Key Infrastructure (PKI) with separate trust hierarchies for test and production:
- AP keystore: Contains the AP's Peppol-issued certificate and private key for AS4 signing/decryption
- AP truststore: Contains the Peppol root/intermediate CA certificates for validating remote AP signatures
- SMP client truststore: For validating SMP server TLS certificates
-
peppol.stage(testorprod) selects which PKI chain is active - CRL (Certificate Revocation List) downloads are Peppol-specific
Configuration: org.apache.wss4j.crypto.merlin.keystore.*, org.apache.wss4j.crypto.merlin.truststore.*
Difference in other networks: Different CA hierarchy, different certificate issuance process, potentially different crypto requirements.
MLS is a Peppol-defined asynchronous feedback mechanism:
- C3 sends an MLS response back to C2 after processing an inbound document
- MLS is itself sent as a regular Peppol AS4 message (reusing the sending infrastructure)
- Three response codes: RE (Rejection), AP (Approved), AB (Accepted Blind)
- MLS_TO: Alternative participant ID for MLS routing (per-transaction, from SBDH extension)
-
MLS_TYPE: Controls when MLS is sent —
FAILURE_ONLYorALWAYS_SEND(per AP instance)
The Peppol Network Policy defines timing requirements based on AS4 timestamps:
| Milestone | Definition |
|---|---|
| M1 | AS4 Timestamp when business document is sent at C2 |
| M2 | AS4 Timestamp when MLS message is sent at C3 |
| M3 | Date/time when MLS is received at C2 |
| SLR | Requirement |
|---|---|
| MLS-1 | 99.5%: M2 - M1 <= 20 minutes |
| MLS-2 | 99.5%: M3 - M1 <= 25 minutes |
Difference in other networks: MLS is entirely Peppol-specific. Other networks may have no delivery status mechanism, or use a different protocol (e.g., MDNs, polling).
Peppol requires APs to submit periodic Transaction Status Reports (TSR) and End User Statistics Reports (EUSR):
- Reports are generated using the
peppol-reportinglibrary - Submission is scheduled (configurable day/hour/minute)
- Each reported transaction needs: sender ID, receiver ID, document type ID, process ID, C1 country code (outbound) or C4 country code (inbound)
- Reporting status is tracked per transaction (
pending/reported) - The reporting sender ID is a Peppol Participant ID configured via
peppol.reporting.senderid
Difference in other networks: Different or no reporting requirements. Report formats, submission schedules, and required data points would differ.
Peppol requires country codes for reporting purposes:
-
C1 country code: Country of the original sender (C1). Provided by the Sender Backend (C2) at submission time (or extracted from SBDH). Stored in
outbound_transaction. -
C4 country code: Country of the final receiver (C4). Provided by the Receiver Backend (C3) either synchronously (HTTP response) or asynchronously (reporting API call). Stored in
inbound_transaction.
Difference in other networks: These are Peppol reporting requirements. Other networks may not need corner-specific country tracking.
Peppol requires that a receiving AP (C3) verifies it actually services the addressed receiver participant before accepting a document. If not, the specific AS4 error EBMS:0004 / PEPPOL:NOT_SERVICED must be returned.
Implementations: SMP self-query, local participant registry, or other pluggable mechanism (IReceiverCheck SPI).
Difference in other networks: Different error codes, different verification requirements, or no receiver check at all.
Peppol duplicate detection operates at two levels:
| Level | What it checks |
|---|---|
| AS4 Message ID | Exact AS4 message retransmission |
| SBDH Instance Identifier | Same Peppol envelope resent with a different AS4 Message ID |
Both levels are Peppol-relevant because the SBDH Instance Identifier is a Peppol concept.
Difference in other networks: Different envelope identifiers, potentially different duplicate detection granularity.
phoss-ap uses the Peppol 4-corner model throughout:
| Term | Meaning |
|---|---|
| C1 | Sender (business entity) |
| C2 | Sender Access Point |
| C3 | Receiver Access Point |
| C4 | Receiver (business entity) |
| Sender Backend | Internal system within C2 that submits documents to the AP |
| Receiver Backend | Internal system within C3 that receives documents from the AP |
Difference in other networks: Different terminology (e.g., "gateway", "connector", "node"), potentially a different number of corners (3-corner, 2-corner).
The outbound_transaction table has a transaction_type field distinguishing business_document from mls_response. MLS responses are tracked as outbound transactions with a link back to the originating inbound transaction.
Difference in other networks: Without MLS, there is no secondary transaction type. The outbound table would only contain business documents.
The following Maven dependencies are Peppol-specific:
| Dependency | Purpose |
|---|---|
phase4-peppol-client |
Peppol AS4 profile for sending |
phase4-peppol-servlet |
Peppol AS4 profile for receiving |
peppol-commons |
Peppol identifier handling, SBDH, SMP client |
peppol-reporting |
TSR/EUSR report generation and submission |
Difference in other networks: Would require different phase4 profile modules (or a different AS4 library entirely) and different reporting libraries.
| Property | Purpose |
|---|---|
peppol.stage |
test or prod (selects PKI and SML) |
peppol.seatid |
This AP's Peppol Seat ID |
peppol.owner.countrycode |
Country code of the AP operator |
peppol.sending.enabled |
Enable/disable outbound sending |
peppol.receiving.enabled |
Enable/disable inbound receiving |
peppol.reporting.senderid |
Participant ID for reporting submission |
peppol.reporting.scheduled |
Enable scheduled reporting |
peppol.reporting.schedule.* |
Reporting schedule (day, hour, minute) |
mls.type |
MLS sending strategy |
phase4.endpoint.address |
Public AS4 endpoint URL |
smpclient.truststore.* |
SMP client TLS trust |
Difference in other networks: Entirely different configuration namespace and semantics.
It is appreciated if you star the GitHub project if you like it.
Donation link: https://paypal.me/PhilipHelger
- Home
- News and noteworthy
- Running phoss AP
- Architecture Overview
- API Specification
- Configuration Properties
- Code Lists
- Database Design Notes
- Maven Module Structure
- Runtime Extensions
- OpenTelemetry Integration
- Security Considerations
- Peppol Specifics
- Testing Without Peppol Network
- Known Users
- Migrating from phase4-peppol-standalone
- Contributing