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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline aleks_9  
#1 Оставлено : 27 июня 2020 г. 18:46:29(UTC)
aleks_9

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день!

Помогите, пожалуйста, разобраться.
Требуется настроить HTTPS для приложения на SpringBoot.
Есть контейнер закрытого ключа, находящийся в C:\Users\user\AppData\Local\Crypto Pro\mycont.000
Идентификатор контейнера: lp-11cb2070-f102-41c8-8a3a-6bc8f87eb66b

Настройки для SpringBoot сделаны следующие:

server:
port: 8443
http2:
enabled: true

ssl:
protocol: GostTLS
enabled: true
key-store-provider: JCP
key-store: C:\Users\user\AppData\Local\Crypto Pro
key-store-type: HDImageStore
ciphers: TLS_CIPHER_2012,TLS_CIPHER_2001
key-store-password: 1234
key-alias: lp-11cb2070-f102-41c8-8a3a-6bc8f87eb66b
enabled-protocols: TLSv1.2,GostTLS,GostTLSv1.1,GostTLSv1.2



В коде соответственно прописано:

public static void main(String[] args) {
Security.addProvider(new JCP());
SpringApplication.run(MyApplication.class, args);

}

При попытке запуска выдаётся ошибка
Caused by: org.springframework.boot.web.server.WebServerException: Could not load key store 'C:\Users\user\AppData\Local\Crypto Pro'

....

Caused by: java.io.IOException: Неверный формат хранилища.
at ru.CryptoPro.JCP.KeyStore.TrustStore.engineLoad(Unknown Source) ~[JCP-2.0.40132-A.jar:40132-A]
at ru.CryptoPro.JCP.KeyStore.JCPKeyStore.engineLoad(Unknown Source) ~[JCP-2.0.40132-A.jar:40132-A]
at java.security.KeyStore.load(KeyStore.java:1479) ~[?:?]

Offline Евгений Афанасьев  
#2 Оставлено : 28 июня 2020 г. 14:20:00(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Здравствуйте.
В случае JCP, фактически, нет понятия файлового ключевого хранилища вроде pfx, т.к. ключевой контейнер - это папка вида xxxxxxxx.yyy. Поэтому надо либо убрать key-store совсем, либо (если первое нельзя сделать) в качестве key-store укажите не место хранения таких контейнеров, а файловое хранилище доверенных корневых сертификатов формата CertStore или иного подходящего. Допустим, если это хранилище формата CertStore, созданное в панели управления JCP или с помощью keytool, то запись может выглядеть так:
Код:

key-store: C:\my.store

Другое дело, что в приведенном вами конфиге должна быть возможность указать trust-store. Оно необходимо для проверки цепочки сертификатов другой стороны. Конфиг должен выглядеть ориентировочно так:
1) если можно без key-store:
Код:

ssl:
protocol: GostTLS
enabled: true
key-store-provider: JCP
key-store-type: HDImageStore
ciphers: TLS_CIPHER_2012,TLS_CIPHER_2001
key-store-password: 1234
key-alias: lp-11cb2070-f102-41c8-8a3a-6bc8f87eb66b
enabled-protocols: TLSv1.2,GostTLS,GostTLSv1.1,GostTLSv1.2
trust-store-provider: JCP
trust-store: C:\my.store
trust-store-type: CertStore
trust-store-password: 1234

2) если без key-store нельзя:
Код:

ssl:
protocol: GostTLS
enabled: true
key-store-provider: JCP
key-store: C:\my.store
key-store-type: HDImageStore
ciphers: TLS_CIPHER_2012,TLS_CIPHER_2001
key-store-password: 1234
key-alias: lp-11cb2070-f102-41c8-8a3a-6bc8f87eb66b
enabled-protocols: TLSv1.2,GostTLS,GostTLSv1.1,GostTLSv1.2
trust-store-provider: JCP
trust-store: C:\my.store
trust-store-type: CertStore
trust-store-password: 1234

В примерах пароль trust store совпадает с паролем к ключевому контейнеру, возможно, это не обязательно.
trust store может быть иного формата, например, JKS с указанием этого типа.
key-alias тут, скорее всего, не нужен (не влияет).
В enabled-protocols, возможно, надо перечислить TLSv.1.2,TLSv.1.1,TLSv1

Отредактировано пользователем 28 июня 2020 г. 14:20:33(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Санчир Момолдаев оставлено 30.06.2020(UTC)
Offline aleks_9  
#3 Оставлено : 28 июня 2020 г. 16:39:27(UTC)
aleks_9

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

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

Сказал(а) «Спасибо»: 1 раз
1) Похоже, что совсем без key-store нельзя - выдаёт ошибку:
Код:
Caused by: org.springframework.boot.web.server.WebServerException: Could not load key store 'null'


