2016-11-09 73 views
0

我使用帶Itext的java來製作使用LUNA HSM的數字標誌PDF文檔。 我的目標是使用PKCS11簽署一個文檔,並從HSM組裝證書鏈。我不想將證書安裝到服務器中。如何使用LUNA HSM簽署PDF文檔?

我嘗試從iText使用一個名爲C4_01_SignWithPKCS11HSM.java的示例程序。

我藉此從: http://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-4

當我編譯的程序,它告訴我後續的警告:

[月神@ sumCentosHsm PDF] $的javac -Xlint signPdf.java signPdf.java: 93: 警告:[deprecation] OcpClientBouncyCastle() OcspClientBouncyCastle已被棄用 OcspClient ocspClient = new OcspClientBouncyCastle();

另外,如何構建配置文件和參數。

我想知道是否有人有同樣的問題 謝謝。

回答

-1

也許你有一個特殊的情況,你想使用HSM密鑰來簽署文件。大多數情況下,文檔簽名是通過「人員實體」PKI證書完成的。在這種情況下,您的本地證書頒發機構(Windows Server)已配置爲將CA的私鑰存儲在SafeNet HSM上。然後,本地CA將向該域的用戶(Bob Smith)頒發個人PKI證書。然後,用戶Bob可以使用他的機器本地的證書來簽署文檔。這將提供完整性和不可否認性,並且證書將由該個人簽署。

在您的實現,任何簽署文件將只顯示HSM的證書,這在大多數的實現將是一個域的CA名稱的主題名稱等

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(); 
    } 
} 

希望這有助於。

Sam。

相關問題