5.5 KiB
5.5 KiB
PKI API - Instructions pour les Agents IA
Architecture Générale
Cette API Go gère une Infrastructure à Clé Publique (PKI) complète :
- API REST (port 8080, framework Gin) : Endpoints pour CA, certificats, révocation
- Authentication JWT : Tous les endpoints (sauf
/login) nécessitent un token JWT valide - Storage (
internal/storage/) : Abstraction de stockage avec implémentations multiples- MemoryStore : Stockage en mémoire (développement, tests)
- MongoStore : Persistance MongoDB (production)
- PKI Core (
internal/pki/) : Logique crypto (génération certificats, validation) - Auth (
internal/auth/) : Gestion JWT et middleware - Config (
internal/config/) : Gestion de la configuration centralisée - Handlers (
internal/api/router.go) : Points d'entrée HTTP
Conventions du Projet
Structure des Répertoires
cmd/: Point d'entrée applicationinternal/: Code privé du packagepkg/: Code réutilisable publicinternal/api/: Handlers Gin et routageinternal/auth/: JWT manager et middlewaresinternal/pki/: Logique métier PKI (crypto, certificats)internal/storage/: Abstraction persistance
Patterns de Code
Gestion des Erreurs : Utiliser les patterns classiques Go
if err != nil {
return nil, err // Propager sans wrapper sauf cas spécial
}
Concurrence : sync.RWMutex pour le Store (voir internal/storage/store.go)
Certificats X.509 : Utiliser crypto/x509, crypto/rsa, crypto/rand (stdlib)
JWT : Utiliser github.com/golang-jwt/jwt/v5 avec ClaimsValidator intégré
Authentification JWT
Structure des Claims :
type Claims struct {
UserID string
Role string
jwt.RegisteredClaims
}
Middleware :
AuthMiddleware(jwtManager): Bloque les requêtes sans token valideOptionalAuthMiddleware(jwtManager): Accepte les requêtes sans token
Endpoints non sécurisés :
POST /api/v1/login: Obtenir un token
Tous les autres endpoints : Nécessitent l'header Authorization: Bearer <token>
Workflows Critiques
Compiler et Lancer
go mod download
go build -o pkiapi ./cmd/main.go
./pkiapi
Tester avec authentification
# 1. Obtenir un token
TOKEN=$(curl -X POST http://localhost:8080/api/v1/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin"}' | jq -r '.token')
# 2. Utiliser le token
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/v1/certificates
Points d'Intégration Clés
- Gin Router : Tous les endpoints déclarés dans
RegisterRoutes(), JWT manager injecté - Store singleton : À implémenter comme dépendance injectée dans handlers
- Crypto stdlib : Pas de dépendances externes pour cryptographie
- JWT Manager : Créé dans
RegisterRoutes(), disponible en middleware
Variables d'Environnement
Configuration Générale
PORT: Port du serveur (défaut:8080)JWT_SECRET_KEY: Secret pour signer les tokens (défaut:your-secret-key-change-in-prod)
Configuration du Stockage
STORAGE_TYPE: Type de stockage (memoryoumongodb, défaut:memory)MONGO_URI: URI de connexion MongoDB (défaut:mongodb://localhost:27017)MONGO_DB: Nom de la base de données MongoDB (défaut:pkiapi)
Exemples de Configuration
Mode Développement (MemoryStore)
export STORAGE_TYPE=memory
export PORT=8080
./pkiapi
Mode Production (MongoDB)
export STORAGE_TYPE=mongodb
export MONGO_URI=mongodb://mongodb-server:27017
export MONGO_DB=pkiapi-prod
export JWT_SECRET_KEY=super-secret-key
./pkiapi
Couche de Stockage
Architecture Abstraction
La couche stockage utilise une interface CertificateStore pour permettre l'injection de dépendances :
type CertificateStore interface {
SaveCertificate(id string, cert *pki.Certificate) error
GetCertificate(id string) (*pki.Certificate, error)
ListCertificates() []*pki.Certificate
Close() error
}
Implémentations
MemoryStore
- Utilise
sync.RWMutexpour la concurrence - Stockage en mémoire avec
map[string]*pki.Certificate - Approprié pour développement et tests
- Données perdues à l'arrêt du serveur
MongoStore
- Driver officiel MongoDB (
go.mongodb.org/mongo-driver) - Collection
certificatesavec indexation automatique - Sérialisation:
- Clés privées RSA: PKCS#8 + base64
- Certificats X.509: DER + base64
- Métadonnées: BSON natif
- Contextes avec timeout 10s pour fiabilité
- Approprié pour production avec haute disponibilité
Utilisation dans les Handlers
// Dans main.go
cfg := config.LoadConfig()
if cfg.StorageType == "mongodb" {
mongoStore, _ := storage.NewMongoStore(cfg.MongoURI, cfg.MongoDB)
api.RegisterRoutesWithStore(router, mongoStore, mongoStore)
} else {
memStore := storage.NewMemoryStore()
api.RegisterRoutesWithStore(router, memStore, memStore)
}
Domaines à Implémenter
- CA Management ✅ : Création/gestion autorités de certification
- Certificate Lifecycle ✅ : Génération, validation, révocation (avec authentification)
- CRL/OCSP ✅ : Listes révocation et vérification d'état
- Persistence ✅ : Stockage MongoDB avec abstraction pluggable
- User Management : Stocker users/credentials au lieu de simples identifiants
- OCSP Server : Répondeur OCSP pour vérification d'état en temps réel
- HSM Integration : Support matériel de sécurité pour clés privées
- Audit Logging : Journalisation complète des opérations