Для того, чтобы позволить только конкретный сертификат в вашем приложении, вы должны следовать следующей процедуре:
1- Скачать сертификат
Чтобы сделать это, я открыл Firefox, вставьте адрес веб-сайта из которого я хочу получить сертификат. Добавьте исключение, чтобы загрузить этот сертификат. Затем вы можете получить к нему доступ, щелкнув зеленую блокировку справа от адресной строки. Экранный снимок поможет вам найти, как его загрузить.
![enter image description here](https://i.stack.imgur.com/UwNbW.png)
Обратите внимание, что вы должны загрузить сертификат цепи, а не единый сертификат веб-сайта. Здесь это делается в проводнике файлов ubuntu при выборе типа файла, который вы хотите экспортировать.
2- Создать хранилище ключей Java
Выполнить эту команду с файлом вы только что загрузил:
keytool -import -file file_you_just_downloaded.crt -alias description_of_certificate -keystore
Теперь у вас есть хранилище ключей Java со всем необходимым сертификатом для подключения к вебу-сайту с помощью HTTPS.
3- Создание клиента с тем сертификатом
Того примера сделаны с апача NiO веба-клиентом.
import java.io.FileInputStream
import java.security.cert.X509Certificate
import java.security.{KeyStore, SecureRandom}
import javax.net.ssl._
import org.apache.http.conn.ssl.NoopHostnameVerifier
import org.apache.http.impl.nio.client.{CloseableHttpAsyncClient, HttpAsyncClients}
import org.apache.commons.io.IOUtils
import org.apache.http.ssl.SSLContexts
def httpClientFactory(
keyStoreFileName: String
): CloseableHttpAsyncClient = {
val httpClientBuilder = HttpAsyncClients.custom()
// activating or not the certificate checking
if (checkCertificate) {
// import keystore
val keyStorePassword = jksPassword // the password you used whit the command keytool
val ks = KeyStore.getInstance(KeyStore.getDefaultType)
val keyStorePath = getClass.getClassLoader.getResource(keyStoreFileName)
val inputStream = new FileInputStream(keyStorePath.getPath)
ks.load(inputStream, keyStorePassword.toArray)
IOUtils.closeQuietly(inputStream)
// create trust manager from keystore
val tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm)
tmf.init(ks)
val trustManager = tmf.getTrustManagers
// associate trust manager with the httpClient
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(Array(), trustManager, null)
httpClientBuilder.setSSLContext(sslContext)
} else {
logger.warn("Warning ! Https connections will be done without checking certificate. Do not use in production.")
val sslContext = SSLContexts.createDefault()
sslContext.init(null, Array(new X509TrustManager {
override def getAcceptedIssuers: Array[X509Certificate] = Array.empty[X509Certificate]
override def checkClientTrusted(x509Certificates: Array[X509Certificate], s: String): Unit = {}
override def checkServerTrusted(x509Certificates: Array[X509Certificate], s: String): Unit = {}
}), new SecureRandom())
httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setSSLContext(sslContext)
}
// ending httpClient creation
httpClientBuilder.build()
}
4- Использование командной HTTPClient
изменения Ничего здесь.
Чтобы избежать такого звучания, как вопрос «дайте мне код» или «пожалуйста, прочитайте документ для меня», что вы пробовали и где вы застряли? –
@ TheArchetypalPaul Я прочитал документ о keystore, httpclient и nio о ssl. Я просто не нахожу всеобъемлющего и простого способа обработки ssl (это не может быть так сложно!). Я думаю, что это должно быть так же просто, как загрузить сертификат из файла и отправить запрос с вашим сертификатом в качестве аргумента для этого запроса. – Moebius
Вы смущены тем, как работают сертификаты сервера. Сервер отправляет вам свой сертификат, а вы (клиент) проверяете, что он действителен. Если вы пытаетесь использовать сертификаты на стороне клиента, сервер должен настроить ваш сертификат, чтобы он мог проверить тот, который вы отправляете, он действителен и поэтому аутентифицирует ваш клиент. –