Как подписать PDF-документ с помощью LUNA HSM?

Я использую java с Itext для создания PDF-документа с цифровой подписью с помощью LUNA HSM. Моя цель - подписать документ с помощью PKCS11 и собрать цепочку сертификатов из HSM. Я не хочу устанавливать сертификаты на сервер.

Я пытаюсь использовать образец программы под названием C4_01_SignWithPKCS11HSM.java из iText.

Я взял это из: 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 = new OcspClient ();

Также, как построить файл конфигурации и параметры.

Хотелось бы узнать, была ли у кого-то такая же проблема. Спасибо.


person achacon    schedule 09.11.2016    source источник


Ответы (2)


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

Надеюсь это поможет.

Сэм.

person Sam Paul    schedule 20.06.2017

Возможно, у вас есть особые обстоятельства, когда вы хотите использовать ключи HSM для подписи документов. В большинстве случаев подписание документов выполняется с помощью сертификатов PKI «физическое лицо». В этом сценарии ваш локальный центр сертификации (Windows Server) был настроен для хранения закрытого ключа CA в SafeNet HSM. Затем локальный центр сертификации будет выдавать персональные сертификаты PKI пользователям этого домена (Боб Смит). Затем пользователь, Боб, может использовать свой сертификат, локальный для его машины, для подписи документов. Это обеспечит целостность и невозможность отказа, и сертификат будет подписан этим лицом.

В вашей реализации любой подписанный документ будет просто отображать имя субъекта сертификата HSM, которое в большинстве реализаций будет именем CA домена и т. Д.

person Wesley Bunton    schedule 02.03.2017