<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Рутокен &mdash; Проблемы с валидацией отсоединенной подписи]]></title>
	<link rel="self" href="https://forum.rutoken.ru/feed/atom/topic/2974/" />
	<updated>2019-05-06T11:35:03Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.rutoken.ru/topic/2974/</id>
		<entry>
			<title type="html"><![CDATA[Re: Проблемы с валидацией отсоединенной подписи]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/12926/#p12926" />
			<content type="html"><![CDATA[<p>Добрый день, <strong>Иван К.</strong>.</p><p>Мы проверили на bouncy castle 1.61. Код:<br /></p><div class="codebox"><pre><code>            data = Files.readAllBytes(path);

            byte[] signerBytes = Base64.decode(data);
            CMSSignedData signedData = new CMSSignedData(signerBytes);

            InputStream in = new FileInputStream(&quot;C:\\cert.cer&quot;);
            CertificateFactory factory = new CertificateFactory();
            X509Certificate cert = (X509Certificate)factory.engineGenerateCertificate(in);

            Store certs = signedData.getCertificates();

            SignerInformationStore signers = signedData.getSignerInfos();
            Collection&lt;SignerInformation&gt; c = signers.getSigners();
            for (SignerInformation signer : c) {
                /*
                // можно взять сертификат из CMS-конверта

                SignerId signerId = signer.getSID();
                Collection certCollection = certs.getMatches(signerId);

                Iterator certIt = certCollection.iterator();
                X509CertificateHolder certificate = (X509CertificateHolder)certIt.next();
                X509Certificate certFromCms = new JcaX509CertificateConverter().setProvider(&quot;BC&quot;).getCertificate(certificate);
                */
                SignerInformationVerifier verifier =
                        new JcaSimpleSignerInfoVerifierBuilder()
                                .setProvider(&quot;BC&quot;).build(cert);
                //              .setProvider(&quot;BC&quot;).build(certFromCms);

                boolean result = signer.verify(verifier);
                System.out.write(result?1:0);</code></pre></div><p>Проверка выполняется успешно.</p>]]></content>
			<author>
				<name><![CDATA[Владимир Салыкин]]></name>
				<uri>https://forum.rutoken.ru/user/10195/</uri>
			</author>
			<updated>2019-05-06T11:35:03Z</updated>
			<id>https://forum.rutoken.ru/post/12926/#p12926</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проблемы с валидацией отсоединенной подписи]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/12909/#p12909" />
			<content type="html"><![CDATA[<p><strong>Владимир Салыкин</strong>, думаю что дело не в открытом ключе, поскольку метод initVerify() имеет еще один конструктор, который принимает сертификат. Для тестирования я импортировал сертификат на котором происходила подпись, и метод verify() - аналогично, все время выносил решение false.</p>]]></content>
			<author>
				<name><![CDATA[Иван К.]]></name>
				<uri>https://forum.rutoken.ru/user/11159/</uri>
			</author>
			<updated>2019-04-24T06:17:29Z</updated>
			<id>https://forum.rutoken.ru/post/12909/#p12909</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проблемы с валидацией отсоединенной подписи]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/12908/#p12908" />
			<content type="html"><![CDATA[<p><strong>Иван К.</strong>, передали Вашу проблему разработчикам.</p><p>Но скорее всего проблема в открытом ключе - <a href="https://forum.rutoken.ru/topic/1917/">https://forum.rutoken.ru/topic/1917/</a></p>]]></content>
			<author>
				<name><![CDATA[Владимир Салыкин]]></name>
				<uri>https://forum.rutoken.ru/user/10195/</uri>
			</author>
			<updated>2019-04-23T09:43:59Z</updated>
			<id>https://forum.rutoken.ru/post/12908/#p12908</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проблемы с валидацией отсоединенной подписи]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/12907/#p12907" />
			<content type="html"><![CDATA[<p>Добрый день, <strong>Владимир Салыкин</strong>, </p><p>Для подписи используется некоторая модификация предложенного на вашем сайте примера, в частности сама подпись происходит путем вызова функции sign():</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;plugin.sign(rutokenHandle, certHandle, textToSign, false, {addSignTime: true}) ,</p><p>где textToSign - подписываемая строка. </p><p>Подпись и проверка происходит с использованием алгоритмов ГОСТ Р 34.11-2012/34.10-2012 512 бит.</p><p>Как уже писал ранее, полученное CMS сообщение пересылается на сервер и парсится используя средства bouncycastle:</p><p>&nbsp; &nbsp; &nbsp;byte[] signerBytes = Base64.decodeBase64(data);<br />&nbsp; &nbsp; &nbsp;CMSSignedData signedData = new CMSSignedData(signerBytes);<br />&nbsp; &nbsp; &nbsp;content = (byte[]) signedData.getSignedContent().getContent();<br />&nbsp; &nbsp; &nbsp;SignerInformation signerInformation = signedData.getSignerInfos().get(signer.getSID());<br />&nbsp; &nbsp; &nbsp;AttributeTable signedAttributes = signerInformation.getSignedAttributes();</p><p>&nbsp; &nbsp; &nbsp;byte[] sign = signerInformation.getSignature(); // вытаскиваем &quot;голую&quot; подпись</p><p>Данные записываются в БД.</p><p>Код проверки:</p><p>&nbsp; &nbsp; KeyFactory keyFactory = KeyFactory.getInstance(&quot;GOST3410_2012_512&quot;);<br />&nbsp; &nbsp; EncodedKeySpec spec = new X509EncodedKeySpec(bytesPublicKey);<br />&nbsp; &nbsp; publicKey = keyFactory.generatePublic(spec);</p><p>&nbsp; &nbsp; Signature signature = Signature.getInstance(&quot;GOST3411_2012_512withGOST3410_2012_512&quot;);<br />&nbsp; &nbsp; signature.initVerify(publicKey);<br />&nbsp; &nbsp; signature.update(content.getBytes(StandardCharsets.UTF_8)); <br />&nbsp; &nbsp; boolean flagVerified = signature.verify(signedBytes);</p><p>Метод verify() всегда возвращает false.</p>]]></content>
			<author>
				<name><![CDATA[Иван К.]]></name>
				<uri>https://forum.rutoken.ru/user/11159/</uri>
			</author>
			<updated>2019-04-22T06:41:51Z</updated>
			<id>https://forum.rutoken.ru/post/12907/#p12907</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проблемы с валидацией отсоединенной подписи]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/12888/#p12888" />
			<content type="html"><![CDATA[<p>Добрый день, <strong>Иван К.</strong>.</p><p>К сожалению, этой информации недостаточно для помощи. Нужны ответы на вопросы:<br /></p><ul><li><p>Какой алгоритм и с каким размером ключа используется для подписи</p></li><li><p>Какое API используется на клиенте при подписи? Мы поддерживаем множество интерфейсов</p></li><li><p>Как\чем вытаскиваете &quot;голую&quot; подпись?</p></li><li><p>В идеале хорошо бы код подписи и код проверки видеть</p></li></ul>]]></content>
			<author>
				<name><![CDATA[Владимир Салыкин]]></name>
				<uri>https://forum.rutoken.ru/user/10195/</uri>
			</author>
			<updated>2019-04-14T13:36:48Z</updated>
			<id>https://forum.rutoken.ru/post/12888/#p12888</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Проблемы с валидацией отсоединенной подписи]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/12885/#p12885" />
			<content type="html"><![CDATA[<p>Добрый день, использую рутокен ЭЦП 2.0. Подписываю некоторое сообщение на клиенте используя функцию sign(), опция detached - false, полученный CMS файл пересылаю на сервер и вытаскиваю из него &quot;голую&quot; подпись и подписанные данные. Пытаюсь проверить данную подпись (использую стандартный пакет java.security) открытым ключом, однако все время выносится решение false. В чем может быть проблема?</p>]]></content>
			<author>
				<name><![CDATA[Иван К.]]></name>
				<uri>https://forum.rutoken.ru/user/11159/</uri>
			</author>
			<updated>2019-04-12T06:41:46Z</updated>
			<id>https://forum.rutoken.ru/post/12885/#p12885</id>
		</entry>
</feed>