2) А разве store не должен содержать контейнер закрытого ключа? Тогда как будет работать HTTPS?
Попробовал создать хранилище
Код:
keytool -import -file C:\work\cp\CE703E7CB8647BECE9F6613665C1613D1EA05CF4.cer -alias firstCA -keystore my.store

Хранилище создалось. В конфиге прописал его как во втором варианте вашего ответа, но выдаётся ошибка:
Код:
Caused by: java.io.IOException: Неверный формат хранилища.
	at ru.CryptoPro.JCP.KeyStore.TrustStore.engineLoad(Unknown Source) ~[JCP-2.0.40132-A.jar:40132-A]
	at ru.CryptoPro.JCP.KeyStore.JCPKeyStore.engineLoad(Unknown Source) ~[JCP-2.0.40132-A.jar:40132-A]


3) Попробовал следующий вариант. Сохранил контейнер mycont.000 в mycont.pfx
Пытался экспортировать его в store, но выходит ошибка.

Код:
C:\work\cp>keytool -providerpath libs/JCP.jar;libs/ASN1P.jar;libs/asn1rt.jar;libs/forms_rt.jar -provider ru.CryptoPro.JCP.JCP -importkeystore -srckeystore mycont.pfx -srcstoretype pkcs1
2 -destkeystore mynew.store -deststoretype pkcs12
Importing keystore o-code-test.pfx to mynew.store...
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
keytool error: java.security.UnrecoverableKeyException: Get Key failed: Cannot find any provider supporting 1.2.840.113549.1.12.1.80


Или я не туда копаю?
Offline Евгений Афанасьев  
#4 Оставлено : 29 июня 2020 г. 10:39:35(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
1) хорошо, попробуйте туда дать trust store, т.к. поддержки файловых хранилищ типа pfx в JCP нет (потому п. 3 тоже не подходит). trust store должно быть формата CertStore, созданное с этим типом в панели управления или в keytool. Команды для keytool можно посмотреть в рук-ве разработчика.
2) раз не указан тип хранилища в keytool, было создано хранилище с типом по умолчанию, т.е. JKS. Оно не подойдет, т.к. вы написали, что нет возможности указать trust-store, только key-store. Значит, нужно CertStore.
trust store должно содержать только доверенные корневые сертификаты, а ключевой контейнер будет найден по паролю и типу HDImageStore.

Отредактировано пользователем 29 июня 2020 г. 10:40:44(UTC)  | Причина: Не указана

Offline aleks_9  
#5 Оставлено : 29 июня 2020 г. 15:26:16(UTC)
aleks_9

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

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

Сказал(а) «Спасибо»: 1 раз
Дело немного продвинулось. С помощью следующей команды создал соответствующий вашему совету CertStore:
Код:
keytool -providerpath libs/JCP.jar;libs/ASN1P.jar;libs/asn1rt.jar;libs/forms_rt.jar -provider ru.CryptoPro.JCP.JCP -import -file C:\work\cp\CE703E7CB8647BECE9F6613665C1613D1EA05CF
4.cer -alias firstCA -keystore myTrust.store -storepass 12345678 -storetype CertStore

Конфигурация SpringBoot теперь выглядит так:
Код:

ssl:
    protocol: GostTLS
    enabled: true
    key-store-provider: JCP
    key-store: C:\work\cp\myTrust.store
    key-store-type: HDImageStore
    ciphers: TLS_CIPHER_2012,TLS_CIPHER_2001
    key-store-password: 12345678
    key-alias: lp-11cb2070-f102-41c8-8a3a-6bc8f87eb66a
    enabled-protocols: TLSv1.2,TLSv1.1,TLSv1
    trust-store-provider: JCP
    trust-store: C:\work\cp\myTrust.store
    trust-store-type: CertStore
    trust-store-password: 12345678

Приложение теперь стартует, но при попытке обратиться по адресу https://localhost:8443
В ответ получаю в браузере:
На сайте localhost используется неподдерживаемый протокол.
ERR_SSL_VERSION_OR_CIPHER_MISMATCH

В консоли выводится:
Код:
Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common
	at sun.security.ssl.Alert.createSSLException(Alert.java:131) ~[?:?]
	at sun.security.ssl.Alert.createSSLException(Alert.java:117) ~[?:?]


Как быть дальше?
Offline Евгений Афанасьев  
#6 Оставлено : 29 июня 2020 г. 15:49:08(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
КриптоПро CSP установлен и браузер - Internet Explorer (тут проще проверять)?
Offline aleks_9  
#7 Оставлено : 29 июня 2020 г. 15:55:22(UTC)
aleks_9

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

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

