Make sure that your certificate issuer is trusted by Acrobat or the OCSP won't
be used.
Paulo
-----Original Message-----
From: jfsa [mailto:[email protected]]
Sent: Thursday, October 14, 2010 3:07 PM
To: [email protected]
Subject: Re: [iText-questions] Adding revocation information to a pdf
signature(java-iText)
For CRLs it's Ok,
But now I want to add ocsp responses that are got online while signing and
used offline when the pdf document is opened. Actually I tried some sources
from the web and from the iText in action book but that doesn't work. As
result, signature is considered as valid only when pdf document is obline.
I tried this source code :
http://itextpdf.sourceforge.net/howtosign.html#signtsocspjava
and this one :
PdfReader reader = new PdfReader(SOURCE_FILE_DIR +
PDF_FILE_NAME);
FileOutputStream fout = new
FileOutputStream(BUILD_SIGNATURE_DIR +
SIGNED_PDF_WITH_OCSP_NAME);
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setVisibleSignature(new Rectangle(72, 732, 144, 780), 1,
"Signature");
Certificate signingCertificate = null;
signingCertificate = CertificateUtil.loadCertificate(new
File("sign_certificate.cer"));
Certificate intermediateCertificate = null;
intermediateCertificate = CertificateUtil.loadCertificate(new
File("intermediate_certificate.cer"));
Certificate rootCertificate =
CertificateUtil.loadCertificate(new
File("root_certificate.cer"));
Certificate[] certificateValues = new
Certificate[]{signingCertificate,
intermediateCertificate, rootCertificate};
sap.setCrypto(null, certificateValues, null,
PdfSignatureAppearance.WINCER_SIGNED);
// Create signature dictionary
PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, new
PdfName(
"adbe.pkcs7.detached"));
dic.setReason(sap.getReason());
dic.setLocation(sap.getLocation());
dic.setContact(sap.getContact());
dic.setDate(new PdfDate(sap.getSignDate()));
sap.setCryptoDictionary(dic);
// End of signature dictionary creation
// Reserving space for signature content
int contentEstimated = 15000;
HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
exc.put(PdfName.CONTENTS, new Integer(contentEstimated * 2 +
2));
sap.preClose(exc);
// End of reserving space for signature content
// Creating a hash of the content
InputStream data = sap.getRangeStream();
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
byte buf[] = new byte[8192];
int n;
while ((n = data.read(buf)) > 0) {
messageDigest.update(buf, 0, n);
}
byte hash[] = messageDigest.digest();
// End of hash creation
Calendar cal = Calendar.getInstance();
TSAClientImpl timestampingClient = null;
// Creating a timestamp client
boolean withTS = false;
// End of timestamp client creation
// Creating an OCSP client
byte[] ocsp = null;
// Variable to activate/deactivate OCSP
boolean withOCSP = true;
if (withOCSP) {
X509Certificate issuerCertificate = (X509Certificate)
intermediateCertificate;
OCSPRequester ocspRequester = new OCSPRequesterImpl();
OCSPRequest ocspRequest = ocspRequester.buildRequest(
signingCertificate, issuerCertificate,
true, "SHA-1");
OCSPRequestParameters ocspRequestParameters = new
OCSPRequestParameters();
ocspRequestParameters.setUri(ocspServerURL);
ocspRequestParameters.setAcceptMaxDesync(3000000);
ocspRequestParameters.setOcspRequest(ocspRequest);
OCSPResponse ocspResponse = ocspRequester
.sendRequest(ocspRequestParameters);
ocsp = ocspResponse.getEncoded();
}
// End of OCSP client creation
// Loading the keyStore
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream(PRIVATE_KEY_FILE),
privateKeyPassword
.toCharArray());
String alias = (String) ks.aliases().nextElement();
PrivateKey privateKey = (PrivateKey) ks.getKey(alias,
privateKeyPassword.toCharArray());
// Signed hash creation
PdfPKCS7 sgn = new PdfPKCS7(privateKey, certificateValues,
null, "SHA1",
null,
false);
if (withTS) {
timestampingClient = new TSAClientImpl(1800);
}
byte sh[] = sgn.getAuthenticatedAttributeBytes(hash, cal, ocsp);
sgn.update(sh, 0, sh.length);
byte[] encodedSig = sgn.getEncodedPKCS7(hash, cal,
timestampingClient,
ocsp);
if (contentEstimated + 2 < encodedSig.length)
throw new DocumentException("Not enough space");
byte[] paddedSig = new byte[contentEstimated];
System.arraycopy(encodedSig, 0, paddedSig, 0,
encodedSig.length);
// End of signed hash creation
// Adding the signature content
PdfDictionary dic2 = new PdfDictionary();
dic2
.put(PdfName.CONTENTS, new PdfString(paddedSig)
.setHexWriting(true));
// End of adding signature content
sap.close(dic2);
--
View this message in context:
http://itext-general.2136553.n4.nabble.com/Adding-revocation-information-to-a-pdf-signature-java-iText-tp2956044p2995372.html
Sent from the iText - General mailing list archive at Nabble.com.
------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
Spend less time writing and rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions
Many questions posted to this list can (and will) be answered with a reference
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples:
http://itextpdf.com/themes/keywords.php
Aviso Legal:
Esta mensagem é destinada exclusivamente ao destinatário. Pode conter
informação confidencial ou legalmente protegida. A incorrecta transmissão desta
mensagem não significa a perca de confidencialidade. Se esta mensagem for
recebida por engano, por favor envie-a de volta para o remetente e apague-a do
seu sistema de imediato. É proibido a qualquer pessoa que não o destinatário de
usar, revelar ou distribuir qualquer parte desta mensagem.
Disclaimer:
This message is destined exclusively to the intended receiver. It may contain
confidential or legally protected information. The incorrect transmission of
this message does not mean the loss of its confidentiality. If this message is
received by mistake, please send it back to the sender and delete it from your
system immediately. It is forbidden to any person who is not the intended
receiver to use, distribute or copy any part of this message.
------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
Spend less time writing and rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions
Many questions posted to this list can (and will) be answered with a reference
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples:
http://itextpdf.com/themes/keywords.php