Uitsmijter 0.10: Enterprise-Grade JWT Signing with JWKS Support
Posted on November 8, 2025 • 5 min read • 1,058 wordsIntroducing RS256 asymmetric signing, automatic key rotation, and RFC 7517-compliant JWKS endpoints. Uitsmijter 0.10 brings production-ready JWT management with zero-downtime migration from HS256.

One of the most requested features for production deployments is finally here: JSON Web Key Set (JWKS) support with RS256 asymmetric signing. Uitsmijter 0.10 brings enterprise-grade JWT token management that scales seamlessly with Kubernetes horizontal pod autoscaling, includes automatic key rotation, and provides a zero-downtime migration path from HS256.
If you’re running Uitsmijter in production—especially in a microservices architecture or multi-tenant environment—this release fundamentally changes how you manage JWT security.
When using HS256 (HMAC-SHA256), you share a single secret key between your authorization server and every resource server. This creates several operational challenges:
For development environments, HS256 is perfectly adequate. But production deployments deserve better.
RS256 (RSA-SHA256) uses public-key cryptography:
Resource servers automatically fetch public keys from your /.well-known/jwks.json endpoint. When you rotate keys, they automatically discover the new ones. No secret management, no coordination headaches.
Uitsmijter now generates and manages 2048-bit RSA key pairs according to RFC 7517 (JSON Web Key) and RFC 7518 (JSON Web Algorithms) specifications.
Multi-key support: Manages multiple keys simultaneously during rotation periods
Security best practices recommend regular key rotation. Uitsmijter 0.10 automates this:
90-Day Default Lifecycle:
Operational Excellence:
Worried about migrating existing deployments? We’ve made it painless.
Simple Configuration Change:
environment:
- name: JWT_ALGORITHM
value: "RS256"Migration Strategy:
JWT_ALGORITHM=RS256Backward Compatibility:
During migration, SignerManager verifies both HS256 and RS256 tokens. This means:
No downtime. No service disruption. Just better security.
Uitsmijter’s OIDC Discovery endpoint (/.well-known/openid-configuration) now advertises your JWKS endpoint automatically.
Multi-Tenant Support:
Performance Optimizations:
Cache-Control: public, max-age=3600)Standards Compliance:
Works seamlessly with every major OAuth/OIDC library:
oidc-client-ts (JavaScript/TypeScript)jwks-rsa (Node.js)PyJWT (Python)golang-jwt (Go)Uitsmijter generates cryptographically strong RSA keys:
n (modulus) and e (exponent)Start with RS256 from day one:
apiVersion: apps/v1
kind: Deployment
metadata:
name: uitsmijter
spec:
template:
spec:
containers:
- name: uitsmijter
image: uitsmijter/uitsmijter:0.10.0
env:
- name: JWT_ALGORITHM
value: "RS256"
- name: REDIS_HOST
value: "redis-service"
- name: ENVIRONMENT
value: "production"Step 1: Update Resource Servers
Most libraries support JWKS automatically. For example, with oidc-client-ts:
import { UserManager } from 'oidc-client-ts';
const userManager = new UserManager({
authority: 'https://auth.example.com',
client_id: 'your-client-id',
// JWKS is auto-discovered from /.well-known/openid-configuration
});Step 2: Switch Uitsmijter to RS256
Update your deployment configuration:
kubectl set env deployment/uitsmijter JWT_ALGORITHM=RS256Step 3: Monitor and Verify
Check logs for successful key generation:
[INFO] Active key 2025-11-08 is being used for signing
[DEBUG] Signed token with RS256 using kid: 2025-11-08Verify JWKS endpoint:
curl https://auth.example.com/.well-known/jwks.jsonStep 4: (Optional) Remove HS256 Support
After all old tokens expire (2 hours by default), you can remove JWT_SECRET from your configuration.
Node.js with jwks-rsa:
const jwksClient = require('jwks-rsa');
const jwt = require('jsonwebtoken');
const client = jwksClient({
jwksUri: 'https://auth.example.com/.well-known/jwks.json',
cache: true,
cacheMaxAge: 3600000 // 1 hour
});
function getKey(header, callback) {
client.getSigningKey(header.kid, (err, key) => {
callback(null, key.getPublicKey());
});
}
jwt.verify(token, getKey, options, (err, decoded) => {
// Token is verified
});Python with PyJWT:
import jwt
from jwt import PyJWKClient
jwks_client = PyJWKClient('https://auth.example.com/.well-known/jwks.json')
def verify_token(token):
signing_key = jwks_client.get_signing_key_from_jwt(token)
data = jwt.decode(
token,
signing_key.key,
algorithms=["RS256"],
audience="your-client-id"
)
return dataJWKS and RS256 support is just one part of Uitsmijter 0.10. We’re also working on:
Check out the full 0.10 roadmap for details.
Ready to upgrade? Here are the resources you need:
Implementing JWKS support required deep integration across multiple RFCs and standards:
Special thanks to:
This feature represents months of careful engineering to ensure production-grade reliability, security, and performance. We’re committed to making Uitsmijter the most secure and scalable open-source OAuth/OIDC server.
Uitsmijter 0.10 is available soon. Release candidates are available via the --devel flad in helm:
$ helm search repo uitsmijter --versions --devel
uitsmijter/uitsmijter 0.10.0-rc54 rc-ce-0.10.0
uitsmijter/uitsmijter 0.9.7 ce-0.9.7Questions? Join the conversation on Discourse or open an issue on GitHub.