Przejdź do głównej zawartości
getnextpdf.com

Enterprise edycja

Poziomy wiarygodności eIDAS

NextPDF Enterprise przekształca dowody z unijnych list zaufania w jednoznaczny poziom uwierzytelnienia eIDAS (LoA). Usługa NextPDF\Enterprise\Security\Eidas\LoaMapping klasyfikuje jeden wpis usługi zaufania jako Low, Substantial lub High. Zwraca LoaAssertion niosącą poziom oraz maszynowo czytelne kody przyczyn. Twój przepływ pracy może warunkować na uwierzytelnieniu — „wymagaj High” — i archiwizować przyczyny jako dowody audytu. Towarzyszący strażnik, CertPiiGuard, redaguje pola tożsamości podpisującego, zanim rekordy audytu opuszczą proces.

Dwie granice uczciwie ujmują tę możliwość. Po pierwsze, kwalifikacja zawsze należy do dostawcy usług zaufania (TSP) pod nadzorem państwa członkowskiego. NextPDF asertuje klasyfikację nad opublikowanymi dowodami; nigdy nie nadaje, nie przyznaje ani nie certyfikuje kwalifikacji. Po drugie, ta strona obejmuje wyłącznie asercję i mapowanie LoA. Strukturalna polityka PAdES eidasQualified(), wraz z jej kryteriami przejścia/niepowodzenia, jest udokumentowana w Walidacji.

Ta możliwość dostarczana jest w NextPDF Enterprise (nextpdf/enterprise) i aktywuje się kopertą licencyjną poziomu Enterprise. Wdrożenie bez tego uprawnienia nie ładuje klas tej możliwości. Porównaj edycje i uzyskaj licencję.

Okno terminala
composer require nextpdf/enterprise

Metapakiet nextpdf/premium również rozwiązuje pakiet Enterprise. Aktywacja korzysta z Twojej koperty licencyjnej Enterprise; zobacz Licencjonowanie i aktywacja. Klasy eIDAS nie wymagają żadnego rozszerzenia PHP poza bazową linią silnika. Ładują się automatycznie w NextPDF\Enterprise\Security\Eidas i NextPDF\Enterprise\Signature\Eidas.

Rozporządzenie (UE) nr 910/2014 (eIDAS) definiuje trzy poziomy uwierzytelnienia: low, substantial i high (Article 8(1)). Każdy poziom wyraża stopień zaufania do deklarowanej tożsamości. Poziom high dodaje kontrole, których celem jest zapobieganie — a nie jedynie zmniejszanie — nadużyciu lub zmianie tożsamości (Article 8(2)(c)). Article 8 definiuje te poziomy dla systemów identyfikacji elektronicznej. NextPDF ponownie wykorzystuje to samo słownictwo do klasyfikacji dowodów usługi zaufania stojących za certyfikatem podpisu. To ponowne wykorzystanie jest konwencją inżynierską dla warunkowania polityką i audytu, a nie równoważnością prawną.

Enum LoaLevel modeluje te trzy poziomy. Jego wartości bazowe to identyfikatory URI eIDAS LoA, a nie same etykiety, więc utrwalona asercja niesie pełny identyfikator. rank() daje porządek całkowity (Low = 1, Substantial = 2, High = 3), a meetsOrExceeds() porównuje z wymaganą dolną granicą.

LoaMapping oblicza poziom z jednego wpisu listy zaufania — TspService z podsystemu list zaufania Enterprise (NextPDF\Enterprise\Security\Tsl). Mapowanie jest deterministyczne:

Dowody z listy zaufaniaPoziomKody przyczyn
Status usługi inny niż grantedLowservice_not_granted
Typ usługi inny niż CA/QCLowservice_not_qualified_ca
Przyznane CA/QC z QCWithQSCD i bez QCNoQSCDHighca_qc_with_qscd plus esig_or_eseal lub qc_default
Przyznane CA/QC w pozostałych przypadkachSubstantialca_qc_no_qscd_or_unspecified

Kwalifikator QSCD (qualified signature creation device) jest osią. Zgodnie z Article 3(12), kwalifikowany podpis elektroniczny wymaga zarówno kwalifikowanego certyfikatu, jak i kwalifikowanego urządzenia tworzącego. Zawarte na liście zaufania stwierdzenie, że certyfikaty są zarządzane na QSCD, jest zatem dowodem, który wspiera asercję High. Bez tego stwierdzenia przyznane kwalifikowane CA nadal wspiera Substantial, nigdy High.

Wynikiem jest LoaAssertion: poziom plus lista kodów przyczyn. Przyczyny pozwalają konsumentowi audytu ponownie wyprowadzić klasyfikację z tych samych dowodów w późniejszym czasie. Dalsze ewaluatory polityki mogą rejestrować asercję obok wyniku walidacji podpisu.

