【问题标题】:How to use SSL in Square MockWebServer?如何在 Square MockWebServer 中使用 SSL?
【发布时间】:2016-03-06 09:13:32
【问题描述】:

我尝试在 Square's MockWebServer 上启用 SSL 以模拟我的 Android 应用程序中的所有 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

看来我需要为 MockWebServer 设置一个证书。但我不知道怎么...

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

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

或者:

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

谁能帮忙?

【问题讨论】:

    标签: android ssl https square mockwebserver


    【解决方案1】:

    这就是我的做法:

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

    它对我有用。

    【讨论】:

    • 我总是收到这个错误:javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
    • 对于未来的读者:SslContextBuilder 是一个类,它在使用 BouncyCastle 执行测试期间动态生成内存证书。该类过去曾出现在 okhttp 源代码中,但似乎不再存在。稍加努力就可以找到它的旧版本,例如this one
    • 我得到:java.lang.RuntimeException:java.security.NoSuchAlgorithmException:BC 提供程序不再提供 KeyPairGenerator.RSA 的实现。
    【解决方案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);
    

    【讨论】:

    猜你喜欢
    • 2021-05-22
    • 2017-05-12
    • 2017-06-01
    • 2021-06-15
    • 2018-07-10
    • 1970-01-01
    • 2016-12-08
    • 2016-11-25
    • 2022-01-19
    相关资源
    最近更新 更多