From 02d096d62236d32a84393515c8e6820422a9d648 Mon Sep 17 00:00:00 2001 From: Ludy Date: Thu, 4 Sep 2025 16:30:32 +0200 Subject: [PATCH] feat(security): add PFX alias for PKCS12; accept .crt/.cer/.der certs & .key keys; add certificate-signing tests (#4297) --- app/core/.gitignore | 4 + .../api/security/CertSignController.java | 1 + .../api/security/SignPDFWithCertRequest.java | 13 +- .../templates/security/cert-sign.html | 6 +- .../api/security/CertSignControllerTest.java | 312 ++++++++++++++++++ .../src/test/resources/certs/test-cert.cer | 26 ++ .../src/test/resources/certs/test-cert.crt | 26 ++ .../src/test/resources/certs/test-cert.der | Bin 0 -> 909 bytes .../src/test/resources/certs/test-cert.jks | Bin 0 -> 2257 bytes .../src/test/resources/certs/test-cert.p12 | Bin 0 -> 2718 bytes .../src/test/resources/certs/test-cert.pem | 26 ++ .../src/test/resources/certs/test-cert.pfx | Bin 0 -> 2718 bytes .../src/test/resources/certs/test-key.key | 34 ++ .../src/test/resources/certs/test-key.pem | 34 ++ 14 files changed, 476 insertions(+), 6 deletions(-) create mode 100644 app/core/src/test/java/stirling/software/SPDF/controller/api/security/CertSignControllerTest.java create mode 100644 app/core/src/test/resources/certs/test-cert.cer create mode 100644 app/core/src/test/resources/certs/test-cert.crt create mode 100644 app/core/src/test/resources/certs/test-cert.der create mode 100644 app/core/src/test/resources/certs/test-cert.jks create mode 100644 app/core/src/test/resources/certs/test-cert.p12 create mode 100644 app/core/src/test/resources/certs/test-cert.pem create mode 100644 app/core/src/test/resources/certs/test-cert.pfx create mode 100644 app/core/src/test/resources/certs/test-key.key create mode 100644 app/core/src/test/resources/certs/test-key.pem diff --git a/app/core/.gitignore b/app/core/.gitignore index 5486f9afe..7d9dd6293 100644 --- a/app/core/.gitignore +++ b/app/core/.gitignore @@ -170,6 +170,10 @@ out/ *.jks *.asc +# test-cert +!**/test/resources/certs/test-cert.* +!**/test/resources/certs/test-key.* + # SSH Keys *.pub *.priv diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index 7675355da..e32f4fac6 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -186,6 +186,7 @@ public class CertSignController { "alias", privateKey, password.toCharArray(), new Certificate[] {cert}); break; case "PKCS12": + case "PFX": ks = KeyStore.getInstance("PKCS12"); ks.load(p12File.getInputStream(), password.toCharArray()); break; diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java index acb4b55fd..ac87fe61d 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java @@ -15,20 +15,25 @@ public class SignPDFWithCertRequest extends PDFFile { @Schema( description = "The type of the digital certificate", - allowableValues = {"PEM", "PKCS12", "JKS"}, + allowableValues = {"PEM", "PKCS12", "PFX", "JKS"}, requiredMode = Schema.RequiredMode.REQUIRED) private String certType; @Schema( description = "The private key for the digital certificate (required for PEM type" - + " certificates)") + + " certificates, supports .pem, .der, or .key files)") private MultipartFile privateKeyFile; - @Schema(description = "The digital certificate (required for PEM type certificates)") + @Schema( + description = + "The digital certificate (required for PEM type certificates, supports" + + " .pem, .der, .crt, or .cer files)") private MultipartFile certFile; - @Schema(description = "The PKCS12 keystore file (required for PKCS12 type certificates)") + @Schema( + description = + "The PKCS12/PFX keystore file (required for PKCS12 or PFX type certificates)") private MultipartFile p12File; @Schema(description = "The JKS keystore file (Java Key Store)") diff --git a/app/core/src/main/resources/templates/security/cert-sign.html b/app/core/src/main/resources/templates/security/cert-sign.html index d83f8c249..ea94b7ea9 100644 --- a/app/core/src/main/resources/templates/security/cert-sign.html +++ b/app/core/src/main/resources/templates/security/cert-sign.html @@ -31,17 +31,18 @@ +