The promise of verifiable credentials is portability: get a credential once, use it everywhere. The reality is more complicated.
The Interoperability Landscape
Despite W3C VC 2.0 being a standard, implementations vary significantly:
Format Fragmentation
| Format | Proponents | Adoption |
|---|---|---|
| JWT-VC | Microsoft, MATTR | High (enterprise) |
| JSON-LD + LD Proofs | W3C purists | Medium |
| SD-JWT | IETF, EU EUDI | Growing |
| AnonCreds | Hyperledger | Government/healthcare |
| mDL (ISO) | Government | High (ID cards) |
A credential issued in one format may not be verifiable by a system expecting another.
DID Method Incompatibility
VC signed by: did:ebsi:zf1F3s... (EU government issuer)
Verifier supports: did:web, did:ethr
Result: Verification fails - unknown DID method
Each DID method requires specific resolution logic. A verifier that doesn’t support your issuer’s DID method cannot verify your credential.
Current DID Method Support
| DID Method | Resolver Availability | Common Use |
|---|---|---|
| did:web | Universal | Enterprise |
| did:key | Universal | Ephemeral |
| did:ethr | Web3 focused | DeFi/DAO |
| did:ion | Microsoft | Enterprise |
| did:ebsi | EU only | Government |
| did:cheqd | Emerging | SSI networks |
Security Implications
1. Trust Registry Fragmentation
Each ecosystem has its own list of trusted issuers:
- EU: EBSI Trust Registry
- US: No central registry (fragmented by sector)
- Web3: Reputation-based or none
Cross-ecosystem verification requires trust bridging, which introduces security decisions:
“If an issuer is trusted by EBSI but not in our registry, do we accept their credentials?”
2. Cryptographic Algorithm Mismatches
Issuer uses: Ed25519 (modern, secure)
Verifier supports: Only P-256 ECDSA (legacy)
Result: Valid credential cannot be verified
Algorithm support varies widely:
| Algorithm | Security | Support | Recommendation |
|---|---|---|---|
| RS256 | Legacy | Universal | Avoid |
| ES256 (P-256) | Good | Universal | Safe default |
| EdDSA (Ed25519) | Better | Growing | Preferred |
| BBS+ | Best (privacy) | Limited | Privacy use cases |
3. Schema and Context Drift
JSON-LD credentials rely on external context files. What happens when:
- Context URL becomes unavailable?
- Context definition changes?
- Malicious context is served?
Mitigation: Cache and pin context files. Never fetch contexts at verification time.
Real-World Interop Failures
Case 1: EU Pilot Cross-Border Issues
During EUDI pilots, credentials issued by Country A failed verification in Country B due to:
- Different SD-JWT claim naming conventions
- Incompatible revocation list formats
- Trust registry synchronization delays
Case 2: Enterprise SSI Network
A consortium of banks built an inter-bank credential system. It failed when:
- One bank upgraded their DID method
- Old credentials couldn’t be verified against new DID documents
- No migration path was defined
Interoperability Testing
Before deploying, test against multiple verifiers:
# Test your VC against multiple verifiers
curl -X POST https://verifier1.example/verify -d @credential.json
curl -X POST https://verifier2.example/verify -d @credential.json
curl -X POST https://verifier3.example/verify -d @credential.json
The W3C has interoperability test suites, but real-world coverage is limited.
Security Recommendations
- Support multiple formats: Don’t bet on one standard winning
- Implement format conversion: JWT-VC ↔ JSON-LD where possible
- Pin DID methods: Document which methods you support and test regularly
- Cache contexts: Never rely on external URL availability
- Test cross-ecosystem: Your VC should work outside your bubble
The Path Forward
Interoperability will improve through:
- OID4VC adoption: Standard transport layer reduces friction
- Universal resolver: DIF Universal Resolver supports 50+ DID methods
- Convergence pressure: EUDI mandate forces alignment
- Bridge services: Convert between formats as needed
The technology is standardized. The implementations need alignment. Until then, “universal” credentials aren’t quite universal.