From 97f581ad6dd9e3108c4fbc5ccca09d79522c9cd9 Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Wed, 3 Jan 2024 21:51:30 -0500 Subject: [PATCH] feat: add java keystore certificate option for pdf signing --- .../api/security/CertSignController.java | 13 +- .../api/security/SignPDFWithCertRequest.java | 5 +- src/main/resources/messages_en_US.properties | 2 + .../templates/security/cert-sign.html | 234 ++++++++---------- 4 files changed, 121 insertions(+), 133 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index c4e5fe11..1ead1a97 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -81,6 +81,7 @@ public class CertSignController { MultipartFile privateKeyFile = request.getPrivateKeyFile(); MultipartFile certFile = request.getCertFile(); MultipartFile p12File = request.getP12File(); + MultipartFile jksfile = request.getJksFile(); String password = request.getPassword(); Boolean showSignature = request.isShowSignature(); String reason = request.getReason(); @@ -95,10 +96,6 @@ public class CertSignController { KeyStore ks = null; switch (certType) { - case "PKCS12": - ks = KeyStore.getInstance("PKCS12"); - ks.load(p12File.getInputStream(), password.toCharArray()); - break; case "PEM": ks = KeyStore.getInstance("JKS"); ks.load(null); @@ -107,6 +104,14 @@ public class CertSignController { ks.setKeyEntry( "alias", privateKey, password.toCharArray(), new Certificate[] {cert}); break; + case "PKCS12": + ks = KeyStore.getInstance("PKCS12"); + ks.load(p12File.getInputStream(), password.toCharArray()); + break; + case "JKS": + ks = KeyStore.getInstance("JKS"); + ks.load(jksfile.getInputStream(), password.toCharArray()); + break; default: throw new IllegalArgumentException("Invalid cert type: " + certType); } diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java index a1fc2fce..d3399db9 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java @@ -14,7 +14,7 @@ public class SignPDFWithCertRequest extends PDFFile { @Schema( description = "The type of the digital certificate", - allowableValues = {"PKCS12", "PEM"}) + allowableValues = {"PEM", "PKCS12", "JKS"}) private String certType; @Schema( @@ -28,6 +28,9 @@ public class SignPDFWithCertRequest extends PDFFile { @Schema(description = "The PKCS12 keystore file (required for PKCS12 type certificates)") private MultipartFile p12File; + @Schema(description = "The JKS keystore file (Java Key Store)") + private MultipartFile jksFile; + @Schema(description = "The password for the keystore or the private key") private String password; diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 9b7efd3a..0c6572da 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -546,9 +546,11 @@ scalePages.submit=Submit certSign.title=Certificate Signing certSign.header=Sign a PDF with your certificate (Work in progress) certSign.selectPDF=Select a PDF File for Signing: +certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. certSign.selectKey=Select Your Private Key File (PKCS#8 format, could be .pem or .der): certSign.selectCert=Select Your Certificate File (X.509 format, could be .pem or .der): certSign.selectP12=Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate): +certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): certSign.certType=Certificate Type certSign.password=Enter Your Keystore or Private Key Password (If Any): certSign.showSig=Show Signature diff --git a/src/main/resources/templates/security/cert-sign.html b/src/main/resources/templates/security/cert-sign.html index fbbf36d1..20148355 100644 --- a/src/main/resources/templates/security/cert-sign.html +++ b/src/main/resources/templates/security/cert-sign.html @@ -1,135 +1,113 @@ - - - + + -
-
-
-

-
-
-
-

- -
-
- -
-
-
- +
+
+
+

+
+
+
+

+ +
+ +
+
+ +
+
+
+ +
+ + + +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+
+
+ - - -
- -
- -
-
-
-
-
-
+ document + .getElementById('showSignature') + .addEventListener( + 'change', + function() { + var signatureDetails = document.getElementById('signatureDetails'); + if (this.checked) { + signatureDetails.style.display = 'block'; + } else { + signatureDetails.style.display = 'none'; + } + }); + +