Сказал(а) «Спасибо»: 1 раз
Да,
КриптоПро CSP 5.0.11455 KC1
IE 11.0.9600.19596
Offline Евгений Афанасьев  
#8 Оставлено : 29 июня 2020 г. 16:12:39(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
1. В папке /var/opt/cprocsp/keys/<user> лежит контейнер для сервера? Видимо, контейнер с алиасом lp-11cb2070-f102-41c8-8a3a-6bc8f87eb66a и паролем 12345678 типа HDImageStore. Контейнер доступен пользователю <user>, под которым запускается приложение?
Я бы еще предложил убрать параметр key-alias.
2. В сертификате сервера (в его ключевом контейнере) должна быть политика "серверная аутентификация". Она есть?
3. Еще, возможно, могут быть неточности в протоколах:
Код:

protocol: GostTLS
enabled-protocols: TLSv1.2,TLSv1.1,TLSv1

Возможно, в enabled-protocols тоже надо указать GostTLSv1.2,GostTLSv1.1,GostTLSv1
Нужен лог JTLS: https://support.cryptopr...lirovnija-kriptopro-jtls с уровнем ALL

Отредактировано пользователем 29 июня 2020 г. 16:16:06(UTC)  | Причина: Не указана

Offline aleks_9  
#9 Оставлено : 30 июня 2020 г. 11:07:49(UTC)
aleks_9

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

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

Сказал(а) «Спасибо»: 1 раз
1. Система Windows
Контейнер с alias'ом lp-11cb2070-f102-41c8-8a3a-6bc8f87eb66a и паролем 12345678 типа HDImageStore лежит в папке
C:\Users\user\AppData\Local\Crypto Pro
В Chrome установлен плагин КриптоПро, через который можно подписывать, так что контейнер работает.

Попробовал убрать key-alias - результат тот же

2. Имеется в виду в свойствах сертификата контейнера поле "Политика сертификата"? Если она, то у меня такая:
[1]Политика сертификата:
Идентификатор политики=Класс средства ЭП КС1
[2]Политика сертификата:
Идентификатор политики=Класс средства ЭП КС2

3. На попытки добавить GostTLSv1.2,GostTLSv1.1,GostTLSv1 выходит ошибка
Код:
java.lang.IllegalArgumentException: Unsupported protocolGostTLSv1.2


Попробовал сконфигурировать логи, пока никаких изменений выводе. Всё та же ошибка "no cipher suites in common".

Прилагаю лог. Logi ssl neudachnogo zaprosa.txt (63kb) загружен 2 раз(а).

К слову, нашёл более простой способ вывода ssl логов без настройки в файле logging.properties
Для этого нужно при запуске программы добавить параметр: -Djavax.net.debug=ssl,handshake,trustmanager
Offline Евгений Афанасьев  
#10 Оставлено : 30 июня 2020 г. 11:49:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
2. Я имел в виду:
Проверка подлинности сервера (1.3.6.1.5.5.7.3.1)
Это расширение должно быть в серверном сертификате.
3. В логе нет ни слова про CryptoPro, в стеке ошибки - тоже.
Код:

        javax.net.ssl.SSLHandshakeException: no cipher suites in common
  	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
  	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
  	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
  	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
  	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
  	at java.base/sun.security.ssl.ServerHello$T12ServerHelloProducer.chooseCipherSuite(ServerHello.java:461)
  	at java.base/sun.security.ssl.ServerHello$T12ServerHelloProducer.produce(ServerHello.java:294)
  	at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:436)
  	at java.base/sun.security.ssl.ClientHello$T12ClientHelloConsumer.consume(ClientHello.java:1101)
  	at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:851)
  	at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:810)
  	at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
  	at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:450)
  	at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1078)
  	at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1065)
  	at java.base/java.security.AccessController.doPrivileged(Native Method)
  	at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:1012)

SSL-реализация из java, не cpSSL (пакет ru.CryptoPro.ssl). Возможно, где-то надо указать еще и провайдер - "JTLS", или все-таки как-то обозначить точно протокол - "GostTLS", так как имя протокола - уникальное, в отличие, например, от "TLSv1".

P.S.
Цитата:

нашёл более простой способ вывода ssl логов без настройки в файле logging.properties
Для этого нужно при запуске программы добавить параметр: -Djavax.net.debug=ssl,handshake,trustmanager

Да, т.к. работала реализация Java JSSE провайдера, а не cpSSL.

Отредактировано пользователем 30 июня 2020 г. 11:51:07(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.