<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Рутокен &mdash; Проверка подписи под PHP7]]></title>
	<link rel="self" href="https://forum.rutoken.ru/feed/atom/topic/2636" />
	<updated>2017-05-23T14:04:18Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.rutoken.ru/topic/2636/</id>
		<entry>
			<title type="html"><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/10883/#p10883" />
			<content type="html"><![CDATA[<p>Возможно, проблема в &quot;УЦ Крипто-Про&quot; и в OpenSSL.<br />УЦ - подписывает ваш RSA-сертификат, ГОСТ-ключевой парой, а в OpenSSL возможно, возникают проблемы с такого рода &quot;гибридными&quot; сертификатами. Для того чтобы удостовериться в этом, советуем вам найти другой тестовый УЦ, который подписывает RSA-ключевой парой.</p>]]></content>
			<author>
				<name><![CDATA[Анатолий Убушаев]]></name>
				<uri>https://forum.rutoken.ru/user/10096/</uri>
			</author>
			<updated>2017-05-23T14:04:18Z</updated>
			<id>https://forum.rutoken.ru/post/10883/#p10883</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/10876/#p10876" />
			<content type="html"><![CDATA[<p>Попробуйте на проверку передать сам сертификат.<br />Если не поможет, можно ещё дополнительно убедиться, что открытые ключи совпадают при проверке в php и в C#.<br />И на крайний случай – попробовать пореверсить буферы (подпись, ключ)</p>]]></content>
			<author>
				<name><![CDATA[Анатолий Убушаев]]></name>
				<uri>https://forum.rutoken.ru/user/10096/</uri>
			</author>
			<updated>2017-05-23T10:58:56Z</updated>
			<id>https://forum.rutoken.ru/post/10876/#p10876</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/10874/#p10874" />
			<content type="html"><![CDATA[<p>Результат 0, срабатывает ветка:</p><div class="codebox"><pre><code>} elseif ($ok == 0) {
    echo &quot;ЭЦП не корректна!&quot;;
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[kpalych]]></name>
				<uri>https://forum.rutoken.ru/user/10690/</uri>
			</author>
			<updated>2017-05-23T10:26:58Z</updated>
			<id>https://forum.rutoken.ru/post/10874/#p10874</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/10873/#p10873" />
			<content type="html"><![CDATA[<p>Отрицательный результат это -1 (ошибка при проверке подписи) или 1 (подпись неверна)?<br />Если -1, то что пишет openssl_error_string?</p>]]></content>
			<author>
				<name><![CDATA[Анатолий Убушаев]]></name>
				<uri>https://forum.rutoken.ru/user/10096/</uri>
			</author>
			<updated>2017-05-23T10:18:17Z</updated>
			<id>https://forum.rutoken.ru/post/10873/#p10873</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/10872/#p10872" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[kpalych]]></name>
				<uri>https://forum.rutoken.ru/user/10690/</uri>
			</author>
			<updated>2017-05-23T09:30:02Z</updated>
			<id>https://forum.rutoken.ru/post/10872/#p10872</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проверка подписи под PHP7]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/10871/#p10871" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Анатолий Убушаев]]></name>
				<uri>https://forum.rutoken.ru/user/10096/</uri>
			</author>
			<updated>2017-05-23T09:19:15Z</updated>
			<id>https://forum.rutoken.ru/post/10871/#p10871</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Проверка подписи под PHP7]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/10870/#p10870" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[kpalych]]></name>
				<uri>https://forum.rutoken.ru/user/10690/</uri>
			</author>
			<updated>2017-05-23T07:38:08Z</updated>
			<id>https://forum.rutoken.ru/post/10870/#p10870</id>
		</entry>
</feed>
