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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline serg-bs  
#1 Оставлено : 28 марта 2013 г. 15:56:54(UTC)
serg-bs

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

Группы: Участники
Зарегистрирован: 23.01.2013(UTC)
Сообщений: 11
Российская Федерация
Откуда: Владимир

Сказал(а) «Спасибо»: 1 раз
Добрый день.
В текущий момент есть следующая задача.
Гостовые токены, которые функционируют в системе интернет банка, необходимо проверить подпись, сертификат УЦ сохранен в базе данных интернет банка.
Далее мы получаем от клиента PKCS#7, и требование банка, чтобы мы его проверяли с помощью Крипто Про CSP. Я не силен в майкрософтовских технологиях, поэтому нужен совет.
В документации по крипто про я вижу , что для проверки подписи надо обязательно импортировать открытые ключи. Есть ли возможность проверять, не импортируя ключи?
Или таким образом проверяется цепочка сертификатов? При импорте сертификата обязательно присутствие CA сертификата в хранилище? Или цепочку сертификатов есть способ проверять отдельно? Как это например реализовано в java, например с помощью того же bouncyCastle, это сделать можно.

Спасибо за ответы.
Offline Максим Коллегин  
#2 Оставлено : 28 марта 2013 г. 17:05:43(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Не понял про импорт ключей, но чтобы функция построения цепочки сертификатов работала - корневой должен быть в хранилище ROOT. Или интеллектуально обрабатывать ошибки.
Знания в базе знаний, поддержка в техподдержке
Offline serg-bs  
#3 Оставлено : 28 марта 2013 г. 22:28:29(UTC)
serg-bs

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

Группы: Участники
Зарегистрирован: 23.01.2013(UTC)
Сообщений: 11
Российская Федерация
Откуда: Владимир

Сказал(а) «Спасибо»: 1 раз
Судя по документации перед использованием
Код:

    if(CryptVerifySignature(
        hHash, 
        pbSignature, 
        dwSigLen, 
        hPubKey,
        NULL, 
        0)) 

мы должны иметь hPubKey который
получается при импорте
Код:

   if(CryptImportKey(
        hProv,
        pbKeyBlob,
        dwBlobLen,
        0,
        0,
        &hPubKey))


Как минимум мне кажется импорт это дорогостоящая операция. Представьте, что в интернет банке на каждую платежку нам надо сделать импорт сертификата. А если уже он там есть, то читать его или искать по каким то условиям, хотя мы его имеем в PKCS#7.

Вот пример из bouncycastle
Код:
 
/**
   * Take a CMS Signed-Data message and a trust anchor and determine if
   * the message is signed with a valid signature from a end entity
   * entity certificate recognized by the trust anchor rootCert.
   */
  public static boolean isValid(
      CMSSignedData signedData, X509Certificate rootCert) throws Exception
  {
      CertStore certsAndCRLs = signedData.getCertificatesAndCRLs(
                                                            "Collection", "BC");
      SignerInformationStore signers = signedData.getSignerInfos();
      Iterator               it = signers.getSigners().iterator();

      if (it.hasNext())
      {
         SignerInformation        signer = (SignerInformation)it.next();
         X509CertSelector         signerConstraints = signer.getSID();

         signerConstraints.setKeyUsage(getKeyUsageForSignature());

         PKIXCertPathBuilderResult result = Utils.buildPath(
                                      rootCert, signer.getSID(), certsAndCRLs);

         return signer.verify(result.getPublicKey(), "BC");
      }
      return false;
    }
}


Не надо никаких импортов ни в какие хранилища, на вход pkcs#7 и сертификат CA. Идеальный вариант. Но заказчик сказал только Крипто Про CSP. Собственно, есть ли аналог в Крипто Про CSP. Насколько я вижу для всех функций проверки нужен дескриптор открытого ключа, а его можно получить только если сертификат проимпортирован.
Offline Юрий  
#4 Оставлено : 29 марта 2013 г. 9:16:51(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Без понятия насчет bouncycastle и Java, но судя по приведенному коду и импорт публичного ключа и поиск сертификата в локальном хранилище в этом коде присутствуют:
1) CertStore certsAndCRLs = signedData.getCertificatesAndCRLs("Collection", "BC"); - Это получение всех сертификатов из локального хранилища;
2) return signer.verify(result.getPublicKey(), "BC"); - Это импорт публичного ключа;

Если сертификат подписанта уже содержится в сообщении, то импортировать публичный ключ можно и прямо из первичного сообщения.
Вообщем пока я (как и многие другие, наверное, на этом форуме) слабо представляю что вы хотите.

Попробуйте ещё раз переформулировать свои вопросы или/и почитать про PKCS#7 (а лучше про CMS - RFC5652).
С уважением,
Юрий Строжевский
Offline Максим Коллегин  
#5 Оставлено : 29 марта 2013 г. 15:07:16(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Смотрите в сторону CryptVerifyMessageSignature
http://msdn.microsoft.co...p/aa380278(v=vs.85).aspx
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.