私有云如何配置自签名证书?在 Android 9.0 及之后版本发生 SSL handshake timed out 异常怎么解决?

郑天寿
• 阅读 104

"描述(来源参考:https://www.rongcloud.cn/?utm_source=SEO&utm_term=jishitongxun) 本文档仅适用于私有云,且需要使用自签证书(自签名证书)绕过自签名配置的客户。

Android 9.0 及之后版本,融云 SDK 开始建立网络连接时发生 SSL handshake timed out 异常。

分析(根因分析、需求分析) Android 9.0 开始,默认不允许明文传输,所以在建立网络连接时会使用 https 连接,同时进行安全认证。如果私有云客户未在应用内正确配置 SSL 安全认证,即会发生 SSL handshake timed out 异常。

公有云用户因为 SDK 直接使用融云内置的安全证书,一般不会遇到该问题。

解决方案 推荐使用方案一。

方案一:配置 HTTPS 使用自签证书 如果在应用里没有声明允许明文传输,那么 SDK 默认在 Android 9.0 系统上会使用 https 连接方式,也就意味着会进行安全认证。

如果 IM SDK 版本 ≧ 2.10.6.3,请在 SDK 初始化(init)之前, 调用如下方法:

注意:不要对这个方法进行进程限制, 不能只在主进程执行。因为 SDK 的业务都是在 IPC 进程操作, 所以网络操作也是在 IPC 进程。

