21.09.2007 11:51:57JTLS & Tomcat Ответов: 16
Андрей
Не удается подружить JBoss(Tomcat) с JTLS.

С помощью кода
try
{
KeyPairGenerator kg = KeyPairGenerator.getInstance("GOST3410DH");
KeyPair pair = kg.generateKeyPair();
// закрытый ключ обмена
PrivateKey privKey = pair.getPrivate();
// соответствующий ему открытый ключ
PublicKey pubKey = pair.getPublic();

final GostCertificateRequest req;
req = new GostCertificateRequest();
req.init("GOST3410DH", true);
final byte[] encodedCert = req.getEncodedSelfCert(pair, "CN=tomcat,OU=Security,O=CryptoPro,C=RU");
final CertificateFactory cf = CertificateFactory.getInstance("X509");
final java.security.cert.Certificate[] certs;
certs = new java.security.cert.Certificate[1];
certs[0] =
cf.generateCertificate(new ByteArrayInputStream(encodedCert));

KeyStore hdImageStore = KeyStore.getInstance("FloppyStore");
hdImageStore.load(null, null);
hdImageStore.setKeyEntry("tomcat", privKey, "tomcat".toCharArray(), certs);
hdImageStore.store(new FileOutputStream(new File("A:\\.keystore")), "tomcat".toCharArray());
}
catch(Exception e)
{
e.printStackTrace();;
}

на дискете создатся файлы
a:\.keystore(12 байт) и a:\tomcat.000\masks2.key (primary2.key, masks.key, primary.key, header.key, name.key)

В Tomcat прописан коннектор

<Connector port="8443" maxHttpHeaderSize="8192"
SSLEnabled="true"
SSLImplementation="ru.CryptoPro.TomCatSSL.JSSEImplementation"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false"
sslProtocol="GostTLS"
algorithm="GostX509"
keystoreProvider="JCP"
keystoreType="FloppyStore"
keystoreFile="A:\.keystore"
keystorePass="tomcat"
keyalg="GOST3410"
sigalg="GOST3411withGOST3410EL"
keyAlias="tomcat" />

При старте JBoss'a возникает ошибка
11:40:06,303 ERROR [JSSESocketFactory] Exception trying to load keystore A:\.keystore
java.security.KeyStoreException: FloppyStore not found
at java.security.KeyStore.getInstance(KeyStore.java:565)
at ru.CryptoPro.TomCatSSL.JSSESocketFactory.a(Unknown Source)
at ru.CryptoPro.TomCatSSL.JSSESocketFactory.getKeystore(Unknown Source)
at ru.CryptoPro.TomCatSSL.JSSE14SocketFactory.getKeyManagers(Unknown Source)

Что сделано неправильно?
 
Ответы:
21.09.2007 14:54:25Ольга
java.security.KeyStoreException: FloppyStore not found
хранилище не найдено
попробуйте поработать с контрольной панелью (видно ли там хранилище, и читаются ли ключи и сертификаты в нем)...
01.10.2007 20:54:03Андрей
Проверил. Из контрольной панели (ControlPane.bat) ключ и сертификат видны и читаются.
02.10.2007 9:55:43Ольга
скажите пожайлуста
-какие у вас версии java и т.д.
-пробовали ли сделать то же самое, но с HDImageStore
-установлен ли пароль на хранилище
-пробовали ли работать через JSEE (без переходника TomCatSSL)
-как настроен TomCat (системно)
[см. Руководство программиста КриптоПро JTLS]
07.10.2007 1:55:31Андрей
Проблема с поиском контейнера решена, она возникала из-за неверно настроенной jre.

