При использовании клиентского сертификата в ЗащищенноеСоединениеOpenSSL крашится мобильное приложение

1. nickstep 04.05.21 17:19 Сейчас в теме
Мобильное приложение выполняет запросы к материнской базе с помощью WS-ссылки.
Хотел прикрутить работу между мобильным приложением и материнской базой по SSL.
Соответственно WSПрокси подымается с использованием ЗащищенноеСоединениеOpenSSL.
Далее выполняются множественные запросы к материнской базе.
Столкнулся со следующей гадостью:
если применять Новый ЗащищенноеСоединениеOpenSSL(), то множественные запросы работают как, часы, но стоит воткнуть
Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл(...),), то одиночные запросы проходят нормально, но если сделать десятка полтора запросов подряд, то мобильное приложение просто вылетает без объявления войны.
Разные платформы пробовал, от 8.3.13.64 до 8.3.18.68 - результат одинаковый.
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
7. nickstep 06.05.21 18:13 Сейчас в теме
(1) дорылся до следующего момента:

Во-первых, это не проблема сервера, его сертификата и WS-Ссылок. Это проблема переинициализации СертификатаКлиента.
Во-вторых, купленный или самоподписанный сертификат клиента значения не имеет, важно, чтобы сервер его принимал.

Для простоты далее рассмотрим HTTPСоединение.

Если делать код следующим образом:

СертификатКлиента = Новый СертификатКлиентаФайл(ИмяСертификатаКлиента, ПарольСертификатаКлиента);

Для Ном = 1 По 10 Цикл
SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Новый СертификатыУдостоверяющихЦентровОС);

HTTPСоединение = Новый HTTPСоединение(ПутьДоСервера,,,,,20, SSL);

Ответ = HTTPСоединение.Получить(Новый HTTPЗапрос(ТекстЗапроса));
КонецЦикла;

то все чудно работает.

Если же сделать:

Для Ном = 1 По 10 Цикл
СертификатКлиента = Новый СертификатКлиентаФайл(ИмяСертификатаКлиента, ПарольСертификатаКлиента);
SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Новый СертификатыУдостоверяющихЦентровОС);

HTTPСоединение = Новый HTTPСоединение(ПутьДоСервера,,,,,20, SSL);

Ответ = HTTPСоединение.Получить(Новый HTTPЗапрос(ТекстЗапроса));
КонецЦикла;

то крашимся на 9-м вызове.

При этом, если тупо сделать

Для Ном = 1 По 1000 Цикл
СертификатКлиента = Новый СертификатКлиентаФайл(ИмяСертификатаКлиента, ПарольСертификатаКлиента);
КонецЦикла

то такой код работает, т.е. надо не просто много раз инициализировать СертификатКлиента, а еще и выполнить с ним вызов к серверу.

Понятно, что если SSL или СертификатКлиента засунуть с процедуру с повторяемым использованием, то все работает до тех пор, пока SSL или СертификатКлиента не выкинет из кэша несколько раз, т.е. если

Для Ном = 1 По 100 Цикл
СертификатКлиента = МодульПовтИсп.ПолучитьСертификат(ИмяСертификатаКлиента, ПарольСертификатаКлиента);
SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Новый СертификатыУдостоверяющихЦентровОС);

HTTPСоединение = Новый HTTPСоединение(ПутьДоСервера,,,,,20, SSL);

Ответ = HTTPСоединение.Получить(Новый HTTPЗапрос(ТекстЗапроса));
КонецЦикла;

то цикл отработает, а если:

Для Ном = 1 По 100 Цикл
СертификатКлиента = МодульПовтИсп.ПолучитьСертификат(ИмяСертификатаКлиента, ПарольСертификатаКлиента);
SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Новый СертификатыУдостоверяющихЦентровОС);

HTTPСоединение = Новый HTTPСоединение(ПутьДоСервера,,,,,20, SSL);

Ответ = HTTPСоединение.Получить(Новый HTTPЗапрос(ТекстЗапроса));

ПодождатьСекунд(7*60);
КонецЦикла;