Jeszcze jeden element dostarczany jest w tym module: CertPiiGuard. Gdy artefakty walidacji są serializowane do pakietów audytu JSON, certyfikat podpisującego niesie dane osobowe — Subject CN, atrybuty e-mail oraz atrybut serialNumber, który dla osób fizycznych może kodować krajowy identyfikator. GDPR Article 5(1)(c) wymaga, aby przetwarzanie było ograniczone do tego, co niezbędne. Strażnik domyślnie redaguje więc te pola, zastępując wartości [REDACTED], zachowując strukturalną kopertę (organizacja, kraj, pola łańcucha i statusu). Konsumenci mogą nadal zweryfikować, czy podpis przeszedł, nie dowiadując się, kto podpisał.

Nośną decyzją jest oddzielenie asercji uwierzytelnienia od werdyktu walidacji. Walidacja podpisu, zgodnie z ETSI EN 319 102-1, kończy się wskazaniem statusu — TOTAL-PASSED, TOTAL-FAILED lub INDETERMINATE — a ten werdykt należy do warstwy walidacji. Mapowanie LoA to odrębna, odtwarzalna klasyfikacja nad dowodami z listy zaufania, z kodami przyczyn zamiast samej etykiety. Zapobiega to, aby NextPDF kiedykolwiek przedstawił roszczenie o uwierzytelnieniu jako wynik walidacji lub wynik walidacji jako nadanie kwalifikacji. Czyni to również mapowanie z konstrukcji zachowawczym: brakujące lub niejednoznaczne dowody obniżają poziom, nigdy go nie podnoszą.

Tło projektowe: Kwalifikowane podpisy, wyjaśnione.

Wszystkie symbole poniżej są publicznym API w nextpdf/enterprise 3.1.0.

enum LoaLevel: string
{
case Low = 'http://eidas.europa.eu/LoA/low';
case Substantial = 'http://eidas.europa.eu/LoA/substantial';
case High = 'http://eidas.europa.eu/LoA/high';
public function rank(): int
public function meetsOrExceeds(self $required): bool
}

Zgłasza lub kończy się niepowodzeniem z: nic z rank() ani meetsOrExceeds(). Natywna konstrukcja enum przez LoaLevel::from() zgłasza \ValueError przy nierozpoznanym URI; LoaLevel::tryFrom() zwraca zamiast tego null.

final class LoaMapping
{
public function loaForService(TspService $service): LoaAssertion
}

Zgłasza lub kończy się niepowodzeniem z: nic. Metoda jest totalna — każde wejście TspService daje LoaAssertion.

Wejściowe DTO NextPDF\Enterprise\Security\Tsl\TspService i NextPDF\Enterprise\Security\Tsl\TspServiceQualifier to stabilne publiczne DTO (@api). Mapowanie odczytuje TspService::STATUS_GRANTED, TspService::TYPE_CA_QC oraz stałe kwalifikatorów TspServiceQualifier::QSCD_STATEMENT (QCWithQSCD), TspServiceQualifier::NO_QSCD (QCNoQSCD), TspServiceQualifier::FOR_ESIG i TspServiceQualifier::FOR_ESEAL.

final readonly class LoaAssertion
{
/**
* @param list<non-empty-string> $reasons Machine-readable reason codes for the assertion.
*/
public function __construct(
public LoaLevel $level,
public array $reasons,
) {}
}

Zgłasza lub kończy się niepowodzeniem z: nic. Niezmienny obiekt wartości.

final readonly class CertPiiGuard
{
public function __construct(
private bool $disclosePii = false,
) {}
public function disclosesPii(): bool
public function guardSignerCommonName(string $signer): string
public function guardDistinguishedName(string $dn): string
public function guardTsaName(string $tsaName): string
public function guardRootIssuer(string $issuer): string
public function guardChainIssue(string $issue): string
}

Zgłasza lub kończy się niepowodzeniem z: nic. Strażnicy to czyste transformacje łańcuchów. Na składniku DN, którego nie da się pewnie stokenizować, strażnik zawodzi zamknięcie i redukuje składnik do [REDACTED], zamiast emitować częściowo zamaskowaną wartość.

Sparsuj URI LoA i porównaj go z wymaganą dolną granicą.

loa-quick-start.php
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Security\Eidas\LoaLevel;
// A LoA URI as persisted in an audit record or received from a peer system.
$uri = 'http://eidas.europa.eu/LoA/substantial';
try {
$level = LoaLevel::from($uri);
} catch (\ValueError $e) {
// Unknown URI: refuse to classify. Never guess an assurance level.
echo "Unrecognized LoA URI: {$uri}\n";
exit(1);
}
echo 'Level: ' . $level->name . ' (rank ' . $level->rank() . ")\n";
echo 'Meets substantial: ' . ($level->meetsOrExceeds(LoaLevel::Substantial) ? 'yes' : 'no') . "\n";
echo 'Meets high: ' . ($level->meetsOrExceeds(LoaLevel::High) ? 'yes' : 'no') . "\n";

