存档

文章标签 ‘https’

某银行https调用超时率高

2017年11月2日 没有评论

对接某东南亚银行时,发现其中一个银行的超时率比较高。

联系银行后,得到的反馈是那边处理的很快,接到请求时就很晚了。
抓包和日志做综合对比,发现是产生日志十秒后,才开始有TCP的SYN握手包,后面的ACK和HTTPS的handshake都是正常的。

怀疑两种可能:
1、域名解析慢。
2、代码有问题,处理有队列或有等待连接池资源等问题。

考虑到这个通道的量比较少,队列和等待连接池的概率比较低,预期大概率是解析问题。

解决方案:在服务所在服务器绑host,一直观察到第二天,确认问题暂告解决。

遗留问题:如果银行端域名解析变更,会导致服务不可用。目前仅有失败率监控,监控到问题后再处理,会有个时间差。
后续解决方案:开发域名解析缓存机制组件,周期刷新解析结果。待调研实现后补充。

分类: 工作 标签: , ,

StartSSL证书使用相关问题

2015年6月9日 没有评论

最近申请了startssl的多个https证书,碰到一系列问题,逐个备忘一下。

1、nginx对同一个IP上多个域名证书的支持,下面的:TLS SNI support enabled。

#./nginx -V
nginx version: nginx/1.x.x
built by gcc 4.x.x 201xxxxx (Red Hat 4.x.x-x) (GCC) 
TLS SNI support enabled

如果不支持,需要重新编译openssl及nginx。

2、wget认证不过及firefox认证失败的问题。

ERROR: cannot verify www.xxxx.com's certificate, issued by `/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA':
  Unable to locally verify the issuer's authority.

某些浏览器或wget等工具没有内置StartCom Class 1 Primary Intermediate Server CA的证书为中级认证机构,认证链不完整,所以认证失败。
base64编码的cer,只需要把它的public的cer文件放到自己站点的public的cer下面即可。网上有人直接>>操作,导致中间没有换行,证书不认了,加个换行就对了。
加上它以后,它是被StartCom的根认证机构认证的,论证链就完整了。

3、apcache的Java的DefaultHttpClient,碰到nginx上配置多个证书时,访问其它域名的时候会出错。

javax.net.ssl.SSLException: hostname in certificate didn't match: <test.api.xxx.com> != <www.xxx.com> OR <xxx.com> OR <www.xxx.com>
        at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:228)
        at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)
        at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:149)
        at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:130)
        at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
        at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
        at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:641)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)

跟了一下代码,AbstractVerifier.verify中得到的确实是默认的www.xxx.com的证书链,第一个是当前站点,第二个是问题2中加的中级证机构的public证书。
再往下没跟动,怀疑httpclient是用ip得到的证书,也就意味着它不支持同一个IP多个域名证书。解决方案就是实现X509HostnameVerifier以取消域名的验证。

 final X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {

            @Override
            public boolean verify(String host, SSLSession ssl) {
                return true;
            }

            @Override
            public void verify(String host, SSLSocket ssl) throws IOException {//实际上只会调用这个。
            }

            @Override
            public void verify(String host, X509Certificate cert) throws SSLException {
            }

            @Override
            public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
            }
        };
final SSLSocketFactory ssf = new SSLSocketFactory(ctx, hostnameVerifier);

Android的https请求有机率连接失败

2014年1月7日 没有评论

很久之前的问题,印象中写过blog存档,今天翻了一下,发现没了,只能按记忆写一下,当初抓的包和分析的几种case也丢了。

问题:Android客户端访问https服务的时候,机率性连接失败,然后忽然在某个时候成功(大概是卡了十分钟以后)。iPhone客户端正常。
想当然的会认为是Android客户端层面的问题,因为iPhone正常。

分析过程:抓包发现Android的tcp报文带了TS(timestamp),而iPhone没带。
处理结果:把第一层反向代理上的timestamp关掉,以解决此问题。
更多内容…

分类: 工作 标签: , , ,