Но теперь возникает новая ошибка. В принципе, она уже поднималась в форуме (05.07.2007 14:56:09 “JTLS и Tomcat” Даниил Швед, Астра-СТ ).
Т.е. при попытке установить соединение по порту 8443 в tomcat, IE выдает стандартную страницу "Невозможно отобразить страницу".
Сервер и клиент находятся на одном компьютере (XP Home Edition SP2).
08.10.2007 9:35:08Ольга
при clientAuth="false" все должно работать (проверяйте настройки, для верности скачайте последние весрсии JCP и JTLS),а вот при clientAuth="true" есть описанная вами проблема... пытаемся решить
08.10.2007 18:29:52Андрей
По правде говоря, проблемы с обоими параметрами clientAuth :(.

Возник еще один вопрос. Как проверить средствами JCP подпись, созданную через CAPICOM.
Метод Sign возвращает строку типа
MIICMwYJKoZIhvcNAQcCoIICJDCCAiACAQExDDAKBgYqhQMCAgkFADARBgkqhkiG
9w0BBwGgBAQCMQCgggFYMIIBVDCCAQECBEcJ8H4wCgYGKoUDAgIDBQAwMzELMAkG
A1UEBhMCUlUxEjAQBgNVBAoTCUNyeXB0b1BybzEQMA4GA1UEAxMHdG9tY2F0NDAe
Fw0wNzEwMDgwODU1MjZaFw0wODAxMDYwODU1MjZaMDMxCzAJBgNVBAYTAlJVMRIw
EAYDVQQKEwlDcnlwdG9Qcm8xEDAOBgNVBAMTB3RvbWNhdDQwYzAcBgYqhQMCAhMw
EgYHKoUDAgIjAQYHKoUDAgIeAQNDAARAAW35vikunRvjCxcJqc8wiVDOsGYSiP4r
LGmOQL2rW48dwRTGaGIxE4qcfbEXLLfL0BK4XOW0bFLeils/2WS5XjAKBgYqhQMC
AgMFAANBAC/+vy2IIiqKSTt1auWkzdIboGiW1daaogs+aycYHrm+lw9lBVF57qIE
7+SEG/XWgPtgI+yJIreGpKibGxm48vwxgZ0wgZoCAQEwOzAzMQswCQYDVQQGEwJS
VTESMBAGA1UEChMJQ3J5cHRvUHJvMRAwDgYDVQQDEwd0b21jYXQ0AgRHCfB+MAoG
BiqFAwICCQUAMAoGBiqFAwICEwUABED9/ijC4b3QpIZzZT064hGUhYNdaAB+/ZFL
VB+vILznXSkfNIAqgG7VS/w55oQS5ZvRdkQgC/nc+OrM7EksZAvz

Эта строка отправляется на сервер, где планируется проверить ее следующим образом:
CertificateFactory cfg = CertificateFactory.getInstance("X509");
Certificate cert0 = cfg.generateCertificate(new FileInputStream(new File("*.cer")));
PublicKey pub = cert.getPublicKey();
byte[] signature = getSign().getBytes();
sig.initVerify(pub);
boolean verifies = sig.verify(signature);

Судя по тому, что sig.sign() возвращает подпись в виде массива из 64 байт, то приведенный код работать не будет.

Как изменить код, чтобы подпись, созданная средствами CAPICOM, была понятна в JCP?
09.10.2007 10:01:55Ольга
про TomCat все же остаются вопросы:
-какие у вас версии java и т.д.
-пробовали ли работать через JSEE (без переходника TomCatSSL)
-как настроен TomCat (системно)
09.10.2007 10:13:07Ольга
CAPICOM создает cms сообщение
все что пока могу предложить это примеры : samples_src.jar/CMS_samples (подпись и проверка подписи)
более удобные инструменты в разработке...
09.10.2007 15:48:09Андрей
Спасибо.
Я посмотрел пример по CMS. Файл с подписью, который создается в примере, отличается от той подписи, которая формируется через CAPICOM (MIICMwYJKoZIhvcNAQcCoIICJDCCAiACAQExDDAKB...).
При попытке вызвать метод CMSVerify с подписью, сформирмированной через CAPICOM, возникает исключение:
com.objsys.asn1j.runtime.Asn1TagMatchFailedException: ASN.1 decode error @ offset 0:
Tag match failed: expected [UNIVERSAL 16], parsed [APPLICATION 13]
at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:49)
at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:65)
at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.decode(ContentInfo.java:55)
at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:15)
at CMS.CMSVerify(CMS.java:210)
at CMS.main(CMS.java:98)

Можно ли изменить метод CMSVerify в CMS.java, что он принимал CAPICOM подпись.
09.10.2007 16:46:19Ольга
В примерах не учтена кодировка.
Подпись Capicom в Base64, а в примере нужно подавать байтовый массив.
Раскодируйте подпись, а потом запустите проверку.
09.10.2007 19:34:56Андрей
Спасибо за консультации по CAPICOM. Заработало.

Возвращаясь к проблеме Tomcat'а.
Версии: java-1.5.0 tomcat-5.5 jcp-1.0.29

