2016-10-18 2 views
-1

Я хочу подключиться к серверу с использованием протокола https. У меня есть самозаверяющий сертификат этого веб-сайта (файл .crt). Теперь я хочу подключиться к этому веб-сайту с помощью этого сертификата. В настоящее время я использую клиента org.apache.http.impl.nio.client, но я готов использовать другого клиента, если он окажется полезным.Клиент Scala https с сертификатом SSL

Как подключиться к серверу через https, учитывая, что у меня есть сертификат ssl этого сервера?

+0

Чтобы избежать такого звучания, как вопрос «дайте мне код» или «пожалуйста, прочитайте документ для меня», что вы пробовали и где вы застряли? –

+0

@ TheArchetypalPaul Я прочитал документ о keystore, httpclient и nio о ssl. Я просто не нахожу всеобъемлющего и простого способа обработки ssl (это не может быть так сложно!). Я думаю, что это должно быть так же просто, как загрузить сертификат из файла и отправить запрос с вашим сертификатом в качестве аргумента для этого запроса. – Moebius

+0

Вы смущены тем, как работают сертификаты сервера. Сервер отправляет вам свой сертификат, а вы (клиент) проверяете, что он действителен. Если вы пытаетесь использовать сертификаты на стороне клиента, сервер должен настроить ваш сертификат, чтобы он мог проверить тот, который вы отправляете, он действителен и поэтому аутентифицирует ваш клиент. –

ответ

0

Для того, чтобы позволить только конкретный сертификат в вашем приложении, вы должны следовать следующей процедуре:

1- Скачать сертификат

Чтобы сделать это, я открыл Firefox, вставьте адрес веб-сайта из которого я хочу получить сертификат. Добавьте исключение, чтобы загрузить этот сертификат. Затем вы можете получить к нему доступ, щелкнув зеленую блокировку справа от адресной строки. Экранный снимок поможет вам найти, как его загрузить.

enter image description here

Обратите внимание, что вы должны загрузить сертификат цепи, а не единый сертификат веб-сайта. Здесь это делается в проводнике файлов 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

изменения Ничего здесь.

Смежные вопросы