Статус: Участник
Группы: Участники
Зарегистрирован: 17.05.2017(UTC) Сообщений: 20
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
Добрый день. Прошу помощи стартануть. Есть задача организации подписания документов на сервере и работа с ЭЦП. Есть несколько вопросов: 1) По документации установили расширение для PHP. Но при запуске тестового файла возникает ошибка "The system cannot find the file specified. (0x80070002)". В чем может быть проблема? 2) Объяснте мне пжлс для чего устаналивается сертификат в коде и как это будет работать на боевой машине? 3) Может кто-то встречал документацию или хорошие статьи по php расширению крипто про? Спасибо Код: Код:<?php
//Вспомогательные функции предварительной инициализации
function SetupStore($location, $name, $mode)
{
$store = new CPStore();
$store->Open($location, $name, $mode);
return $store;
}
function SetupCertificates($location, $name, $mode)
{
$store = SetupStore($location, $name, $mode);
$certs = $store->get_Certificates();
return $certs;
}
function SetupCertificate($location, $name, $mode,
$find_type, $query, $valid_only,
$number)
{
$certs = SetupCertificates($location, $name, $mode);
if($find_type != NULL)
{
$certs = $certs->Find($find_type, $query, $valid_only);
return $certs->Item($number);
}
else
{
$cert = $certs->Item($number);
return $cert;
}
}
function test_CPSignedData_Sign_Verify()
{
try{
$content = "test content";
$address = "http://testca.cryptopro.ru/tsp/tsp.srf";
$cert = SetupCertificate(CURRENT_USER_STORE, "My", STORE_OPEN_READ_ONLY,
CERTIFICATE_FIND_SUBJECT_NAME, "Test", 0,
1);
if(!$cert)
return "Certificate not found";
$signer = new CPSigner();
$signer->set_TSAAddress($address);
$signer->set_Certificate($cert);
$sd = new CPSignedData();
$sd->set_ContentEncoding(1);
$sd->set_Content(base64_encode($content));
$sm = $sd->SignCades($signer, 1, false, 0);
printf("Signature is:\n");
printf($sm);
printf("\n");
$sd->Verify($sm, 0, VERIFY_SIGNATURE_ONLY);
return 1;
}catch(Exception $e)
{
printf($e->getMessage());
}
}
if(test_CPSignedData_Sign_Verify() == 1)
{
printf("TEST OK\n");
}else
{
printf("TEST FAIL\n");
}
?>
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
1. Тест сделан для проверки работы расширения после установки. Он создает и проверяет подпись. Для создания подписи на сервере требуется установленный сертификат и соответствующий ему закрытый ключ. Именно он скорее всего у вас и не находится. Пример предполагает что есть сертификат с именем "Test". Именно его он у вас и не находит. Имя "Test" можно поменять на любое другое. 2. Если вы про код примера, то он не устанавливается и ищется. Он нужен для создания подписи. 3. Отдельной документации на расширение нет. Все его обьекты повторяют обьекты из "ЭЦП Browser plug-in" с точностью до способа вызова. Описание обьектов можно посмотреть по ссылке http://cpdn.cryptopro.ru...ades/cadescom_class.htmlСамо расширение предоставляется в исходных кодах, какие то детали методов всегда можно посмотреть в коде. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 17.05.2024(UTC) Сообщений: 2
|
Столкнулся с такой же проблемой. Необходимо осуществить подпись на сервере. Плагины крипто про, .net sdk установлены. Сертификат также присутствует. При попытке создать экземпляр CPSigner вылетает ошибка: The system cannot find the file specified. (Exception from HRESULT: 0x80070002) at CAdESCOM.CPSignerClass.set_KeyPin(String pVal) Причем этот же код спокойно проходит Unit-тесты и на локальном сервере все отлично работает. Вот код: Код:
public class CrypterService
{
public byte[] MakeSign(byte[] data, string thumbprint, string pin)
{
string signature = "";
string tspServerAddress = @"http://qs.cryptopro.ru/tsp/tsp.srf";
CAdESCOM.CPStore pStore = new CAdESCOM.CPStore();
pStore.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_LOCAL_MACHINE_STORE, "MY", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY | CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
CAPICOM.ICertificates certificatesFromStore = pStore.Certificates;
CAPICOM.Certificate certificate = GetCertificates(certificatesFromStore).Find(x=> x.Thumbprint.ToLower() == thumbprint.ToLower());
CPSigner cpsigner = new CPSigner
{
Certificate = certificate,
//KeyPin = pin,
KeyPin = Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(pin)),
TSAAddress = tspServerAddress,
Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
};
CadesSignedData cadesSignedData = new CadesSignedData
{
ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY,
Content = Convert.ToBase64String(data)
};
signature = cadesSignedData.SignCades(cpsigner, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);
cadesSignedData.VerifyCades(signature, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true);
return Convert.FromBase64String(signature);
}
private List<CAPICOM.Certificate> GetCertificates(ICertificates certificates)
{
List<CAPICOM.Certificate> certs = new List<Certificate>();
for (int i = 0; i < certificates.Count; i++)
{
try
{
certs.Add((CAPICOM.Certificate)certificates[i]);
}
catch { }
}
return certs;
}
}
При том, я разными способами пытался присвоить значение к KeyPin, от обычной строки, до разных конвертов Заранее спасибо
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,318 Сказал «Спасибо»: 549 раз Поблагодарили: 2207 раз в 1722 постах
|
Здравствуйте.
А конфигурация ПО? Номера сборок? Локальные\на сервере...
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,318 Сказал «Спасибо»: 549 раз Поблагодарили: 2207 раз в 1722 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 17.05.2024(UTC) Сообщений: 2
|
Цитата:А конфигурация ПО? Номера сборок? Локальные\на сервере... Локальные: КриптоПро .NET SDK 2.0.8586.0 КриптоПро CSP 5.0.12000 Сервер: CryptoPro .NET Server 2.0.8586.0 CryptoPro CSP 5.0.12500 Для подписания я использую (и локально, и на сервере) библиотеки Interop.CAdESCOM.dll (ver 1.0.0.0) и Interop.CAPICOM (ver 2.1.0.0) (ну или то, что мне говорит винда) Цитата:KeyPin появился в ICPSigner4 cadescom_interface/icpsigner4keypin Да, и я так понимаю, что CPSigner (он же CPSignerClass) реализует аж ICPSigner6, CPSigner, ICPSigner5, ICPSigner4, ICPSigner3, ICPSigner2, ICPSigner, ISigner2, ICSigner Отредактировано пользователем 17 мая 2024 г. 22:53:25(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close