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 @@
-
-
-