Jsign is a Java implementation of Microsoft Authenticode that lets you sign and timestamp executable files for Windows, Microsoft Installers (MSI), Cabinet files (CAB) and scripts. Jsign is platform independent and provides an alternative to native tools like signcode/signtool on Windows or the Mono development tools on Unix systems.
Jsign comes as an easy-to-use task/plugin for the main build systems (Maven, Gradle, Ant). It's especially suitable for signing executable wrappers and installers generated by tools like NSIS, msitools, install4j, exe4j or launch4j. Jsign can also be used programmatically or standalone as a command line tool.
Jsign is free to use and licensed under the Apache License version 2.0.
- Platform independent signing of Windows executables, DLLs, Microsoft Installers (MSI), Cabinet files (CAB) and scripts (PowerShell, VBScript, JScript, WSF)
- Timestamping with retries and fallback on alternative servers (RFC 3161 and Authenticode protocols supported)
- Supports multiple signatures per file, for all file types
- Extracts and embeds detached signatures to support reproducible builds
- Hashing algorithms: MD5, SHA-1, SHA-256, SHA-384 and SHA-512
- Keystores supported:
- PKCS#12, JKS and JCEKS files
- PKCS#11 hardware tokens (YubiKey, Nitrokey, etc)
- Cloud key management systems (Azure Key Vault, DigiCert ONE, Google Cloud KMS, SSL.com eSigner)
- Private key formats: PVK and PEM (PKCS#1 and PKCS#8), encrypted or not
- Certificates: PKCS#7 in PEM and DER format
- Build tools integration (Maven, Gradle, Ant)
- Command line signing tool
- Authenticode signing API (Javadoc)
See https://ebourg.github.io/jsign for more information.
- The SSL.com eSigner service has been integrated
- The Ant task can now sign multiple files by defining a fileset (contributed by Kyle Berezin)
- The type of the keystore is now automatically detected from the file header
- Fixed the "Map failed" OutOfMemoryError when signing large MSI files
- Certificates using an elliptic-curve key are now supported
- The default timestamping authority is now Sectigo instead of Comodo
- MS Cabinet signing has been implemented (contributed by Joseph Lee)
- Signatures can be detached and re-attached to make the builds reproducible without access to the private key
- The new
YUBIKEY
storetype can be specified to sign with a YubiKey (the SunPKCS11 provider is automatically configured) - The Azure Key Vault, DigiCert ONE and Google Cloud KMS cloud key management systems have been integrated
- The Maven plugin can now sign multiple files by defining a fileset (contributed by Bernhard Stiftner).
- The command line tool can now sign multiple files
- The
alias
parameter is now optional if the keystore contains only one entry (contributed by Michele Locati) - The keystore aliases are now listed in the error message if the alias specified is incorrect
- The
storetype
parameter is no longer required for JCEKS keystores - Fixed the update of the PE checksum (contributed by Markus Kilås)
- The
CMSAlgorithmProtection
attribute is no longer added to the signature (contributed by Yegor Yarko) - The signature algorithm is identified as
RSA
instead ofsha*RSA
when using SHA-2 digests (contributed by Yegor Yarko) - Upgraded BouncyCastle to 1.69
- Certificate files can now be used with a PKCS11 token to support OpenPGP cards unable to hold a whole certificate chain (contributed by Erwin Tratar)
- Fixed an IllegalArgumentException when parsing large entries of MSI files
- Jsign now requires Java 8 or higher
- MSI signing has been implemented
- Script signing has been implemented: PowerShell (contributed by Björn Kautler), VBScript, JScript and WSF
- The Maven plugin now uses the proxy defined in the Maven settings for the timestamping (contributed by Denny Bayer)
- The Maven plugin now accepts passwords encrypted using the Maven security settings (contributed by Denny Bayer)
- The Maven plugin is now bound by default to the
package
phase - The timestamping is no longer enabled by default with the Maven plugin
- Renamed the command line tool from
pesign
tojsign
- Renamed the Ant task and the Gradle extension method from
signexe
tojsign
- SOCKS proxies are now supported
- Fixed the invalid SHA-512 signatures (contributed by Markus Kilås)
- The non-timestamped signatures are now reproducible (the
signingTime
attribute has been removed) - Upgraded BouncyCastle to 1.64
- Fixed the loading of SunPKCS11 configuration files with Java 9
- SunPKCS11 configuration files can be loaded from any directory
- Maven plugin settings can now be passed on the command line (contributed by Nicolas Roduit)
- The first timestamping authority specified is no longer skipped (contributed by Thomas Atzmueller)
- Fixed the typo on the withTimestampingAuthority() methods in PESigner (contributed by Bjørn Madsen)
- Upgraded BouncyCastle to 1.60
- Jsign now requires Java 7 or higher
- Multiple signatures are now supported. New signatures can replace or be added to the previous ones.
- PKCS#11 hardware tokens are now supported.
- The signature algorithm can now be specified independently of the digest algorithm (contributed by Markus Kilås)
- Timestamping is attempted 3 times by default with a 10 seconds pause if an exception occurs (contributed by Erwin Tratar)
- Timestamping can now fail over to other services
- Private keys in PEM format are now supported (PKCS#1 and PKCS#8, encrypted or not)
- Upgraded BouncyCastle to 1.54 (contributed by Markus Kilås)
- Fixed the Accept header for RFC 3161 requests (contributed by Markus Kilås)
- Internal refactoring to share the code between the Ant task and the CLI tool (contributed by Michael Peterson)
- The code has been split into distinct modules (core, ant, cli).
- Jsign is now available as a plugin for Maven (net.jsign:jsign-maven-plugin) and Gradle
- The API can be used to sign in-memory files using a SeekableByteChannel
- The command line tool now supports HTTP proxies (contributed by Michael Szediwy)
- RFC 3161 timestamping services are now supported (contributed by Florent Daigniere)
- The digest algorithm now defaults to SHA-256
- The shaded dependencies are now relocated to avoid conflicts
- Added SHA-384 and SHA-512 checksums support
- SHA-2 is accepted as an alias for SHA-256
- Reduced the memory usage when signing large files
- Files over 2 GB are now supported
- Improved the thread safety
- Command line interface with bash completion for signing files (available as RPM and DEB packages)
- The keystore is no longer locked if the signing fails
- Initial release