Настройки в tomcat/conf/server.xml
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false"
SSLImplementation="ru.CryptoPro.TomCatSSL.JSSEImplementation"
sslProtocol="GostTLS"
algorithm="GostX509"
keystoreProvider="JCP"
keystoreType="FloppyStore"
keystoreFile="A:\tomcat4.keystore"
keystorePass="tomcat4"
keyalg="GOST3410"
sigalg="GOST3411withGOST3410EL"
keyAlias="tomcat4"
/>
При запуске ошибок в логе нет, обращения к ключу проходят.

Если удалить строку SSLImplementation="ru.CryptoPro.TomCatSSL.JSSEImplementation"
, то при старте возникают ошибки
java.io.IOException: Export restriction: SSLServerSocketFactory supports non-pluggable ciphersuite(s)
at org.apache.tomcat.util.net.jsse.JSSE14SocketFactory.init(JSSE14SocketFactory.java:125)

10.10.2007 10:31:28Ольга
уточните версию java 1.5.0_?
(см. Особенности подключения КриптоПро JTLS//tls.html)
10.10.2007 11:28:24Андрей
Помог следующий алгоритм шаманства.
1) Генерится ключ (самоподписанный для сервера) с помощью ControlPane.bat

2) Генерится ключ с тем же alias'ом с помощью утилиты keytool.
keytool -genkey -alias my_alias -keysize 512 -provider ru.CryptoPro.JCP.JCP -keypass my_alias_pass -storetype FloppyStore -dname CN=my_alias,O=CryptoPro,C=RU -keystore a:\my_alias.keystore -storepass my_alias_pass -keyalg GOST3410 -sigalg GOST3411withGOST3410EL

3) Переносится на дискетку каталог *.000 от ключа 1 и файл my_alias.keystore от ключа 2.

Ключ 3 работает, ключи 1 и 2 - нет. Для 1-го непонятно что прописывать в поле keystoreFile="A:\*.keystore" tomcat'овского коннектора из-за отсутствия этого файла после генерации. 2-й не работает, видимо, из-за того, что был создан не для сервера.
Если есть более простой путь, то буду признателен, если вы его напишите.

И второй вопрос. Для clientAuth=true действительно проблемы остались. В сколь обозримом будущем планируется решить эту проблему?
10.10.2007 11:30:07Андрей
Помог следующий алгоритм шаманства.
1) Генерится ключ (самоподписанный для сервера) с помощью ControlPane.bat

2) Генерится ключ с тем же alias'ом с помощью утилиты keytool.
keytool -genkey -alias my_alias -keysize 512 -provider ru.CryptoPro.JCP.JCP -keypass my_alias_pass -storetype FloppyStore -dname CN=my_alias,O=CryptoPro,C=RU -keystore a:\my_alias.keystore -storepass my_alias_pass -keyalg GOST3410 -sigalg GOST3411withGOST3410EL

3) Переносится на дискетку каталог *.000 от ключа 1 и файл my_alias.keystore от ключа 2.

Ключ 3 работает, ключи 1 и 2 - нет. Для 1-го непонятно что прописывать в поле keystoreFile="A:\*.keystore" tomcat'овского коннектора из-за отсутствия этого файла после генерации. 2-й не работает, видимо, из-за того, что был создан не для сервера.
Если есть более простой путь, то буду признателен, если вы его напишите.

И второй вопрос. Для clientAuth=true действительно проблемы остались. В сколь обозримом будущем планируется решить эту проблему?
10.10.2007 15:10:26Ольга
"Для 1-го непонятно что прописывать в поле keystoreFile="A:\*.keystore" tomcat'овского коннектора из-за отсутствия этого файла после генерации."
создаете пустой файл *.keystore, заходите в контрольную панель, нажимаете "найти" (путь к trustStore) задаете созданный файл, затем устанавливаете пароль на хранилище (у вас FloppyStore), теперь пути к trustStore и KeyStore одинаковы и пароли тоже нужно поставить везде одинаковые:

keystoreType="HDImageStore"
keystoreFile="D:/a.store"
keystorePass="pass"

truststoreFile="D:/a.store"
truststorePass="pass"

пароль на ключ тоже "pass"

"Для clientAuth=true действительно проблемы остались?"
-какая у вас версия csp?
-вы не пробовали установить сертификаты и запустить TomCat с аутентификацией клиента
23.10.2007 11:09:21Ольга
Выложены новые версии JCP и JTLS.
проблемы с двусторонней аутентификацией устранены.