Почему я не могу использовать SHA1 до PKCS7.detached в iText7?
Как показано на рисунке, теперь я могу понять 1, и вот мой подписанный код успеха, который я использовал
pdfSigner.signExternalContainer(iExternalSignatureContainer, estimatedSize);
не
pdfSigner.signDetached();
:
public class PdfSignatureContainerExt implements IExternalSignatureContainer {
private MySignUtil mySignUtil;
public PdfSignatureContainerExt(MySignUtil mySignUtil){
this.mySignUtil= mySignUtil;
}
/**
*
* @param data , the data to sign
* @return a container with the signature and other objects, like CRL and OCSP. The container will generally be a PKCS7 one.
* @throws GeneralSecurityException
*/
@Override
public byte[] sign(InputStream data) throws GeneralSecurityException {
byte[] dataBytes = streamToBytes(data);
return mySignUtil.signP7DetachData(dataBytes);
}
@Override
public void modifySigningDictionary(PdfDictionary signDic) {
signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite);
signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached);
}}
Чтобы реализовать 2, я изменил код, результат которого неверен:
public class PdfSignatureContainerExt implements IExternalSignatureContainer {
private MySignUtil mySignUtil;
public PdfSignatureContainerExt(MySignUtil mySignUtil){
this.mySignUtil= mySignUtil;
}
@Override
public byte[] sign(InputStream data) throws GeneralSecurityException {
byte[] dataBytes = streamToBytes(data);
//change here
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
MessageDigest messageDigest = MessageDigest.getInstance("SHA1" , "BC");
byte[] hash = messageDigest.digest(dataBytes);
return mySignUtil.signP7DetachData(hash);
}
@Override
public void modifySigningDictionary(PdfDictionary signDic) {
signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite);
//change here
signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_sha1);
}}
и результат вывода знака не удалось, вот мой неудачный PDF.
1 ответ
Метод, который вы используете для создания контейнера подписи CMS adbe.pkcs7.detached
return mySignUtil.signP7DetachData(data);
(с InputStream data
) создается для создания контейнера так же, как метод, который вы используете для создания контейнера CMS adbe.pkcs7.sha1
return mySignUtil.signP7DetachData(hash);
(с byte[] hash
), по крайней мере, это то, что предлагает ваш пример файла.
Это неправильно: поскольку в PDF Reference 1.7 говорится:
- adbe.pkcs7.detached: в поле подписанных данных PKCS#7 нет данных.
- adbe.pkcs7.sha1: Дайджест SHA1 диапазона байтов инкапсулируется в поле подписанных данных PKCS#7 с ContentInfo типа Data.
(раздел 8.7.2 "Совместимость подписи")
Поскольку вы использовали эквивалентную функциональность для создания контейнеров CMS в обоих случаях, вы оставили поле подписанных данных PKCS#7 (с помощью которого eContent
Строка октета в CMS SignedData
поле EncapsulatedContentInfo
в вашем контейнере adbe.pkcs7.sha1 пусто, что не соответствует спецификации.
PS: Обычно я бы сослался на стандарты ISO 32000, но, к сожалению, соответствующие разделы как в части 1, так и в части 2 были изменены таким образом, что делает содержание где-то между еще более неясным и совершенно неправильным. К сожалению, это не пришло мне в голову, когда можно было сделать ввод для ISO 32000-2.
PPS: Ceterum censeo adbe.pkcs7.sha1 больше не следует использовать. Наш код проверки явно не реализует проверку этих подписей.