Статус: Новичок
Группы: Участники
Зарегистрирован: 21.10.2009(UTC) Сообщений: 3 Откуда: Новосибирск
|
Доброго времени суток! Подскажите пожалуйста как при помощи JCP проверить подпись, которую создают при помощи КриптоАРМ. Подпись получается в виде файла .p7s, причем как я знаю есть два вида формирования такой подписи когда данные и подпись в разных файла и когда в одном файле p7s. Как при помощи JCP считать подпись и публичный ключ из этого файла и как проверить подпись? Как при помощи JCP подписать файл и подпись с публичным ключем положить в файл p7s?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.04.2009(UTC) Сообщений: 15 Откуда: Москва
|
kanshins написал: Как при помощи JCP считать подпись и публичный ключ из этого файла и как проверить подпись? Как при помощи JCP подписать файл и подпись с публичным ключем положить в файл p7s?
Смотрите каталог JCP.1.0.46\samples\samples_src\CMS_samples\ там есть примеры, реализующие функционал, описанный в вопросах. Поправка: требуется разархивировать файл samples_src.jar, входящий в дистрибутив JCP Отредактировано пользователем 22 октября 2009 г. 17:25:01(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.10.2009(UTC) Сообщений: 3 Откуда: Новосибирск
|
Конечно же я смотрел примеры JCP.1.0.46\samples\samples_src\CMS_samples\ CMS реализация не работает на файле p7s. Вот пример кода:
byte[] p7sBytes = Array.readFile("/work/тест.txt.p7s"); byte[] data = Array.readFile("/work/тест.txt"); final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(p7sBytes); final ContentInfo all = new ContentInfo(); all.decode(asnBuf);
На последней строчке валиться исключение: com.objsys.asn1j.runtime.Asn1MissingRequiredException: ASN.1 decode error @ offset 32: SEQUENCE or SET is missing a required element. at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.SignedData.decode(SignedData.java:171) at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.checkTC(ContentInfo.java:137) at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.decode(ContentInfo.java:90) at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:15) at test.JCPTest.test4(JCPTest.java:60) at test.JCPTest.main(JCPTest.java:48) com.objsys.asn1j.runtime.Asn1Exception: table constraint: content decode failed at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.checkTC(ContentInfo.java:141) at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.decode(ContentInfo.java:90) at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:15) at test.JCPTest.test4(JCPTest.java:60) at test.JCPTest.main(JCPTest.java:48)
Как я выяснил это проблема реализации CMS. Поэтому пришлось найти другое решение :)
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.10.2009(UTC) Сообщений: 3 Откуда: Новосибирск
|
Гораздо все проще делается используя класс sun.security.pkcs.PKCS7 Вот пример кода по созданию подписи и создания p7s файла:
KeyStore store = KeyStore.getInstance(STORE_NAME); store.load(null, null); X509Certificate cert = (X509Certificate) store .getCertificate(container); PrivateKey privateKey = (PrivateKey) store.getKey(container, password.toCharArray());
// calculate message digest MessageDigest md = MessageDigest.getInstance(JCP.GOST_DIGEST_NAME); md.update(fileData); byte[] fileDigest = md.digest();
// construct authenticated attributes... PKCS9Attribute[] authenticatedAttributeList = { new PKCS9Attribute(PKCS9Attribute.CONTENT_TYPE_OID, ContentInfo.DATA_OID), new PKCS9Attribute(PKCS9Attribute.SIGNING_TIME_OID, new Date()), new PKCS9Attribute(PKCS9Attribute.MESSAGE_DIGEST_OID, fileDigest) };
PKCS9Attributes authenticatedAttributes = new PKCS9Attributes( authenticatedAttributeList);
Signature sign = Signature.getInstance(JCP.GOST_EL_SIGN_NAME, PROVIDER_NAME); sign.initSign(privateKey); sign.update(authenticatedAttributes.getDerEncoding()); byte[] signedAttributes = sign.sign();
ContentInfo contentInfo = null; // We can attach the data here, or not if (attachFile) { contentInfo = new ContentInfo(ContentInfo.DATA_OID, new DerValue(DerValue.tag_OctetString, fileData)); } else { contentInfo = new ContentInfo(ContentInfo.DATA_OID, null); }
X509Certificate[] certs = { cert };
SignerInfo si = new SignerInfo(new X500Name(cert.getIssuerDN() .getName()), cert.getSerialNumber(), AlgorithmId .get(JCP.GOST_DIGEST_NAME), authenticatedAttributes, AlgorithmId.get("GOST3410EL"), signedAttributes, null); SignerInfo[] signer = { si };
AlgorithmId[] digestAlgorithmIds = { AlgorithmId .get(JCP.GOST_DIGEST_NAME) }; PKCS7 p7 = new PKCS7(digestAlgorithmIds, contentInfo, certs, signer);
ByteArrayOutputStream out = new ByteArrayOutputStream(); p7.encodeSignedData(out); out.flush(); out.close(); return out.toByteArray();
А это пример по чтению p7s файла и проверка подписи:
PKCS7 p7 = new PKCS7(p7sBytes); X509Certificate[] certs = p7.getCertificates(); PublicKey pub = certs[0].getPublicKey(); SignerInfo[] si = p7.getSignerInfos(); byte[] contentData = null; if (null != fileData) { contentData = fileData; } else if (null != p7.getContentInfo().getData()) { contentData = p7.getContentInfo().getData(); } else { logger.warn("p7s file not contains data"); return false; } if (null != fileToSaveData) { FileUtils.saveFile(fileToSaveData, contentData); } MessageDigest md = MessageDigest.getInstance(JCP.GOST_DIGEST_NAME); md.update(contentData); byte[] digestedContent = md.digest(); byte[] digest = (byte[]) si[0].getAuthenticatedAttributes() .getAttributeValue(PKCS9Attribute.MESSAGE_DIGEST_OID); if (!Arrays.equals(digestedContent, digest)) { logger.warn("File digest (hash) is not valid. Signature is false"); return false; }
checkKeyUsage(certs[0].getKeyUsage());
Signature sign = Signature.getInstance(JCP.GOST_EL_SIGN_NAME, PROVIDER_NAME); sign.initVerify(pub); sign.update(si[0].getAuthenticatedAttributes().getDerEncoding()); return sign.verify(si[0].getEncryptedDigest());
Вариант конечно хороший, рабочий, проверял проверку подпись в КриптоАрм, но это покет sun.security, который со временем в обновлениях джава может исчежнуть, но скорее все его просто включат в комплект java.security.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close