то завалится.
2. maksa2005 528 05.05.21 07:12 Сейчас в теме
а не думали сделать все через http + SSL? я сделал приложение и сколько не отправляй запрос = ни разу не вылетало
5. nickstep 05.05.21 08:09 Сейчас в теме
(2) не хотелось "ниже опускаться", когда сервис есть. Плюс на стороне IIS надо будет "прокладку" на php делать, подъемно, но зачем, когда по идее штатные средства должны работать.
6. MarchTomCat 06.05.21 14:57 Сейчас в теме
(5)
Плюс на стороне IIS надо будет "прокладку" на php делать

Не нужна прокладка. Прекрасно все со штатными средствами работает. Только сертификат желательно прикрутить официальный, с самоподписными могут быть проблемы.
3. maksa2005 528 05.05.21 07:22 Сейчас в теме
и вообще можно написать свой сертификат. выложить его в аппач и прикрутить его в телефон.
4. nickstep 05.05.21 08:06 Сейчас в теме
(3) так связка 1с - IIS мобильное приложение и работает. И сертификат самоподписанный отдан приложению. А засунуть его в хранилище устройства не получится, ибо это POS-терминал на Андроиде, да и идея использования SSL в том, чтобы IIS пропускал только устройства с конкретными сертификатами, а не вообще любыми валидными.
8. nickstep 07.05.21 12:07 Сейчас в теме
чтобы окончательно закрыть вопросы про "не тот сертификат" сделал следующий тест:

берем любой сертификат с закрытым ключом (как нравится, хотите покупной, хотите самоподписанный)
закидываем его на устройство в /sdcard/Download/cert.pfx

вот такой код работает:

СертификатКлиента = Новый СертификатКлиентаФайл("/sdcard/Download/cert.pfx");

Для Ном = 1 По 10 Цикл

SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Новый СертификатыУдостоверяющихЦентровОС);

HTTPСоединение = Новый HTTPСоединение("ya.ru",,,,,20, SSL);

Ответ = HTTPСоединение.Получить(Новый HTTPЗапрос("/"));

КонецЦикла;


а такой нет:


Для Ном = 1 По 10 Цикл

СертификатКлиента = Новый СертификатКлиентаФайл("/sdcard/Download/cert.pfx");

SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Новый СертификатыУдостоверяющихЦентровОС);

HTTPСоединение = Новый HTTPСоединение("ya.ru",,,,,20, SSL);

Ответ = HTTPСоединение.Получить(Новый HTTPЗапрос("/"));

КонецЦикла;


очевидно, что ya.ru про наш сертификат ничего не знает, но ему и все равно, т.к. первый вариант отрабатывает.

также без проблем отработает вариант без клиентского сертификата:


Для Ном = 1 По 10 Цикл

SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровОС);

HTTPСоединение = Новый HTTPСоединение("ya.ru",,,,,20, SSL);

Ответ = HTTPСоединение.Получить(Новый HTTPЗапрос("/"));

КонецЦикла;


видимо имеет место косяк платформы, причем давний, ибо пробовал и для 8.3.13.64 и для 8.3.18.68.
9. nickstep 07.05.21 15:40 Сейчас в теме
после расследования через анализ LogCat через AndroidStudio пришел подтверждению вывода, что имеет место косяк платформы:

05-07 15:35:51.170 29169-29202/? I/System.out: SSL init
05-07 15:35:51.170 29169-29202/? I/System.out: get javax.net.ssl.keyStoreProvider
05-07 15:35:51.170 29169-29202/? I/System.out: get javax.net.ssl.certAlias
05-07 15:35:54.420 29169-29183/? I/art: Background partial concurrent mark sweep GC freed 29271(1624KB) AllocSpace objects, 10(10MB) LOS objects, 27% free, 41MB/57MB, paused 10.384ms total 91.868ms
05-07 15:35:56.287 29169-29183/? I/art: Background partial concurrent mark sweep GC freed 27585(1530KB) AllocSpace objects, 9(10MB) LOS objects, 25% free, 46MB/62MB, paused 5.004ms total 101.816ms
05-07 15:35:57.679 29169-29183/? I/art: Background sticky concurrent mark sweep GC freed 86782(4MB) AllocSpace objects, 0(0B) LOS objects, 6% free, 58MB/62MB, paused 7.179ms total 89.018ms
05-07 15:35:58.104 29169-29183/? I/art: Background partial concurrent mark sweep GC freed 18620(1032KB) AllocSpace objects, 10(11MB) LOS objects, 24% free, 49MB/65MB, paused 4.938ms total 123.891ms
05-07 15:35:59.486 29169-29183/? I/art: Background sticky concurrent mark sweep GC freed 83686(4MB) AllocSpace objects, 0(0B) LOS objects, 6% free, 61MB/65MB, paused 6.021ms total 89.863ms
05-07 15:35:59.769 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] JNI ERROR (app bug): global reference table overflow (max=51200)
05-07 15:35:59.769 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] global reference table dump:
05-07 15:35:59.769 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] Last 10 entries (of 51200):
05-07 15:35:59.769 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 51199: 0x1371b620 com.android.org.bouncycastle.jcajce.provider.digest.SHA1$Digest

