<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Рутокен &mdash; Проверка подписи под PHP7]]></title>
		<link>https://forum.rutoken.ru/topic/2636/</link>
		<atom:link href="https://forum.rutoken.ru/feed/rss/topic/2636" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Проверка подписи под PHP7».]]></description>
		<lastBuildDate>Tue, 23 May 2017 14:04:18 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link>https://forum.rutoken.ru/post/10883/#p10883</link>
			<description><![CDATA[<p>Возможно, проблема в &quot;УЦ Крипто-Про&quot; и в OpenSSL.<br />УЦ - подписывает ваш RSA-сертификат, ГОСТ-ключевой парой, а в OpenSSL возможно, возникают проблемы с такого рода &quot;гибридными&quot; сертификатами. Для того чтобы удостовериться в этом, советуем вам найти другой тестовый УЦ, который подписывает RSA-ключевой парой.</p>]]></description>
			<author><![CDATA[null@example.com (Анатолий Убушаев)]]></author>
			<pubDate>Tue, 23 May 2017 14:04:18 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10883/#p10883</guid>
		</item>
		<item>
			<title><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link>https://forum.rutoken.ru/post/10876/#p10876</link>
			<description><![CDATA[<p>Попробуйте на проверку передать сам сертификат.<br />Если не поможет, можно ещё дополнительно убедиться, что открытые ключи совпадают при проверке в php и в C#.<br />И на крайний случай – попробовать пореверсить буферы (подпись, ключ)</p>]]></description>
			<author><![CDATA[null@example.com (Анатолий Убушаев)]]></author>
			<pubDate>Tue, 23 May 2017 10:58:56 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10876/#p10876</guid>
		</item>
		<item>
			<title><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link>https://forum.rutoken.ru/post/10874/#p10874</link>
			<description><![CDATA[<p>Результат 0, срабатывает ветка:</p><div class="codebox"><pre><code>} elseif ($ok == 0) {
    echo &quot;ЭЦП не корректна!&quot;;
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (kpalych)]]></author>
			<pubDate>Tue, 23 May 2017 10:26:58 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10874/#p10874</guid>
		</item>
		<item>
			<title><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link>https://forum.rutoken.ru/post/10873/#p10873</link>
			<description><![CDATA[<p>Отрицательный результат это -1 (ошибка при проверке подписи) или 1 (подпись неверна)?<br />Если -1, то что пишет openssl_error_string?</p>]]></description>
			<author><![CDATA[null@example.com (Анатолий Убушаев)]]></author>
			<pubDate>Tue, 23 May 2017 10:18:17 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10873/#p10873</guid>
		</item>
		<item>
			<title><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link>https://forum.rutoken.ru/post/10872/#p10872</link>
			<description><![CDATA[<p>Спасибо за оперативный ответ!</p><p>К сожалению конструкция<br /></p><div class="codebox"><pre><code>$ok = openssl_verify($str, base64_decode($signature), $pubkeyid, OPENSSL_ALGO_MD5);</code></pre></div><p>так же дает отрицательный результат...</p><p>Возможно на сервере необходима установка каких либо дополнительных плагинов для поддержки ruToken?</p><p>Требуется ли установка какого либо ПО на сервере?</p>]]></description>
			<author><![CDATA[null@example.com (kpalych)]]></author>
			<pubDate>Tue, 23 May 2017 09:30:02 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10872/#p10872</guid>
		</item>
		<item>
			<title><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link>https://forum.rutoken.ru/post/10871/#p10871</link>
			<description><![CDATA[<div class="quotebox"><cite>kpalych пишет:</cite><blockquote><p>Добрый день!<br />Нижеприведенная конструкция конструкция дает отрицательный результат:<br /></p><div class="codebox"><pre><code>...
$ok = openssl_verify(md5($str, true), base64_decode($signature), $pubkeyid, OPENSSL_ALGO_MD5);
if ($ok == 1) {
    echo &quot;ЭЦП корректна :)&quot;;
} elseif ($ok == 0) {
    echo &quot;ЭЦП не корректна!&quot;;
} else {
    echo &quot;Error: &quot; . openssl_error_string();
}
...</code></pre></div></blockquote></div><p>Добрый день, kpalych!</p><p>На вход <em>openssl_verify </em>надо подавать не хэш, а данные: <br /><em>$str</em>, вместо <em>md5($str, true)</em></p>]]></description>
			<author><![CDATA[null@example.com (Анатолий Убушаев)]]></author>
			<pubDate>Tue, 23 May 2017 09:19:15 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10871/#p10871</guid>
		</item>
		<item>
			<title><![CDATA[Проверка подписи под PHP7]]></title>
			<link>https://forum.rutoken.ru/post/10870/#p10870</link>
			<description><![CDATA[<p>Добрый день!</p><p>Имеются данные, подписанные RSA (2048bit) ключом на Рутокен ЭЦП 2.0 Flash.<br />На стороне сервера (Ubuntu + Nginx + PHP) аппаратного токена естественно нет.</p><p>Как проверить подпись на PHP имея в наличии<br />- Исходные даные (UTF-8 строка);<br />- Сертификат открытого ключа (выдан Тестовым Удостоверяющим Центром ООО &quot;КРИПТО-ПРО&quot;)<br />- Значение подписи (base64_encoded)?</p><p>Нижеприведенная конструкция конструкция дает отрицательный результат:</p><div class="codebox"><pre><code>&lt;?php
$str = &#039;Test string&#039;;
$signature = &#039;EsucP09CXnuaP3gOmB1GgmPAqVvKAP6q2qKHNHkdr5Xy1rYbYDTNgK0ue97SP9Zl52M8GSpXFvuRfzhlQ6Qg1Uk0CiTXHU9WgoZTFw8A1q83LmSMRoSM82/I5nW+tY9Qap4kqubupA6pN5aDOte6KuVhDLcy4NXD3EF08cz6Q5UyLlnujao4BYUAKWiPte0vofisZ1Oj9kNN/VKOxYv++zd5pw9PuGAt8tUhz1AMTTZjm9l+MROtbzhybjtPMSlD60/CxEx7Opgkg2UPczDSfQGsQcjWGwnq3iDkum0tukgtiz0g513jRZ8lwC6uMvCBtVDcR00JUUNSQZ32WKEUww==&#039;;

$certificateCApemContent =  file_get_contents($_SERVER[&#039;DOCUMENT_ROOT&#039;].&#039;/cert.pem&#039;);

$pubkeyid = openssl_get_publickey($certificateCApemContent);

$ok = openssl_verify(md5($str, true), base64_decode($signature), $pubkeyid, OPENSSL_ALGO_MD5);
if ($ok == 1) {
    echo &quot;ЭЦП корректна :)&quot;;
} elseif ($ok == 0) {
    echo &quot;ЭЦП не корректна!&quot;;
} else {
    echo &quot;Error: &quot; . openssl_error_string();
}

openssl_free_key($pubkeyid);

?&gt;</code></pre></div><p>Подписывались данные на C# (библиотека Pkcs11Interop):</p><div class="codebox"><pre><code>                using (Session session = m_Slot.OpenSession(false))
                {
                    session.Login(CKU.CKU_USER, m_UserPIN);

                    ObjectHandle publicKey = null;
                    ObjectHandle privateKey = null;
                    if (_getKeyPairHandles(session, keyPairLabel, out privateKey, out publicKey))
                    {
                        Mechanism mechanism = new Mechanism(CKM.CKM_MD5);
                        byte[] sourceData = ConvertUtils.Utf8StringToBytes(data);
                        byte[] digest = session.Digest(mechanism, sourceData);

                        mechanism = new Mechanism(CKM.CKM_RSA_PKCS);

                        signature = session.Sign(mechanism, privateKey, digest);
                    }
                    session.Logout();
                }</code></pre></div><p>Проверка на C# проходит успешно:</p><div class="codebox"><pre><code>            bool success = false;

            RSACryptoServiceProvider rsa = null;

            byte[] bytesToVerify = ConvertUtils.Utf8StringToBytes(originalMessage);
            byte[] signedBytes = Convert.FromBase64String(signature);
            try
            {
                X509Certificate2 cert = new X509Certificate2((certValue != &quot;&quot; ? Convert.FromBase64String(certValue) : m_Certificate), &quot;&quot;);
                rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;

                success = rsa.VerifyData(bytesToVerify, CryptoConfig.MapNameToOID(&quot;MD5&quot;), signedBytes);
            }
            catch (CryptographicException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (rsa != null) rsa.PersistKeyInCsp = false;
            }

            return success;</code></pre></div><p>Подскажите как проверить валидность подписи на PHP.</p>]]></description>
			<author><![CDATA[null@example.com (kpalych)]]></author>
			<pubDate>Tue, 23 May 2017 07:38:08 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10870/#p10870</guid>
		</item>
	</channel>
</rss>
