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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Семён  
#1 Оставлено : 8 августа 2012 г. 21:10:35(UTC)
Семён

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

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте!

Есть клиент, который генерит подписанные запросы на своем сертификате, есть серверная часть, которая поднимает tls-соединение с сервером УЦ и используя методы веб-сервиса УЦ шлет ему запросы, сгенеренные клиентом.
Подписанный запрос на обновление сертификата (метод SubmitRequest веб-сервиса) УЦ корректно обрабатывает, но не пускает запрос на подтверждение обновления (метод AcceptRequest) с ошибкой "Некорректная подпись запроса. Доступ запрещен."
Если использовать одинаковые сертификаты для поднятия соединения и запросов, все работает.

Посоветуйте пожалуйста, как можно решить эту проблему?
Код подключения на java:
Код:
System.setProperty("javax.net.ssl.trustStore", trustStorePath);        
System.setProperty("javax.net.ssl.trustStoreType", trustStoreType);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);                
System.setProperty("javax.net.ssl.keyStoreType", keyStoreType);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
CertRequestSoapPortProxy crspp = new CertRequestSoapPortProxy(wsEndpoint);
crspp.submitRequest(submitRequest, UID);
...
crspp.acceptRequest(reqId, acceptRequest);

Если все так, как я полагаю, можно для каждого клиента программно импортировать его сертификат и ключ в trustStore и keyStore соответственно, но есть ли способ проще?
Offline Семён  
#2 Оставлено : 9 августа 2012 г. 13:26:32(UTC)
Семён

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

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

Сказал(а) «Спасибо»: 2 раз
Может можно как-нибудь отключить проверку сертификата, с которым поднимается соединение?
Offline Евгений Афанасьев  
#3 Оставлено : 9 августа 2012 г. 13:51:05(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,030
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 727 раз в 685 постах
Здравствуйте.
Некий клиент формирует запрос (как подписывается запрос?) и передает его на ваш сервер, где создается tls-соединение с сервером УЦ. Непонятна фраза "одинаковые сертификаты для соединения и запросов" - нужно использовать разные?
Offline Семён  
#4 Оставлено : 9 августа 2012 г. 14:06:26(UTC)
Семён

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

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

Сказал(а) «Спасибо»: 2 раз
Да, клиент формирует запрос на основе своего сертификата, подписывает запрос им же и отправляет запрос на сервер. Затем сервер со своим сертификатом создает соединение на своем сертификате и производит запрос. Клиентский и серверный сертификаты имеют одинаковые разрешения, кстати.
Одинаковые сертификаты для соединения и запросов - имел ввиду, что если я использую для генерации запросов и для поднятия соединения один и тот же сертификат, то AcceptRequest проходит без ошибок.
Если я правильно понимаю, проблема и состоит в том, что используются разные сертификаты для подписывания запроса и для соединения.
Передавать сертификаты с закрытыми ключами с клиентов и импортировать их в TrustStore и KeyStore на сервере проблематично. Есть ли варианты проще?
Offline Евгений Афанасьев  
#5 Оставлено : 9 августа 2012 г. 14:20:53(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,030
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 727 раз в 685 постах
Клиент формирует некий запрос определенного формата и подписывает его своим ключом (допустим, XML-документ) или это запрос на выпуск сертификата?
Один и тот же сертификат для соединения и запроса - это клиентский сертификат, не серверный, с клиентским работает? В таком случае, если клиент использует сертификат без расширения client authentication и т.д., то получается, что AcceptRequest никак не выполнится. Передавать клиентские закрытые ключи куда-либо, по идее, запрещено. Надо разбираться, почему AcceptRequest работает, только когда используются клиентский (а не серверный) закрытый ключ и сертификат.

Отредактировано пользователем 9 августа 2012 г. 14:22:18(UTC)  | Причина: Не указана

Offline Семён  
#6 Оставлено : 9 августа 2012 г. 14:57:47(UTC)
Семён

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

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

Сказал(а) «Спасибо»: 2 раз
Клиент формирует запрос на обновление сертификата, подписывает запрос и отправляет его на сервер строкой в формате pkcs#7. Клиентский и серверный сертификаты по сути одинаковы, просто выпущены на разных субъектов. Разрешения у них одинаковы - 1.3.6.1.5.5.7.3.2, 1.3.6.1.4.1.16745.4.3.1.
На стороне УЦ доступ с сертификатами с такими разрешениями открыт для выполнения всех нужных мне запросов (SubmitRequest, AcceptRequest, GetCertificateInfo, ConfirmRequest), в т.ч. право delegate. Попробую сейчас подписывать запросы на серверным сертификатом, может поможет...
Offline Семён  
#7 Оставлено : 14 августа 2012 г. 13:38:25(UTC)
Семён

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

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

Сказал(а) «Спасибо»: 2 раз
Подскажите пожалуйста, какими средствами для java пользоваться, чтобы переподписать подписанный запрос формата pkcs#7 другим сертификатом?

Пытался брать клиентский запрос SubmitRequest и на нем формировать AcceptRequest, используя библиотеку capicom с помощью bridge2java, но появились проблемы с преобразованием типов (ICertificate2 в ICertificate, например). Пытался подписывать AcceptRequest, сформированный клиентом, с помощью класса Signature по мануалу по jcp, но УЦ выдает ошибку:
Цитата:
Ошибка модуля удаленного доступа к ЦР КриптоПро УЦ:
Метод: CertRequest.AcceptRequest
Источник: CertRequest.AcceptRequest
Номер: 0x80040202 (-2147220990)
Описание: Запросы не совпадают.

Код простейший, беру подписанный клиентом запрос AcceptRequest, декодирую, подписываю закрытым ключом сервера, затем снова в base64 и отправляю в УЦ:
Код:
...
Signature sig = Signature.getInstance("CryptoProSignature");
sig.initSign(privKey);
sig.update(decodedBytes);
sig.sign();
return Base64.encode(decodedBytes); 

Возможно, нужно как-то удалять подпись клиента?

Отредактировано пользователем 14 августа 2012 г. 13:39:01(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 14 августа 2012 г. 13:57:09(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,030
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 727 раз в 685 постах
В samples_src.jar есть несколько примеров по работе с CMS сообщениями, посмотрите их. Там происходит декодирование, подпись и проверка подписи. Если возможно проверить 2 подписи, то подпись клиента можно не удалять.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.