如何在Square MockWebServer中使用SSL?

Ste*_*nTo 7 ssl https android square mockwebserver

我尝试在Square的MockWebServer上启用SSL,以模拟我的Android App中的所有Web服务调用.我想启用SSL以获得与真实条件相同的错误.我不想为测试禁用SSL或实现SSL忽略的HTTPClient.

在每个请求我得到这个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
Run Code Online (Sandbox Code Playgroud)

我似乎需要为MockWebServer设置证书.但我不知道怎么......

这是我尝试启用SSL的方式:

SSLContext sslContext = new SslContextBuilder(InetAddress.getLocalHost().getHostName()).build();
server.useHttps(sslContext.getSocketFactory(), true);
Run Code Online (Sandbox Code Playgroud)

要么:

SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, null, null);
server.useHttps(sslContext.getSocketFactory(), false);
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

leo*_*vky 5

您需要创建自己的密钥库:

keytool -genkey -v -keystore mystore.keystore.jks -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)

或查看: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);
Run Code Online (Sandbox Code Playgroud)


小智 -2

我就是这样做的:

 MockWebServer serverForHttps = new MockWebServer();
 serverForHttps .useHttps(SslContextBuilder.localhost().getSocketFactory(), false);
 serverForHttps .start()
Run Code Online (Sandbox Code Playgroud)

这个对我有用 。

  • 对于未来的读者:“SslContextBuilder”是一个类,它在使用 BouncyCastle 执行测试期间动态生成内存中的证书。该类过去曾出现在 okhttp 源代码中,但似乎不再存在。稍加努力,您就可以找到它的旧版本,例如[this one](https://android.googlesource.com/platform/external/okhttp/+/5f7fde35d881e7e9f8850daeac4de52265635656/src/test/java/com/squareup/okhttp /内部/SslContextBuilder.java)。 (7认同)