如何使用LUNA HSM签署PDF文档?

时间:2016-11-09 04:34:19

标签: java pkcs#11 hsm

我使用带有Itext的java来使用LUNA HSM制作数字签名PDF文档。 我的目标是用PKCS11签署一份文件并从HSM汇集证书链。我不想将证书安装到服务器中。

我尝试使用iText中名为C4_01_SignWithPKCS11HSM.java的示例程序。

我从以下地方拿走: http://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-4

当我编译程序时,它会显示以下警告:

  

[luna @ sumCentosHsm pdf] $ javac -Xlint signPdf.java signPdf.java:93:   警告:[弃用] OcspClientBouncyCastle()中   OcspClientBouncyCastle已被弃用           OcspClient ocspClient =新的OcspClientBouncyCastle();

另外,如何构建配置文件和参数。

我想知道是否有人遇到同样的问题 谢谢。

2 个答案:

答案 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名称等。