我使用带有Itext的java来使用LUNA HSM制作数字签名PDF文档。 我的目标是用PKCS11签署一份文件并从HSM汇集证书链。我不想将证书安装到服务器中。
我尝试使用iText中名为C4_01_SignWithPKCS11HSM.java的示例程序。
当我编译程序时,它会显示以下警告:
[luna @ sumCentosHsm pdf] $ javac -Xlint signPdf.java signPdf.java:93: 警告:[弃用] OcspClientBouncyCastle()中 OcspClientBouncyCastle已被弃用 OcspClient ocspClient =新的OcspClientBouncyCastle();
另外,如何构建配置文件和参数。
我想知道是否有人遇到同样的问题 谢谢。
答案 0 :(得分:0)
import java.security.*;
import java.security.KeyStore.*;
import java.security.cert.X509Certificate;
import java.security.cert.Certificate;
import com.safenetinc.luna.*;
import java.io.*;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.security.*;
public class SignPdfUsingLuna{
private static String keyAlias = null;
private static String slotPin = null;
private static int slotId;
private static String inputFile = null;
private static String outputFile = null;
private static KeyStore ks = null;
private static PrivateKeyEntry prKE = null;
private static void usage(){
System.out.println("Command usage :-");
System.out.println("java SignPdfUsingLuna <SlotNumber> <SlotPassword> <KeyAlias> <InputFile>");
}
public static void main(String args[]){
try{
slotId = Integer.parseInt(args[0]);
slotPin = args[1];
keyAlias = args[2];
inputFile = args[3];
ks = KeyStore.getInstance("Luna");
ks.load(new ByteArrayInputStream(("slot:"+slotId).getBytes()),slotPin.toCharArray());
ProtectionParameter param = new PasswordProtection("abcd".toCharArray());
prKE = (PrivateKeyEntry)ks.getEntry(keyAlias,param);
X509Certificate cert = (X509Certificate)ks.getCertificate(keyAlias);
Certificate[] certchain = (Certificate[]) ks.getCertificateChain(keyAlias);
PdfReader readPdf = new PdfReader(inputFile);
FileOutputStream outFile = new FileOutputStream("Signed"+inputFile);
PdfStamper stamp = PdfStamper.createSignature(readPdf, outFile, '\0');
PdfSignatureAppearance psa = stamp.getSignatureAppearance();
psa.setReason("Signed by :- Sam Paul");
psa.setLocation("India");
Image img = Image.getInstance("Logo.jpg");
psa.setImage(img);
psa.setVisibleSignature(new Rectangle(100, 100, 300, 200), 1, "Signature");
ExternalDigest dgst = new BouncyCastleDigest();
Provider prod = ks.getProvider();
PrivateKey pk = prKE.getPrivateKey();
ExternalSignature sign = new PrivateKeySignature(pk,DigestAlgorithms.SHA256,prod.getName());
MakeSignature.signDetached(psa, dgst, sign, certchain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
stamp.close();
}catch(ArrayIndexOutOfBoundsException aio){
usage();
}catch(NumberFormatException nfe){
System.out.println("Please enter a valid slot number");
usage();
}catch(Exception e){
e.printStackTrace();
}
}
希望这有帮助。
萨姆。
答案 1 :(得分:-1)
也许您有特殊情况需要使用HSM密钥签署文档。大多数情况下,文档签名是通过“人 - 实体”完成的。 PKI证书。在此方案中,您的本地证书颁发机构(Windows Server)已配置为在SafeNet HSM上存储CA的私钥。然后,本地CA将向该域的用户(Bob Smith)颁发个人PKI证书。然后,用户Bob可以使用他的机器本地的证书来签署文档。这将提供完整性和不可否认性,证书将由该个人签署。
在您的实施中,任何签名文档都只会显示HSM证书的主题名称,在大多数实现中,该名称将是域名的CA名称等。