05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] Summary:
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.view.accessibility.AccessibilityManager$1
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of dalvik.system.DexClassLoader
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of com.e1c.mobile.InternetConnectionInformationImpl
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.widget.Toast$TN
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.view.Choreographer$FrameDisplayEventReceiver
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of dalvik.system.VMRuntime
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 24 of java.lang.ref.WeakReference (24 unique instances)
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of float[] (3 elements)
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of float[] (1000 elements)
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.app.ActivityThread$ApplicationThread
05-07 15:35:59.770 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 50718 of com.android.org.bouncycastle.jcajce.provider.digest.SHA1$Digest (50718 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 3 of android.content.ContentProvider$Transport (3 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.app.LoadedApk$ServiceDispatcher$InnerConnection
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of android.database.ContentObserver$Transport (2 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 28 of com.e1c.mobile.UIView (28 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of java.lang.String (2 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 16 of android.graphics.Typeface (2 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.view.inputmethod.InputMethodManager$1
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 4 of android.os.Binder (4 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of byte[] (100 elements) (2 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of byte[] (9216 elements)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of byte[] (14400 elements)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of byte[] (36864 elements) (2 unique instances)
05-07 15:35:59.771 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of byte[] (82944 elements)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of byte[] (104976 elements) (2 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 5 of byte[] (147456 elements) (5 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 4 of byte[] (250560 elements) (4 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of byte[] (543744 elements)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 35 of byte[] (589824 elements) (35 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of byte[] (1175056 elements) (2 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.graphics.Rect
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of c.c.b.c.m.a.x0
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of android.opengl.EGLSurface (2 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.graphics.Paint$FontMetricsInt
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of dalvik.system.PathClassLoader
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 4 of com.e1c.mobile.UIText (4 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 51 of android.graphics.Bitmap (51 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.content.ClipboardManager$1
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of com.e1c.mobile.GraphicsImpl
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of android.view.ViewRootImpl$W (2 unique instances)
05-07 15:35:59.772 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.view.WindowManagerGlobal$1
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of char[] (3 elements)
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of char[] (1000 elements) (2 unique instances)
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 257 of java.lang.Class (200 unique instances)
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of com.e1c.mobile.UIActivityIndicator
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of android.opengl.EGLDisplay (2 unique instances)
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 1 of com.e1c.MobileHelperUIPackage.MobileHelperUIClass
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of java.lang.ThreadGroup (2 unique instances)
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98] 2 of android.opengl.EGLContext (2 unique instances)
05-07 15:35:59.773 29169-29202/? A/art: art/runtime/indirect_reference_table.cc:98]


в 1с данные переданы, но когда они сподобятся исправить платформу...

посему на текущий момент использовать в мобильной платформе авторизацию по клиентскому сертификату нельзя.
Будете получать краш приложения, причем в неизвестные моменты, т.к. все будет зависеть от частоты вызовов.
10. drasp 16.08.21 20:18 Сейчас в теме
Вроде исправили :
https://bugboard.v8.1c.ru/version/plt8mob/000026980
Исправленые ошибки в версии 8.3.19.51
Клиентский сертификат

Код ошибки: 10231179
Код(ы) обращения: HL-332991
Зарегистрирована: 06.05.2021
Исправлена: "Мобильная платформа", версия 8.3.19.51
Мобильная платформа под управлением ОС Андроид аварийно завершает работу после нескольких защищенных соединений с использованием клиентского сертификата.
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Программист 1С:ERP
Москва
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день