Oczekiwane wyjście:

Level: Substantial (rank 2)
Meets substantial: yes
Meets high: no

Sklasyfikuj wpis listy zaufania, zwaruj na wymaganym poziomie i wyemituj zredagowany rekord audytu.

loa-audit-gate.php
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Security\Eidas\LoaLevel;
use NextPDF\Enterprise\Security\Eidas\LoaMapping;
use NextPDF\Enterprise\Security\Tsl\TspService;
use NextPDF\Enterprise\Security\Tsl\TspServiceQualifier;
use NextPDF\Enterprise\Signature\Eidas\CertPiiGuard;
// Normally produced by the Enterprise trusted-list subsystem from a
// member-state TSL; constructed inline here for a self-contained example.
$caPem = (string) file_get_contents(__DIR__ . '/example-qc-ca.pem');
$service = new TspService(
tspName: 'Example Qualified TSP',
serviceName: 'Example Qualified CA G2',
serviceTypeIdentifier: TspService::TYPE_CA_QC,
serviceStatus: TspService::STATUS_GRANTED,
statusStartingTime: '2024-01-01T00:00:00Z',
serviceCertificatePem: $caPem,
qualifiers: [
new TspServiceQualifier(qualifierUri: TspServiceQualifier::QSCD_STATEMENT),
new TspServiceQualifier(qualifierUri: TspServiceQualifier::FOR_ESIG),
],
additionalServiceInformation: [],
);
try {
// Required floor from deployment configuration; defaults to High.
$required = LoaLevel::from(getenv('LOA_REQUIRED') ?: LoaLevel::High->value);
} catch (\ValueError $e) {
echo "Invalid LOA_REQUIRED URI; refusing to continue.\n";
exit(1);
}
$mapping = new LoaMapping();
$assertion = $mapping->loaForService($service);
// Privacy by default: signer identity fields are redacted in audit output.
$guard = new CertPiiGuard();
$audit = [
'loa' => $assertion->level->value,
'reasons' => $assertion->reasons,
'meets_required' => $assertion->level->meetsOrExceeds($required),
'signer' => $guard->guardSignerCommonName('CN=Jane Example, O=Example Corp, C=DE'),
];
echo json_encode($audit, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";

Oczekiwane wyjście:

{
"loa": "http://eidas.europa.eu/LoA/high",
"reasons": [
"ca_qc_with_qscd",
"esig_or_eseal"
],
"meets_required": true,
"signer": "CN=[REDACTED], O=Example Corp, C=DE"
}
  • LoaLevel::from() zgłasza \ValueError przy nieznanych URI. Użyj LoaLevel::tryFrom() tam, gdzie obsługa null jest korzystniejsza.
  • Sprzeczne dowody o urządzeniu pozostają zachowawcze. Usługa niosąca zarówno QCWithQSCD, jak i QCNoQSCD mapuje się na Substantial, nie High.
  • Przyznana usługa CA/QC bez kwalifikatorów mapuje się na Substantial z przyczyną ca_qc_no_qscd_or_unspecified — kwalifikowana domyślnie, urządzenie niedowiedzione.
  • URI kwalifikatorów spoza śledzonego zbioru nie wpływają na klasyfikację. Nieznane lub przyszłe kwalifikatory nigdy nie podnoszą poziomu.
  • Mapowanie odczytuje wyłącznie bieżący status usługi. Nie ewaluuje historii statusStartingTime; okna punktu w czasie należą do warstwy walidacji.
  • Utrwalaj bazowe URI enuma, a nie liczbę całkowitą rank(). Rangi istnieją wyłącznie dla porównania.
  • CertPiiGuard redukuje samą nazwę bez = w całości do [REDACTED]; puste łańcuchy przechodzą przez wszystkich strażników bez zmian.
  • Starsze DN OpenSSL rozdzielone ukośnikami są wykrywane i maskowane strukturalnie. / wewnątrz wartości RFC 4514 jest traktowane jako treść, a nie separator.
  • Atrybuty DN niebędące PII (O, OU, C, ST, L) są zachowywane, więc rozumowanie o jurysdykcji przetrwa redakcję.
  • Prywatność domyślnie. Konstruktor strażnika domyślnie ustawia disclosePii: false. Konstruuj new CertPiiGuard(disclosePii: true) tylko tam, gdzie posiadasz udokumentowaną podstawę prawną przetwarzania tożsamości podpisującego. Realizuje to minimalizację danych z GDPR Article 5(1)(c) na granicy serializacji.
  • Redakcja zawodząca zamknięcie. Gdy składnika DN nie da się pewnie stokenizować, cały składnik redukuje się do [REDACTED]. Kontrola prywatności nigdy nie zawodzi otwarciem.
  • Deterministyczne wyjście. Strażnicy używają czystego przetwarzania łańcuchów — bez zegarów, bez losowości — więc zamaskowane wyjście jest bajtowo stabilne dla identycznego wejścia. Stabilne wyjście utrzymuje sensowność różnic audytu.
  • Redakcja to nie szyfrowanie. [REDACTED] usuwa wartość z rekordu. Jeśli potrzebujesz odzyskiwalnej tożsamości, przechowuj ją oddzielnie pod własną podstawą prawną i kontrolą dostępu.
  • Śmieci na wejściu, śmieci na wyjściu. LoaAssertion jest tak wiarygodna, jak dowody z listy zaufania stojące za nią. Pozyskuj i sprawdzaj podpisem listy zaufania przez podsystem list zaufania Enterprise, zanim podasz wpisy do mapowania.

NextPDF Enterprise implementuje zachowanie oparte na Rozporządzeniu (UE) nr 910/2014 Article 8 (poziomy uwierzytelnienia) i Article 3(12) (elementy kwalifikowanego podpisu elektronicznego) oraz na słowniku kwalifikatorów list zaufania ETSI. Wsparcie to nie zgodność, a zgodność to nie certyfikacja. NextPDF nie posiada żadnej certyfikacji i żadnej nie nadaje. NextPDF nie jest kwalifikowanym dostawcą usług zaufania, nie jest jednostką oceniającą zgodność ani organem nadzoru. LoaAssertion jest programową klasyfikacją opublikowanych dowodów. Nie jest prawnym ustaleniem kwalifikacji ani uwierzytelnienia i nie może uczynić podpisu kwalifikowanym.

Rozporządzenie (UE) 2024/1183 (eIDAS 2) nadal odwołuje się do poziomów z Article 8 i wymaga, aby europejskie portfele tożsamości cyfrowej były dostarczane na poziomie uwierzytelnienia high. Ta strona cytuje to jako kontekst regulacyjny; NextPDF nie zgłasza żadnego roszczenia o możliwości związanej z portfelem.

Czy konkretny podpis spełnia strukturalną politykę zorientowaną na eIDAS, to odrębne pytanie, na które odpowiada moduł walidacji; zobacz Walidację.

Klasy eIDAS LoA nie wykonują żadnych operacji kryptograficznych — bez haszowania, bez weryfikacji podpisu, bez losowości. Polityka trybu FIPS Enterprise warunkuje wybory kryptograficzne, więc nie ma niczego do warunkowania w tym module. Włączenie trybu FIPS nie zmienia mapowania LoA ani zachowania strażnika PII. Weryfikacja kryptograficzna podpisów i list zaufania jest regulowana przez moduły weryfikacji i bezpieczeństwa, gdzie stosuje się polityka trybu FIPS.

  • LoaMapping::loaForService() jest totalna i deterministyczna. Każdy TspService daje LoaAssertion; metoda nigdy nie zgłasza i nie odczytuje żadnego zegara, sieci ani stanu globalnego.
  • Klasyfikacja jest zachowawcza. Brakujące, nieznane lub sprzeczne dowody obniżają poziom; nic go nie podnosi poza jawnymi dowodami przyznanego CA/QC z QSCD.
  • Kody przyczyn są maszynowo czytelne i stabilne: service_not_granted, service_not_qualified_ca, ca_qc_with_qscd, esig_or_eseal, qc_default, ca_qc_no_qscd_or_unspecified.
  • Porządek poziomów jest stały: Low < Substantial < High, udostępniony przez rank() i meetsOrExceeds().
  • CertPiiGuard domyślnie redaguje i zawodzi zamknięcie przy wątpliwości tokenizacji. Z disclosePii: true każdy strażnik zwraca swoje wejście dosłownie.
  • Wyjście strażnika jest bajtowo stabilne dla identycznego wejścia.

NextPDF Core weryfikuje podpisy PDF kryptograficznie i zawodzi zamknięcie przy uszkodzonych dowodach. Core nie ma modelu unijnych list zaufania, słownika LoaLevel, mapowania LoA ani strażnika PII warstwy eIDAS dla serializacji audytu. Na samym Core musisz sam wyprowadzić klasyfikacje uwierzytelnienia z danych zaufania, które utrzymujesz, i zastosować własną redakcję, zanim rekordy audytu opuszczą proces.

Ta strona dokumentuje wyłącznie zewnętrznie obserwowalne zachowanie i wspierany publiczny obszar API. Wewnętrzne ścieżki przestrzeni nazw, klasy pomocnicze, tabele mechanizmów, nazwy plików runbook i prefiksy zgłoszeń są poza zakresem.