Блютуз брелок «антипотеряйка» для iOS, Android
+ 7 999 800 00 00
пн. — пт.: с 9 до 18, сб.: с 10 до 15
Дубликаторы домофонных ключей
Заготовки ключей. Карты, брелоки
- Заготовки ТМ
- 125 кГц брелоки
- 125 кГц эпокси
- 125 кГц браслеты
- 125 кГц карты
- 13,56 МГц Mifare Classic
- 13,56 МГц Mifare Ultralight
- 13,56 МГц TKRF/FK/iCode
- 860-960 МГц UHF
- 2-х, 3-х контактные и магнитные
- Контактные ключи
- Брелоки, карты RFID
- NFC метки
- UHF RFID
Пульты для шлагбаумов, ворот
Универсальные ключи, считывающие устройства
Домофонное оборудование
- Домофоны
- Трубки
- Кнопки
- Считыватели, контакторы
- Контроллеры
- Коммутаторы
- Адаптеры, конвертеры, комплектующие
Аксессуары, комплектующие
- Держатели, бирки
- Кольца, карабины
- Ретракторы, ключницы, цепочки
- Сувенирные брелоки
- Комплектующие
Ключи дверные и авто
- Английские
- Китай
- JMA/ERREBI/SILCA (Италия/Испания)
- Автомобильные
- Аблой
- Вертикальные
- JMA/ERREBI/SILCA (Италия/Испания)
- Китай
- Турция и другие
- Дверные (Россия)
- Дверные импортные
- Дверные (Китай)
- Железнодорожные
- Крестовые
- Мебельные
- Оптические
- Оригиналы ключей
- Почтовые
- Помповые
- Ригельные
- Трубчатые
- Станки для ключей, ремонта обуви
- Программаторы
- Вертикальные
- Универсальные
- Прочие
- Копиры
- Тиски
- Фрезы
- Щетки
- Приспособления и адаптеры для изготовления ключей
- Прочие комплектующие
Ремонт обуви
- Инструменты для ремонта обуви
- Материалы для обуви
- Клей, химия
Ремонт часов
Фурнитура
- Пуговицы и люверсы
- Молнии, бегунки
Инструменты
Батарейки
Торговое оборудование
- Рекламные таблички
- Стенды и комплектующие
Распродажа
Изготовление ключей
Бесплатный STL файл Брелок для Android・3D-печатный объект для загрузки・Cults
Брелоки для печати щитов и РСБ
Бесплатно
Брелок с символом империи
Бесплатно
Лучшие файлы для 3D-принтеров в категории Украшения
Charm Ring
Бесплатно
Flower Petals Pendant
4,49 €
wedding ring — 001
1,16 €
Parametric hexagon
2,76 €
ANEL RING
Бесплатно
Pendulum
2,50 €
Batman Rings (sizes US 6 — 12)
1,22 €
Бестселлеры категории Украшения
ЗАМОК В СТИЛЕ ДИСНЕЙ — КОРОБОЧКА ДЛЯ КОЛЕЦ
2,50 €
серьги с паутиной в виде сердца
0,50 €
LEGO HEART
0,60 €
Корона Визериса Таргариена — аксессуар, соответствующий сериалу
9,19 €
Медаль
2 €
властелин колец
1 €
ШТАМП ДЛЯ ПЕЧАТИ ИЗ ПОЛИМЕРНОЙ ГЛИНЫ В 3D- силуэты растений и листьев 🌿🌾-LORREN3D
1,74 €
Заводчик часов / GyroWinder Premium
4 €
N64 Keychian (брелок для ключей N64)
0,93 €
Days Gone Ring (in 21 different ring sizes)
2,50 €
Брелок Snes (брелок snes)
0,93 €
Брелок-подвеска «Кубок ФИФА
1,42 €
Кошка с сережками
1,05 €
POLYMER CLAY CUTTERS Book/EULITEC.
COM/CC/COPYRIGHTED LICENSE1,89 €
Чемпионат мира по футболу FIFA Катар 2022 Официальная медаль
2,99 €
Вы хотите поддержать Cults?
Вам нравятся Cults и вы хотите помочь нам продолжить наш путь самостоятельно? Обратите внимание, что мы — маленькая команда из 3 человек, поэтому поддержать нас в поддержании деятельности и создании будущих разработок очень просто. Вот 4 решения, доступные для всех:
РЕКЛАМА: Отключайте блокировщик баннеров AdBlock и кликайте на наши рекламные баннеры.
АФФИЛИАЦИЯ: Совершайте покупки онлайн, переходя по нашим партнерским ссылкам здесь Amazon.
ДОНАТЫ: Если хотите, то можно сделать пожертвование через PayPal здесь.
*ПРИГЛАШЕНИЕ ДРУЗЕЙ: * Приглашайте своих друзей, откройте для себя платформу и великолепные 3D-файлы, которыми делится сообщество!
kotlin — Как я могу использовать сертификат пользователя из цепочки ключей Android в клиенте HTTPS?
В итоге я нашел путь.
Во-первых, мы должны предоставить реализацию X509KeyManager
:
X509Impl.kt:
package com.example.myapp импортировать android.content.Context импорт kotlin.Throws импортировать life.evam.configurationtest.X509Impl импортировать android.security.KeyChain импортировать android.security.KeyChainException импортировать java.lang.RuntimeException импортировать java.lang.UnsupportedOperationException импортировать java.net.Socket импортировать java.security.KeyManagementException импортировать java.security.NoSuchAlgorithmException импортировать java.security.Principal импортировать java.security.PrivateKey импортировать java.security.cert.CertificateException импортировать java.security.cert.X509Сертификат импортировать javax.net.ssl.HttpsURLConnection импортировать javax.net.ssl.KeyManager импортировать javax.net.ssl.SSLContext импортировать javax.net.ssl.X509KeyManager класс X509Impl( частный псевдоним val: String, частный val certChain: Array, частный val privateKey: PrivateKey ) : X509KeyManager { переопределить забаву ChooseClientAlias( arg0: массив<строка>, arg1: Массив<Основной>, аргумент2: сокет ): Нить { вернуть псевдоним } переопределить удовольствие getCertificateChain (псевдоним: String): Array { return if (this. alias == alias) certChain else emptyArray() } переопределить удовольствие getPrivateKey (псевдоним: String): PrivateKey? { вернуть, если (this.alias == псевдоним) privateKey иначе null } // Неиспользуемые методы (для клиентских обратных вызовов SSLSocket) переопределить забаву ChooseServerAlias( тип ключа: строка, эмитенты: Array , розетка: розетка ): Нить { бросить UnsupportedOperationException() } переопределить удовольствие getClientAliases (keyType: String, эмитент: Array ): Array { бросить UnsupportedOperationException() } переопределить удовольствие getServerAliases (keyType: String, issuers: Array ): Array { бросить UnsupportedOperationException() } сопутствующий объект { весело setForConnection( против: HttpsURLConnection, контекст: Контекст?, псевдоним: Строка ): SSLContext { вар sslContext: SSLContext? = ноль sslContext = попробовать { SSLContext. getInstance("TLS") } поймать (e: NoSuchAlgorithmException) { throw RuntimeException("Не должно происходить...", e) } sslContext!!.init(arrayOf (fromAlias(контекст, псевдоним)), null, null) con.sslSocketFactory = sslContext.getSocketFactory() вернуть sslContext } удовольствие отПсевдоним (контекст: Контекст?, Псевдоним: Строка): X509Внедрить { val certChain: Array ? val privateKey: PrivateKey? пытаться { certChain = KeyChain.getCertificateChain(контекст!!, псевдоним) privateKey = KeyChain.getPrivateKey(контекст, псевдоним) } поймать (e: KeyChainException) { бросить CertificateException(e) } поймать (e: InterruptedException) { бросить CertificateException(e) } если (certChain == null || privateKey == null) { throw CertificateException("Не удается получить доступ к сертификату из хранилища ключей") } возврат X509Impl(псевдоним, certChain, privateKey) } } }
Затем мы можем использовать его для создания socketFactory
для внедрения в Retrofit:
MainActivity. kt:
val trustManager = HandshakeCertificates.Builder() .addPlatformTrustedCertificates() .строить() .trustManager KeyChain.choosePrivateKeyAlias( это, // активность // Обратный вызов для выбора пользователя { если (это != ноль) { Log.d("choosePrivateKeyAlias", "Пользователь выбрал этот псевдоним: $it") вал x509= X509Impl.setForConnection( URL("https://example.com/").openConnection() как HttpsURLConnection, это, это ) val socketFactory = x509.socketFactory // Получить закрытый ключ и цепочку сертификатов val pk = KeyChain.getPrivateKey(это, это) val chain = KeyChain.getCertificateChain(это, это) val pke = PrivateKeyEntry (pk, цепочка) перехватчик val = HttpLoggingInterceptor() interceptor.setLevel(HttpLoggingInterceptor.Level.BODY) вар clientBuilder = OkHttpClient. Builder() .addInterceptor(перехватчик) клиентбилдер = клиентбилдер .sslSocketFactory(socketFactory, trustManager) val клиент = clientBuilder.build() val contentType = "приложение/json" val дооснащение: Дооснащение = Дооснащение.Builder() .baseUrl("https://example.com/") .клиент(клиент) .addConverterFactory(Json.asConverterFactory(contentType = contentType.toMediaType())) .строить() // Используйте этот модифицированный экземпляр как обычно
Сертификат клиента теперь прикрепляется к запросам, сделанным из этого модифицированного экземпляра. Вы можете проверить это, заменив «example.com» в приведенном выше коде на свой собственный сервер, настроенный на запрос клиентских сертификатов.
Android Keychain — Etsy.de
Etsy больше не поддерживает старые версии вашего веб-браузера, чтобы обеспечить безопасность пользовательских данных.