private void setSSL() { SSLContext mySSLContext = getSslContext(); if (mySSLContext != null) { // 设置 SDK 内部的上传下载支持自签证书 SSLUtils.setSSLContext(mySSLContext); // 并且把 Glide 设置成支持自签证书(glide 内部是 HttpsURLConnection) // SDK 内置的图片预览用的是 Glide HttpsURLConnection.setDefaultSSLSocketFactory(mySSLContext.getSocketFactory()); } HostnameVerifier hostnameVerifier = getHostnameVerifier(); if (hostnameVerifier != null) { // 设置 SDK 内部的上传下载支持自签证书 SSLUtils.setHostnameVerifier(hostnameVerifier); // 并且把 Glide 设置成支持自签证书(glide 内部是 HttpsURLConnection) // SDK 内置的图片预览用的是 Glide HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); } // 设置合并转发消息自签证书 RongConfigCenter.featureConfig().setSSLInterceptor(new FeatureConfig.SSLInterceptor() { @Override public boolean check(SslCertificate sslCertificate) { return true; } }); }

private HostnameVerifier getHostnameVerifier() {
    HostnameVerifier hostnameVerifier =
            new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };
    return hostnameVerifier;
}

private SSLContext getSslContext() {
    TrustManager tm[] = {
        new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                Log.d(""checkClientTrusted"", ""authType:"" + authType);
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                Log.d(""checkServerTrusted"", ""authType:"" + authType);
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }
    };

    SSLContext mySSLContext = null;
    try {
        mySSLContext = SSLContext.getInstance(""TLS"");
        mySSLContext.init(null, tm, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mySSLContext;
}

如果使用的 IMLib 版本低于 2.10.6.3 版本,需要调用下面的 API , 参数传 true:

/**

  • 设置建立 Https 连接时,是否使用自签证书。
  • 此方法需要在 {@link #init(Context)}之前调用。

  • 如果不调用此方法, SDK 连接时会按默认证书处理

  • @param isEnable 是否使用自预先格式化的文本签证书。true 使用自签证书;false, 使用默认证书。
  • / public void enableHttpsSelfCertificate(final boolean isEnable) 方案二:在应用里声明允许明文传输 风险声明:允许明文传输可能导致 Google Play 无法上架。

通过下面配置,在 Android 9.0 手机上会仍然使用 http 连接,即明文传输的方式。

在应用的 res/xml 文件夹下新建 network_security_config.xml 文件

在 AndroidManifest.xml 的 application 节点下,配置允许明文传输的属性。

<application android:name="".myApp"" android:allowBackup=""true"" android:icon=""@drawable/seal_app_logo"" android:label=""@string/app_name"" android:networkSecurityConfig=""@xml/network_security_config"" android:supportsRtl=""true"" android:theme=""@style/AppTheme"">"

点赞
收藏
评论区
推荐文章
冴羽 冴羽
2年前
VuePress 博客优化之开启 HTTPS
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。注意此时,我们的域名还是,众所周知,开启HTTPS有很多好处,比如可以实现数据加密传输等,那我们如何开启HTTPS配置呢?1.购买证书阿里云提供了免费证书可以使用,在每个自然年内,都可以通过SSL证书服务一次性申领20张免费证书。1.1购买证书访问,选择「D
Wesley13 Wesley13
2年前
java访问Https服务的客户端示例
关于证书1、每个人都可以使用一些证书生成工具为自己的https站点生成证书(比如JDK的keytool),大家称它为“自签名证书”,但是自己生成的证书是不被浏览器承认的,所以浏览器会报安全提示,要求你手动安装证书,提示风险,是否继续等。只有通过权威的CA机构付费获得的证书才能被浏览器承认。2、证书(无客户端服务端之分)保存着IP信息、证书过
Easter79 Easter79
2年前
SpringBoot2.x配置Https
准备工作需要自签,或者权威机构颁发的证书一张springboot配置Https访问sslhttps访问的端口server.port8085证书,可以存放在resoucrs目录下server.ssl.keystoreclasspath:to
Stella981 Stella981
2年前
Electron应用使用自签名证书进行HTTPS链接
为什么要使用https通俗点讲https就是加密的http,http的链接是明文传输,被黑客截获后可以查看你传输的所有内容,包括用户名、密码等,从而盗取你的帐户信息。使用https,虽然黑客仍能获取你传输的所有数据,但只能看到一堆密文,保证了数据安全。安装OpenSSL非windows用户可
Stella981 Stella981
2年前
SpringBoot2.x配置Https
准备工作需要自签,或者权威机构颁发的证书一张springboot配置Https访问sslhttps访问的端口server.port8085证书,可以存放在resoucrs目录下server.ssl.keystoreclasspath:to
Stella981 Stella981
2年前
Linux CA
CA(CertificateAuthority)证书颁发机构主要负责证书的颁发、管理以及归档和吊销。证书内包含了拥有证书者的姓名、地址、电子邮件帐号、公钥、证书有效期、发放证书的CA、CA的数字签名等信息。证书主要有三大功能:加密、签名、身份验证。1.什么是CA认证?CA认证,即CA认证机构,为电子签名相关各方提供真实性、可靠性验证
Easter79 Easter79
2年前
SSL Certificate Signed Using Weak Hashing Algorithm 和SSL Medium Strength Cipher Suites Supported的...
这两天有个项目被扫描器报了几个中危,都是SSL证书的问题。记录一下解决方案吧。第一个问题:SSLCertificateSignedUsingWeakHashingAlgorithm这里的原因是因为使用弱算法签名的证书。解决方案查了下总结下来是换算法。操作步骤:  1、从证书颁发机构安装服务器的身份验证证书  2、在注册表H
Stella981 Stella981
2年前
SSL Certificate Signed Using Weak Hashing Algorithm 和SSL Medium Strength Cipher Suites Supported的...
这两天有个项目被扫描器报了几个中危,都是SSL证书的问题。记录一下解决方案吧。第一个问题:SSLCertificateSignedUsingWeakHashingAlgorithm这里的原因是因为使用弱算法签名的证书。解决方案查了下总结下来是换算法。操作步骤:  1、从证书颁发机构安装服务器的身份验证证书  2、在注册表H
Stella981 Stella981
2年前
Node.js 中使用 ECDSA 签名遇到的坑
文/Fenying最近有个朋友问我关于Node.js下使用ECDSA的问题,主要是使用Node.js的Crypto模块无法校验网络传输过来的签名结果。在踩坑无数后,终于搞清楚了原因。坑0x00:签名输出格式在排除了证书、消息不一致的可能之后,我开始对比使用Node.js签名的结果与网络传输过来的签
郑天寿 郑天寿
5个月前
私有云集成 iOS IMKit 5.X 源码的解决方案
描述IMKitSDK5.0及以上版本UI相关库开放了源代码,支持在CocoaPods中以源码形式进行调试与集成。但私有云客户无法直接参照使用公有云开发文档,通过CocoPods集成IMKit源码。私有云客户如需集成IMKit源码,请使用本文中的解决方案。分