diff --git a/content/en/language_clients/java.md b/content/en/language_clients/java.md index 79d3f44a..bf1c25ef 100644 --- a/content/en/language_clients/java.md +++ b/content/en/language_clients/java.md @@ -5,65 +5,101 @@ title: Java weight: 20 --- -[`sigstore-java`](https://github.com/sigstore/sigstore-java#sigstore-java) is a java client for interacting with the Sigstore infrastructure. +[`sigstore-java`](https://github.com/sigstore/sigstore-java) is a Java client for signing and verifying artifacts with Sigstore. It supports keyless signing — signing without managing long-lived private keys, using short-lived certificates tied to an [OIDC](https://openid.net/developers/how-connect-works/) (OpenID Connect) identity — via build plugins for Maven and Gradle, and a direct Java API. ## Features -- [Maven](https://github.com/sigstore/sigstore-java/tree/main/sigstore-maven-plugin) and [Gradle](https://github.com/sigstore/sigstore-java/tree/main/sigstore-gradle) signing plugins -- Keyless signing and verifying -- Java native signing and verifying [API](https://javadoc.io/doc/dev.sigstore/sigstore-java) +* [Maven](https://github.com/sigstore/sigstore-java/tree/main/sigstore-maven-plugin) and [Gradle](https://github.com/sigstore/sigstore-java/tree/main/sigstore-gradle) signing plugins +* Keyless signing and verification +* Java API ([Javadoc](https://javadoc.io/doc/dev.sigstore/sigstore-java)) +* [DSSE](https://github.com/secure-systems-lab/dsse) (Dead Simple Signing Envelope) attestation signing and verification +* [TUF](https://theupdateframework.io) (The Update Framework) integration for trusted root management +* GitHub Actions OIDC support for CI/CD pipelines + +## Requirements + +* Java 11 or higher +* Gradle 7.5 or higher (for the Gradle plugin) ## Installation -Release information for the Java client is available [here](https://github.com/sigstore/sigstore-java/releases). We recommend using the latest version for your install. +Release information is available on the [releases page](https://github.com/sigstore/sigstore-java/releases). Use the latest version for your install. ### Maven -Requires Java 11 - -```java - - dev.sigstore - sigstore-maven-plugin - 1.0.0 - - - sign - - sign - - - - +```xml + + dev.sigstore + sigstore-maven-plugin + 2.0.0 + + + sign + + sign + + + + ``` -More information on the Maven build plugin is available in the [project repository](https://github.com/sigstore/sigstore-java/tree/main/sigstore-maven-plugin#sigstore-maven-plugin). +More information on the Maven plugin is available in the [project repository](https://github.com/sigstore/sigstore-java/tree/main/sigstore-maven-plugin#sigstore-maven-plugin). ### Gradle -Requires Java 11 and Gradle 7.5. +```kotlin +plugins { + id("dev.sigstore.sign") version "2.0.0" +} +``` -```java +This automatically signs all Maven publications. More information is available in the [project repository](https://github.com/sigstore/sigstore-java/tree/main/sigstore-gradle#sigstore-gradle). + +#### Signing individual files + +Use the `sign-base` plugin to sign individual files without tying into Maven publication: + +```kotlin plugins { - id("dev.sigstore.sign") version "1.0.0" + id("dev.sigstore.sign-base") version "2.0.0" } + +val signHelloProps by tasks.registering(dev.sigstore.sign.tasks.SigstoreSignFilesTask::class) { + signFile(/* File or Provider */) +} +``` + +### GitHub Actions + +To use keyless signing in a GitHub Actions workflow, the workflow must request an OIDC token. Grant the necessary permissions on the job or workflow: + +```yaml +permissions: + id-token: write + contents: read ``` -More information on the Gradle build plugin is available in the [project repository](https://github.com/sigstore/sigstore-java/tree/main/sigstore-gradle#sigstore-gradle). +See [GitHub's documentation on OIDC permissions](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-cloud-providers#adding-permissions-settings) for details. -## API Usage Examples +## API Usage + +The stable public API consists of [`KeylessSigner`](https://javadoc.io/doc/dev.sigstore/sigstore-java) and [`KeylessVerifier`](https://javadoc.io/doc/dev.sigstore/sigstore-java) and the classes exposed by those APIs. Other library classes may change between releases without notice. ### Signing ```java -Path testArtifact = Paths.get("path/to/my/file.jar") +import dev.sigstore.KeylessSigner; +import dev.sigstore.bundle.Bundle; +import java.nio.file.Path; +import java.nio.file.Paths; + +Path artifact = Paths.get("path/to/my/file.jar"); -// sign using the Sigstore public instance var signer = KeylessSigner.builder().sigstorePublicDefaults().build(); -Bundle result = signer.signFile(testArtifact); +Bundle bundle = signer.signFile(artifact); -// Sigstore bundle format (serialized as .sigstore.json) -String bundleJson = result.toJson(); +// serialized as .sigstore.json +String bundleJson = bundle.toJson(); ``` ### Verifying @@ -71,9 +107,12 @@ String bundleJson = result.toJson(); #### Get artifact and bundle ```java -Path artifact = Paths.get("path/to/my-artifact"); +import dev.sigstore.bundle.Bundle; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; -// import a json formatted Sigstore bundle +Path artifact = Paths.get("path/to/my-artifact"); Path bundleFile = Paths.get("path/to/my-artifact.sigstore.json"); Bundle bundle = Bundle.from(bundleFile, StandardCharsets.UTF_8); ``` @@ -81,27 +120,52 @@ Bundle bundle = Bundle.from(bundleFile, StandardCharsets.UTF_8); #### Configure verification options ```java -// add certificate policy to verify the identity of the signer -VerificationOptions options = VerificationOptions.builder().addCertificateMatchers( - CertificateMatcher.fulcio() - .subjectAlternativeName(StringMatcher.string("test@example.com")) - .issuer(StringMatcher.string("https://accounts.example.com")) - .build()); +import dev.sigstore.VerificationOptions; +import dev.sigstore.strings.StringMatcher; + +VerificationOptions verificationOptions = VerificationOptions.builder() + .addCertificateMatchers( + VerificationOptions.CertificateMatcher.fulcio() + .subjectAlternativeName(StringMatcher.string("test@example.com")) + .issuer(StringMatcher.string("https://accounts.example.com")) + .build()) + .build(); ``` #### Do verification ```java +import dev.sigstore.KeylessVerifier; +import dev.sigstore.KeylessVerificationException; + try { - // verify using the Sigstore public instance - var verifier = new KeylessVerifier.builder().sigstorePublicDefaults().build(); + var verifier = KeylessVerifier.builder().sigstorePublicDefaults().build(); verifier.verify(artifact, bundle, verificationOptions); - // verification passed! + // verification passed } catch (KeylessVerificationException e) { // verification failed } ``` -### Additional examples +### DSSE Attestation Signing + +DSSE attestation signing requires [Rekor](https://docs.sigstore.dev/logging/overview/) V2, Sigstore's append-only transparency log. The following example uses the staging instance, which has Rekor V2 enabled: + +```java +import dev.sigstore.KeylessSigner; +import dev.sigstore.bundle.Bundle; + +String payload = ""; +var signer = KeylessSigner.builder().sigstoreStagingDefaults().enableRekorV2(true).build(); +Bundle bundle = signer.attest(payload); +String bundleJson = bundle.toJson(); +``` + +[Additional examples](https://github.com/sigstore/sigstore-java/tree/main/examples/hello-world#sigstore-examples) are available in the project repository. + +## Known Limitations + +* **Offline signing and verification** are not supported by default — the client expects to reach Sigstore infrastructure (Fulcio, Rekor, the TUF root mirror). Verification can be configured against a custom trusted root for restricted environments. +* **Multi-module Maven builds**: each module that signs artifacts requires its own OIDC authentication step. +* **Long-running builds**: the OIDC token has a 10-minute validity window. Builds that take longer than 10 minutes may require re-authentication partway through. -[Additional](https://github.com/sigstore/sigstore-java/tree/main/examples/hello-world#sigstore-examples) [examples](https://github.com/sigstore/sigstore-java/tree/main/examples/pgp#pgp-test-keys-for-examples) are available in the project repository.