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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dmitryp  
#1 Оставлено : 14 июня 2019 г. 12:56:28(UTC)
dmitryp

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

Группы: Участники
Зарегистрирован: 11.07.2017(UTC)
Сообщений: 28
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Пример на Scala (загружаю созданное через панель управления хранилище с одним сертификатом):
Код:
import java.io._
import java.security._
import java.nio.file._
import scala.collection.JavaConverters._

Security.addProvider(new ru.CryptoPro.JCP.JCP)

val path = Paths.get("/home/dmitry/work/tmp/test.store")

def mkInputStream(path: Path) = Files.newInputStream(path)

def overrideAvailable(is: InputStream) =
  new FilterInputStream(is) {
    override def available = 0
  }

def dumpAliases(is: InputStream) = {
  val ks = KeyStore.getInstance("CertStore", "JCP")
  ks.load(is, null)
  println(ks.aliases.asScala.toList)
}

// Вывод (правильный): List(test-cert)
dumpAliases(mkInputStream(path))
// Вывод (неправильный): List()
dumpAliases(overrideAvailable(mkInputStream(path)))


Ubuntu 18.10, OpenJDK 11.0.3, JCP 2.0.40132-A

Могу предположить, что в реализации KeyStoreSpi InputStream.available используется для проверки того что ввод закончился. Это некорректно - см. javadoc:
Цитата:
Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking, which may be 0, or 0 when end of stream is detected.
Offline Евгений Афанасьев  
#2 Оставлено : 17 июня 2019 г. 16:28:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Спасибо за информацию.
А с какой целью
Автор: dmitryp Перейти к цитате
def overrideAvailable(is: InputStream) =
new FilterInputStream(is) {
override def available = 0
}

?
Offline dmitryp  
#3 Оставлено : 18 июня 2019 г. 5:20:48(UTC)
dmitryp

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

Группы: Участники
Зарегистрирован: 11.07.2017(UTC)
Сообщений: 28
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Евгений, одна из используемых библиотек (fs2) создаёт нестандартные InputStream'ы, которые приводят к данной проблеме. Минимизацией выяснил, что дело в InputStream.available, поэтому в примере использовать саму библиотеку не потребовалось.
Offline Евгений Афанасьев  
#4 Оставлено : 18 июня 2019 г. 12:29:49(UTC)
Евгений Афанасьев

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

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

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