开发者社区> 问答> 正文

SDK 服务端证书校验的问题

新人最近看OSS java SDK源码,发现SDK中在构造SSLcontext的时候,并没有对服务端证书做校验,TrustStrategy的isTrusted方法总是返回true;
类名:com.aliyun.oss.common.comm.DefaultServiceClient
方法:
    protected HttpClientConnectionManager create HttpClientConnectionManager() {
        SSLContext sslContext = null;
        try {
            sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                
                @Override
                public boolean isTrusted(X509Certificate[] chain, String authType)
                        throws CertificateException {
                    return true;
                }
                
            }).build();
            
        } catch (Exception e) {
            throw new ClientException(e.getMessage());
        }
        
        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register(Protocol.HTTP.toString(), PlainConnectionSocketFactory.getSocketFactory())
                .register(Protocol.HTTPS.toString(), sslSocketFactory)
                .build();
        
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        connectionManager.setDefaultMaxPerRoute(config.getMaxConnections());
        connectionManager.setMaxTotal(config.getMaxConnections());
        connectionManager.setValidateAfterInactivity(config.getValidateAfterInactivity());
        connectionManager.setDefaultSocketConfig(SocketConfig.custom().
                setSoTimeout(config.getSocketTimeout()).setTcpNoDelay(true).build());
        if (config.isUseReaper()) {
            IdleConnectionReaper.setIdleConnectionTime(config.getIdleConnectionTime());
            IdleConnectionReaper.registerConnectionManager(connectionManager);
        }
        return connectionManager;
    }





以上是不是说明OSS JAVA SDK 并没没有服务端证书做校验,对伪装服务端的这一类攻击有什么处理办法吗,或者OSSclient是否有别的设置可以实现对服务端的校验

展开
收起
mastercolor 2017-05-15 11:16:31 5002 0
3 条回答
写回答
取消 提交回答
  • Alibaba Cloud OSS SDK/Tools Developer
    ReSDK 服务端证书校验的问题
    mastercolor,您好,您说的有道理,如果https协议关闭掉服务器证书的有效性检查,是存在安全风险的。我们将尽快处理该问题。初步设想是,是否校验服务器证书做成配置项,让用户选择,默认是目前配置。
    2017-05-24 16:07:03
    赞同 展开评论 打赏
  • 回 3楼jesuiszb的帖子
    版主我理解你的意思是想说,服务端的资源是通过客户端进行各种授权和认证来达到保护服务端存储的用户数据的目的是吧。

    但是我提的问题是:
    客户端如果需要向服务端上传数据,但是对服务端的身份没有进行验证,那么如果不管我客户用什么样的授权或者别的手段来想服务端表明身份,只要客户端不对服务端进行校验,那么客户端要上传的数据就有可能被恶意截取。
    举个例子:
    有三个人服务端A, 客户端C,坏人H。
    假设:因为服务端A是公开可以访问的,坏人H对服务端A的所有接口进行大量接口调用并学习和模仿服务端A的接口返回方式。
    场景:坏人H通过非常规手段篡改了DNS服务器中Alilyun域名解析的IP地址,或者向外发布伪造的类似Aliyun服务的域名并解析到自己搭建一个伪Aliyun服务器。此服务器对外提供的接口全部仿造了aliyun的接口,对于所有的请求都使用假设中模仿和学习到的aliyun服务的返回方式。
    结果:客户端C的请求错误的发送到了坏人H的服务器上,由于坏人H的服务器能够伪造所有的Aliyun服务的接口,并针对所有的请求都返回OK,那么客户端C除人为干预外很难发觉坏人H的服务器是伪造服务器;那么客户就有可能会把自己一些信息和数据上传到这个坏人H的服务器上。。。。。
    再者,SDK的请求中都会带着签名信息,这个信息是可以直接以客户端C的身份去调用aliyun的各项服务的,SDK把这些信息发送给坏人H后,坏人H就可以以客户端C的身份为所欲为了。
         至此,坏人H的目的已经达到。

    如果有人说这是客户端自己配置的错误的域名或者域名服务器被篡改导致的问题,不能怪SDK;可问题是,httpclient本身是提供了证书校验的接口的,但是SDK对这个服务的证书校验选择了绕过,不去验证服务端的证书;
    要说明一点,服务端证书这个东西,除非是私人签发的证书需要客户到通过导入私钥的方式进行验证外,可信机构颁发的证书是不需要私钥进行认证的;浏览器、操作系统以及JDK都可以对可信机构颁发的证书进行校验。这个证书一般价格也不菲,一般的坏人也没有这个能力弄到这种证书来进行恶意攻击。

    所以,我认为此SDK对服务端的证书不做校验的处理确有不妥,且对于广大用户来讲有着极大的风险。
    目前解决方案只有修改源代码进行定制。

    -------------------------

    回 5楼jesuiszb的帖子
    OSS服务对外开放的链接都是 HTTP的吗
    还是说是HTTPS 但是没有加载证书

    -------------------------

    回 7楼jesuiszb的帖子
    版主 不知道你是不是在忽悠我。。
    SDK里面设置protocol 为HTTPS的接口
    阿里云对外发布的 域名用HTTPS也是可以连接的
    按照版主的说法, 阿里云现在除了ECS都是HTTP (安全性都不深究了),那为什么我用HTTPS可以连接呢

    -------------------------

    回 10楼baiyubin的帖子
    谢谢
    请问这个问题什么时候可以修复呢
    2017-05-17 15:34:09
    赞同 展开评论 打赏
  • ssl是用作https访问的,oss通信时用key和secret已经有签名认证保证了;

    -------------------------

    服务端通常是ECS有HTTPS,OSS可以通过其他多种授权方式保证,比如几分钟之内链接有效

    -------------------------

    目前阿里云的ECS有HTTPS通信,OSS做为存储服务暂时没有提供HTTPS协议方面的通信

    -------------------------

    目前应该都是HTTP的,只有ECS有HTTPS,HTTPS才有证书。

    -------------------------

    我以前确实都是用HTTP访问OSS的,HTTPS配置后,通常HTTP也可以访问,具体详细技术细节,建议提交工单问一下;

    2017-05-16 08:53:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载