expo-mutual-tls est un module Expo prêt pour la production qui fournit une authentification par certificat client mutual TLS (mTLS) sécurisée et matériellement sauvegardée pour les applications mobiles. Construit avec des implémentations natives pour iOS (Swift) et Android (Kotlin), il offre des fonctionnalités de sécurité de niveau entreprise avec une API conviviale pour les développeurs.
ExpoMutualTls.ts - Classe utilitaire principale fournissant une API simplifiée
ExpoMutualTls.types.ts - Définitions de types TypeScript
ExpoMutualTlsModule.ts - Exports de module brut
Couche iOS Native (ios/)
ExpoMutualTlsModule.swift - Module iOS principal
KeychainManager.swift - Stockage sécurisé des certificats
CertificateParser.swift - Gestion des formats de certificats
SSLContextManager.swift - Gestion du contexte TLS
NetworkManager.swift - Réseautage HTTP
Couche Android Native (android/)
ExpoMutualTlsModule.kt - Module Android principal
KeychainManager.kt - Stockage sécurisé Android
PemCertificateParser.kt - Analyse des certificats
Utilisation de l'API
Configuration Initiale
import ExpoMutualTls from '@a-cube-io/expo-mutual-tls'// Configurer le module (requis avant utilisation)await ExpoMutualTls.configureP12( 'my-app-identifier', true // Activer logging debug)
Gestion des Certificats P12
// Stocker le certificat P12 dans Keychain sécuriséconst certificateData = await FileSystem.readAsStringAsync( 'path/to/certificate.p12', { encoding: FileSystem.EncodingType.Base64 })await ExpoMutualTls.storeP12(certificateData, 'certificate-password')// Vérifier si le certificat est stockéconst hasP12 = await ExpoMutualTls.hasP12()console.log('Certificate stored:', hasP12)// Supprimer le certificatawait ExpoMutualTls.removeP12()
Effectuer des Requêtes HTTPS Sécurisées
// Requête GET avec mTLSconst response = await ExpoMutualTls.sendRequest( 'https://api.example.com/data', { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer token123' } })console.log('Status:', response.statusCode)console.log('Data:', response.data)// Requête POST avec bodyconst postResponse = await ExpoMutualTls.sendRequest( 'https://api.example.com/submit',
Système d'Événements
// Écouter les événements du moduleconst subscription = ExpoMutualTls.addListener('onMtlsEvent', (event) => { console.log('Event:', event.type, event.data)})// Retirer le listener lorsqu'il n'est plus nécessairesubscription.remove()
Fonctionnalités de Sécurité
Stockage Matériel
Implémentation iOS:
Utilise iOS Keychain Services pour stockage sécurisé
Certificats stockés avec attribut kSecAttrAccessibleWhenUnlockedThisDeviceOnly
Chiffrement matériel sur appareils avec Secure Enclave
Support Touch ID/Face ID pour protection d'accès au certificat
Implémentation Android:
Utilise Android Keystore System pour stockage sécurisé
Clés matérielles sur appareils supportés (Android 6.0+)
Support BiometricPrompt pour authentification
Protection StrongBox Keymaster sur appareils compatibles
Validation des Certificats
// Le module valide automatiquement:// - Chaîne de certificats// - Dates d'expiration// - Extended Key Usage (EKU)// - Vérification hostname (iOS)// - Révocation de certificat (si configuré)
Support Biométrique
// Activer la protection biométrique pour l'accès au certificatawait ExpoMutualTls.configureP12( 'my-app-identifier', true, { requireBiometrics: true, biometricPrompt: { title: 'Authentifier', subtitle: 'Accéder au certificat', description: 'Utilisez la biométrie pour continuer' } })
Caractéristiques de Performance
Benchmarks
Opération
iOS
Android
Configuration Module
~50ms
~80ms
Stockage Certificat P12
~150ms
~200ms
Chargement Certificat depuis Keychain
~30ms
~50ms
Requête HTTPS (mTLS)
~500-800ms
~600-900ms
Authentification Biométrique
~200-500ms
~300-600ms
Optimisations
Mise en Cache: Contexte SSL mis en cache après première initialisation
Thread Safety: Opérations thread-safe avec files dédiées
Gestion Mémoire: Nettoyage approprié des certificats et ressources natives
Gestion d'Erreurs: Récupération automatique des erreurs transitoires
Exemple d'Intégration
Application React Native Complète
import React, { useEffect, useState } from 'react'import { View, Button, Text } from 'react-native'import * as FileSystem from 'expo-file-system'import ExpoMutualTls from '@a-cube-io/expo-mutual-tls'export default function SecureApiScreen() { const [configured, setConfigured] = useState(false) const [data, setData] = useState(null) useEffect(() => { setupMTLS() }, []) const
Stack Technique
Langages
TypeScript (5.0+) - Couche API et types
Swift (5.9+) - Implémentation iOS native
Kotlin (1.9+) - Implémentation Android native
Frameworks & Bibliothèques
Expo Modules Core (2.0+) - Bridge natif
React Native (0.72+) - Framework mobile
expo-module-scripts - Système de build
Dépendances Natives
iOS:
iOS Keychain Services
Security.framework
Foundation.framework
Android:
Android Keystore
BouncyCastle (certificats PEM)
BiometricPrompt API
Conclusion
expo-mutual-tls fournit une authentification mTLS prête pour la production pour les apps Expo/React Native avec un focus sur:
✅ Sécurité: Stockage matériel et authentification biométrique
✅ Multi-plateforme: Base de code unique avec implémentations natives optimisées
✅ Expérience Développeur: API simple avec TypeScript complet
✅ Prêt pour l'Entreprise: Validation des certificats et gestion d'erreurs robuste
✅ Performance: Optimisé pour utilisation production avec mise en cache intelligente
✅ Open Source: Disponible sur GitHub avec licence MIT