Observability
This release brings a major overhaul to Signatory's metrics and operational visibility:
- Sign handler metrics: New
sign_handler_request_duration_millisecondshistogram andsign_handler_requests_totalcounter for the signing endpoint, labeled by address, status, and request type (#738) - Watermark operation metrics: New
watermark_check_duration_millisecondshistogram and counters for watermark check success/errors across file, DynamoDB, and Firestore backends (#737) - Consensus round visibility: New
consensus_round_totalPrometheus counter withaddress,operation_type,chain_id, androundlabels. Consensus round is now included in log output for block, attestation, and preattestation operations. Includes a Grafana dashboard panel for round distribution. (#785) - Metrics correctness: Fixed
signing_ops_totalnot incrementing for non-generic operations (#723). Fixed incorrect metric behavior on failed sign requests, including properchain_idlabeling and error-only counter increments on failures (#727) - Metrics documentation: New
docs/metrics.mdreference with example PromQL queries
Security & Hardening
- Non-root container: Signatory Docker images now run as user
signatory(UID 10000) instead of root (see Migration Notes) (#732) - JWT hardening: Constant-time comparison for JWT authentication, mutex protection for the JWT credential map, and nil middleware guard when JWT is disabled (#729, #774)
- Dependency hygiene: Inlined AES Key Wrap (KWP) from the archived Google Tink module, removing the dependency (#770). Upgraded
golang.org/x/netto v0.51.0 (GO-2026-4559) (#773) - Panic removal: Replaced
panic()calls in production code paths with proper error returns (#769) - Defensive fixes: Guarded against nil dereference in
GenerateTokenand bare type assertion in watermark rejection metrics (#787)
Improvements
- Cloud KMS resilience: Configurable
timeoutandmax_retriesfor Google Cloud KMS signing operations with exponential backoff (#728) - KMS key discovery: Signatory now gracefully skips inaccessible, disabled, or permission-denied keys during AWS KMS and Google Cloud KMS vault iteration instead of failing entirely (#739)
- Public key listing: New
signatory-cli list-keyssupport (#735) - Ballot sub-kind validation: Fixed a regression where
ballot:yay,ballot:nay, andballot:passwere rejected inallow.genericpolicy configuration. Thanks to @vch9 for the initial fix. (#755, #768) - Block round validation: Upgraded gotez to v2.4.3 to fix block round validation (#764)
- Nitro Enclave permissions: Replaced
--privilegedDocker flag with a scoped seccomp profile for VSock support (#736)
Portable Standalone Binaries
Release archive binaries are now built with zig cc targeting glibc 2.17+, making them portable across virtually all Linux distributions. This fixes the glibc 2.38 dependency in earlier builds that broke Amazon Linux 2023 and other older distributions. Unlike static linking, these binaries support dlopen, so PKCS11/CloudHSM works in standalone mode without Docker. (#777, #779)
Documentation
- Expanded Nitro Enclave page into a full deployment guide covering AWS infrastructure prerequisites, combined KMS + Nitro configuration examples, systemd service units, KMS key policy with PCR0 attestation, remote baker connectivity patterns, and a deployment verification checklist (#776)
Build & Dependencies
- Go 1.25 and GoReleaser v2 (#761)
- gotez v2.4.3 (#764)
- Removed Darwin and Linux/ARMv6 build targets. ARMv7 and ARM64 builds continue to ship; Raspberry Pi 2+ remains supported. (#763)
- CI workflow cleanup: concurrency controls, pinned third-party actions (#767)
- Bumped AWS SDK, GCP KMS, gRPC, and Google API dependencies (#786)
Migration Notes
Non-root container: The Docker image now runs as user signatory (UID 10000) instead of root. If you volume-mount directories for watermark files, configuration, or TLS certificates, ensure they are readable (and writable where needed) by UID/GID 10000. You can customize the UID/GID at build time with --build-arg UID=<uid> --build-arg GID=<gid>. The base image has also changed from debian:buster-slim to ubuntu:24.04. (#732)
Nitro Enclave users: If you run Signatory in Docker with VSock access, the recommended approach is now a scoped seccomp profile instead of --privileged. See the updated Nitro Enclave documentation for details. (#736)
No breaking API or configuration changes. Existing configurations continue to work without modification.
New Contributors
Docker
docker pull ecadlabs/signatory:v1.4.0
docker pull ecadlabs/signatory:latest