Авторизация по смарт-карте на сайте через сертификатJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Авторизация по смарт-карте на сайте через сертификат

Сообщение Anonymous »

Мне нужна помощь с аутентификацией на веб-сайте с использованием сертификата, извлеченного из смарт-карты в Kotlin или Java (на Android 10)
На данный момент мне удалось извлечь сертификат из смарт-карту с помощью команд APDU (смарт-карта соответствует стандарту ISO7816). Сертификат, который я извлекаю, имеет атрибут расширенной проверки подлинности клиента (подтверждает вашу личность на удаленном компьютере). Он извлекается без закрытого ключа (насколько я понимаю, это невозможно).
Однако, когда я пытаюсь аутентифицировать веб-сайт с помощью этого сертификата, я получаю 401: Неавторизованный.
В Windows это было довольно просто: вы импортируете сертификат в хранилище ключей и он автоматически импортируется с закрытым ключом, а на Android это кажется невозможным.
Я пытаюсь получить доступ к сайту
https://api.sandbox.suf.poreskaupravars ... /sdc/token
И код, который я использую

Код: Выделить всё

fun OkHttpClientWithCustomTrust(rootCert: X509Certificate, intermediateCert: X509Certificate,cert: X509Certificate): OkHttpClient {
// Create a KeyStore that will hold the trusted certificates
val trustStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
load(null, null)
setCertificateEntry("root", rootCert)
setCertificateEntry("intermediate", intermediateCert)
setCertificateEntry("cert",cert)
}
// Create a TrustManager that trusts certificates in the trustStore
val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply {
init(trustStore) //
} val aliases = trustStore.aliases()
while (aliases.hasMoreElements()) {
val alias = aliases.nextElement()
val certificate = trustStore.getCertificate(alias)
if (certificate is X509Certificate) {
val certType = when {
certificate.subjectDN == certificate.issuerDN -> "Root Certificate"
certificate.issuerDN.toString().contains("CN=") -> "Intermediate Certificate"
else -> "End Entity Certificate"
}
Log.i("KeyStoreCertificate", "Alias: $alias, Type: $certType, Subject: ${certificate.subjectDN}, Issuer: ${certificate.issuerDN}")
}
}
val trustManagers = trustManagerFactory.trustManagers //
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, trustManagers, SecureRandom())
val sslSocketFactory = sslContext.socketFactory // Add an interceptor to force HTTP/1.1 usage
val client = OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, trustManagers[0] as X509TrustManager)
.protocols(listOf(Protocol.HTTP_1_1)) // Force HTTP/1.1
.build()
return client
}
fun CertificateDataAsync(certificate: X509Certificate, rootCert: X509Certificate, intermediateCert: X509Certificate) {
CoroutineScope(Dispatchers.IO).launch {
try {
// Configure OkHttpClient with custom trust
val certList: List = listOf(rootCert, intermediateCert)
val client = OkHttpClientWithCertHeader(certificate)
val request = Request.Builder()
.url("https://api.sandbox.suf.poreskaupravars.org/api/v3/sdc/token")
.get()
.addHeader("Accept", "application/json")
.build()
val response = client.newCall(request).execute()
if (response.isSuccessful) {
// Handle the response in the background thread
val responseBody = response.body?.string()
withContext(Dispatchers.Main) {
// Switch to the main thread to update the UI
Log.i("mTLS", "Response: $responseBody")
}
} else {
withContext(Dispatchers.Main) {
Log.e("mTLS", "Authentication failed: ${response.code}")
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Log.e("mTLS", "Error: ${e.message}")
}
}
}
}
Насколько я могу судить с помощью Wireshark, публичный ключ отправлен, но я все равно получаю 401. Чего мне здесь не хватает?
Как мне доказать владение закрытым ключом?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ertificate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»