首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Websocket安全错误:未验证主机名

Websocket安全错误:未验证主机名
EN

Stack Overflow用户
提问于 2020-10-03 13:38:05
回答 1查看 168关注 0票数 1

我在esp32上实现了一个websocket服务器,在android studio模拟器上运行的应用程序上使用okhttp lib。

我已经用ws/http测试过了,而且工作正常。我已经用wss/https访问网站“wss:// with .websocket.org”进行了测试,并且工作正常。我被告知网站“wss:// from .websocket.org”使用了letsencrypt的证书。

在esp32上访问我的When服务器时,出现android/okhttp错误:找不到证书路径的"java.security.cert.CertPathValidatorException:信任锚“。所以我在网页上搜索"https://developer.android.com/training/articles/security-ssl#java",我在android应用程序中放入了服务器的相同证书。错误已经消失了,但出现了一个新的:“主机名未验证”,见附件中的图片。

我想在局域网中使用https/wss协议,用于esp32 websocket服务器和android / ios应用程序之间的通信。也许在未来,我会在云中运行一个服务器来与应用程序通信,也可以与esp32本地websocket服务器通信(零星通信)。首先,esp32本地websocket服务器将没有域,只有ip (可疑)。

我正在使用openssl命令生成自分配证书: openssl req -newkey rsa:2048 -nodes -keyout prvtkey.pem -x509 -days 3650 -out cacert.pem -subj "/CN=ESP32 HTTPS server example“

我不确定问题出在android/java还是okhttp lib上。

我如何解决这个问题,我已经在考虑生产版本了?

备注:

我可以控制esp32本地安全websocket服务器和客户端应用程序(以及云服务器)。Esp32局域网安全websocket服务器。okhttp版本:实现'com.squareup.okhttp3:okhttp:4.9.0‘。我对ssl/tls知之甚少。

谢谢你的帮助。

代码语言:javascript
复制
// This solved temporarily the problem.
// I would like to generate the private key and certificate using openSsl in the right way.
// and using the hostnameVerifier correctly too.


HostnameVerifier hostnameVerifier = new HostnameVerifier()
{
    @Override
    public boolean verify(String hostname, SSLSession session)
    {
        //return true;
        
        if( hostname.equals("192.168.0.8") )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};


private final OkHttpClient client = new OkHttpClient.Builder()
                                                    .connectTimeout(5, TimeUnit.SECONDS)
                                                  //.writeTimeout(10, TimeUnit.SECONDS)
                                                  //.readTimeout(30, TimeUnit.SECONDS)
                                                    .pingInterval(25,TimeUnit.SECONDS)   
                                                    .pingInterval(25,TimeUnit.SECONDS) 
                                                    .hostnameVerifier(hostnameVerifier)
                                                    .build(); 

App Log Error Image

EN

回答 1

Stack Overflow用户

发布于 2020-10-03 16:22:26

通过在主机名验证器中返回true,可以有效地禁用任何安全性。因此,您也可以使用addInsecureHost方法来允许这些请求。显然,请不要在您的生产应用程序中使用它。

请参阅https://github.com/square/okhttp/blob/482f88300f78c3419b04379fc26c3683c10d6a9d/samples/guide/src/main/java/okhttp3/recipes/kt/DevServer.kt#L40

代码语言:javascript
复制
  val clientCertificates = HandshakeCertificates.Builder()
      .addPlatformTrustedCertificates()
      .addInsecureHost("192.168.0.8")
      .build()

  val client = OkHttpClient.Builder()
      .sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
      .build()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64181090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档