Как использовать SSL в Square MockWebServer?

Я пытаюсь включить SSL на MockWebServer Square, чтобы имитировать все вызовы веб-сервисов в моем тестируемом приложении для Android. Я хочу включить SSL, чтобы получать те же ошибки, что и в реальных условиях. Я не хочу отключать SSL для тестов или реализовывать HTTPClient, игнорирующий SSL.

На каждый запрос я получаю это javax.net.ssl.SSLPeerUnverifiedExceptionecxeption:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://localhost:42451/api/blabla": No peer certificate; nested exception is javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

Кажется, мне нужно установить сертификат для MockWebServer. Но я не знаю, как...

Вот как я пытался включить SSL:

SSLContext sslContext = new SslContextBuilder(InetAddress.getLocalHost().getHostName()).build();
server.useHttps(sslContext.getSocketFactory(), true);

Or:

SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, null, null);
server.useHttps(sslContext.getSocketFactory(), false);

Кто-нибудь может помочь?


person StefanTo    schedule 02.12.2015    source источник


Ответы (2)


Вам нужно будет создать собственное хранилище ключей:

keytool -genkey -v -keystore mystore.keystore.jks -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

или см.: https://developer.android.com/studio/publish/app-signing.html

После создания хранилища ключей загрузите его в свой код и используйте следующим образом:

        FileInputStream stream = new FileInputStream("mystore.keystore.jks");
        char[] serverKeyStorePassword = "yourcode".toCharArray();
        KeyStore serverKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        serverKeyStore.load(stream, serverKeyStorePassword);

        String kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(kmfAlgorithm);
        kmf.init(serverKeyStore, serverKeyStorePassword);

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(kmfAlgorithm);
        trustManagerFactory.init(serverKeyStore);

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(kmf.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
        SSLSocketFactory sf = sslContext.getSocketFactory();
        mockWebServer.useHttps(sf, false);
person leon karabchesvky    schedule 15.01.2017
comment
Важная деталь, чтобы это работало: вы также должны указать правильные параметры для команды keytool, см. - person David Ferrand; 18.03.2019
comment
работает отлично, спасибо! - person Tran Tien Duc; 19.01.2021

Вот как я это делаю:

 MockWebServer serverForHttps = new MockWebServer();
 serverForHttps .useHttps(SslContextBuilder.localhost().getSocketFactory(), false);
 serverForHttps .start()

Меня устраивает .

person april    schedule 12.01.2016
comment
Я всегда получаю эту ошибку: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate - person StefanTo; 14.01.2016
comment
Для будущих читателей: SslContextBuilder — это класс, который динамически генерирует сертификат в памяти во время выполнения теста с использованием BouncyCastle. Раньше этот класс присутствовал в исходном коде okhttp, но, похоже, его больше нет. Приложив немного усилий, вы можете найти более старые версии, такие как этот. - person user1643723; 20.07.2017
comment
Я получаю: java.lang.RuntimeException: java.security.NoSuchAlgorithmException: поставщик BC больше не предоставляет реализацию для KeyPairGenerator.RSA. - person bashan; 07.10.2018