Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline foster06  
#1 Оставлено : 16 июня 2010 г. 20:07:23(UTC)
foster06

Статус: Участник

Группы: Участники
Зарегистрирован: 10.06.2010(UTC)
Сообщений: 13

Разрабатываю приложение, которое общается с Крипто-Про через SOAP. Для разработки используется MS Soap toolkit версии 3.0. Делаю все в точности как с примером из Руководства программиста:

Код:

#import "msxml4.dll"
#import "mssoap30.dll" exclude("IErrorInfo", "IStream", "ISequentialStream", "_LARGE_INTEGER", "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
 
#define serviceURL L"https://localhost/RA/RA.wsdl"
#define adminCertName L"CURRENT_USER\\My\\Администратор"

...

HRESULT hr; 
CComQIPtr < MSSOAPLib30::ISoapClient, &__uuidof(MSSOAPLib30::ISoapClient) > oSoap; 
hr = oSoap.CoCreateInstance (__uuidof(MSSOAPLib30::SoapClient30)); 
hr = oSoap->MSSoapInit (serviceURL, L"RA", L"CertViewSoapPort", L""); 
CComDispatchDriver oDisp; 
hr = oSoap->QueryInterface(&oDisp); 
oSoap->ConnectorProperty[L"SSLClientCertificateName"] = adminCertName; 
oSoap->ConnectorProperty[L"UseSSL"] = CComVariant(true); 
oSoap->ConnectorProperty[L"Timeout"] = CComVariant(long(60000)); 
DISPID dispID; 
hr = oDisp.GetIDOfName(L"GetCACertificate", &dispID);


В строке hr = oSoap->MSSoapInit (serviceURL, L"RA", L"CertViewSoapPort", L""); возникает исключение, из-за того что функция MSSoapInit вернула E_INVALIDARG. И при этом в системном журнале событий появились 3 события-ошибки:

Soap error: XML Parser failed at linenumber 0, lineposition 0, reason is: System error: -2146697191.

Soap error: Loading of the WSDL file failed.

Soap error: One of the parameters supplied is invalid..

При этом Центр регистрации прекрасно работает. COM объект oSoap создается, но инициализация не проходит. Не подскажите в чем может быть дело?

Offline Kirill Sobolev  
#2 Оставлено : 16 июня 2010 г. 20:42:01(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
В сертификате вебсервера ЦР CN именно localhost? Вообще, URL L"https://localhost/RA/RA.wsdl" из браузера открывается без каких-либо ошибок или дополнительных запросов?
Техническую поддержку оказываем тут
Наша база знаний
Offline foster06  
#3 Оставлено : 16 июня 2010 г. 21:22:24(UTC)
foster06

Статус: Участник

Группы: Участники
Зарегистрирован: 10.06.2010(UTC)
Сообщений: 13

URL "https://localhost/RA/RA.wsdl" открывается, но с ошибкой сертификата.
CN сертификата веб сервера такой: aetpca.cp.ru
Если поменять URL на "https://aetpca.cp.ru/RA/RA.wsdl" то инициализация проходит нормально.
Как тогда сделать локальное обращение к цетру регистрации?
Offline Kirill Sobolev  
#4 Оставлено : 16 июня 2010 г. 21:31:06(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Сделать ему сертификат с CN localhost или обращаться по тому имени, что прописано в текущем сертификате.
Техническую поддержку оказываем тут
Наша база знаний
Offline foster06  
#5 Оставлено : 17 июня 2010 г. 13:43:50(UTC)
foster06

Статус: Участник

Группы: Участники
Зарегистрирован: 10.06.2010(UTC)
Сообщений: 13

Хорошо, спасибо.

Еще одна ошибка из того же примера:

Код:

hr = oDisp.GetIDOfName(L"GetCACertificate", &dispID); 
CComVariant vType(long(0)); 
hr = oDisp.Invoke1 (dispID, &vType, vCert);


в первой строке dispID равно 11, но в последней строке возвращается значение 0x80092004 Объект или свойство не найдено. Пробовал с другими функциями из того же порта, результат тот же.
Offline Kirill Sobolev  
#6 Оставлено : 17 июня 2010 г. 14:20:52(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Скорее всего проблема с клиентским сертификатом. Поставьте пароль на контейнер и посмотрите - будет появляться окно при вызове Invoke или нет.
Техническую поддержку оказываем тут
Наша база знаний
Offline foster06  
#7 Оставлено : 17 июня 2010 г. 16:00:00(UTC)
foster06

Статус: Участник

Группы: Участники
Зарегистрирован: 10.06.2010(UTC)
Сообщений: 13

У меня много контейнеров, подскажите какой именно контейнер используется при соединении через SOAP.
Если проблема в клиентском сертификате, то можно ли взять сертификат пользователя Крипто-Про, куда его установить и какое потом правильное свойство oSoap->ConnectorProperty[_T("SSLClientCertificateName")] необходимо указать для правильной аутентификации?
Offline foster06  
#8 Оставлено : 17 июня 2010 г. 16:39:24(UTC)
foster06

Статус: Участник

Группы: Участники
Зарегистрирован: 10.06.2010(UTC)
Сообщений: 13

Получилось!
Использовал тот сертификат, который использует IE для доступа к
Цитата:
https://aetpca.cp.ru/RA/RA.wsdl

И тогда все заработало. Спасибо за помощь.
Offline Zokeez  
#9 Оставлено : 8 июля 2010 г. 17:53:45(UTC)
Zokeez

Статус: Участник

Группы: Участники
Зарегистрирован: 06.07.2010(UTC)
Сообщений: 13
Откуда: Chelyabinsk

Поблагодарили: 1 раз в 1 постах
Цитата:
Получилось!
Использовал тот сертификат, который использует IE


И в итоге, в каком виде вы задавали свойство:
oSoap->ConnectorProperty[_T("SSLClientCertificateName")]

У меня аналогичная проблема, dispID равно 11, а oDisp.Invoke1 возвращает "x80092004 Объект или свойство не найдено". На компе два контейнера, поставил пароли на оба, но никаких изменений не заметил, в том числе когда захожу через IE.

Я так понимаю, поиск ведется среди всех сертификатов в Личном хранилище пользователя Администратор, т.е. указывать конкретный сертификат не обязательно что ли.

Как только не пробовал:
oSoap->ConnectorProperty[_T("SSLClientCertificateName")] = CURRENT_USER\\My\\имя_контейнера;
oSoap->ConnectorProperty[_T("SSLClientCertificateName")] = имя_контейнера;
oSoap->ConnectorProperty[_T("SSLClientCertificateName")] = "путь до файла .cer";

Отредактировано пользователем 8 июля 2010 г. 18:41:05(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#10 Оставлено : 8 июля 2010 г. 20:34:38(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
SSLClientCertificateName - это имя сертификата в формате CURRENT_USER\LOCAL_MACHINE\store-name\cert-name, к имени контейнера никак не привязанное.
А cert_name (из MSDN) это

Цитата:
CERT_NAME_SIMPLE_DISPLAY_TYPE
Iterates through the following list of name attributes and uses the Subject Name or the Subject Alternative Name extension for the first occurrence of: szOID_COMMON_NAME, szOID_ORGANIZATIONAL_UNIT_NAME, szOID_ORGANIZATION_NAME, or szOID_RSA_emailAddr.

If one of these attributes is not found, uses the Subject Alternative Name extension for a rfc822Name choice. If there is still no match, uses the first attribute
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.