2011-07-26 2 views
2

어제 내 안드로이드 애플 리케이션을 디버깅하는 동안 역방향 DNS 조회가 불가능할 때마다 내 연결은 (대략 20-30 초 정도) 시작하는 데 많은 시간이 걸리는 것으로 나타났습니다.보안 소켓, dns 및 getnameinfo 시간 초과

내가 소스를 InetAddress.getHostName() 호출 (너무 많은 시간이 소요되는 곳)까지 범위를 좁힐 수 있었지만, 나는 그것을 (불행히도) 주변에서 어떻게 작동하는지에 대해 알지 못합니다. DNS 확인이없는 SSL 연결은 MITM 공격에 더 취약하다는 것을 알고 있습니다. 그런 경우에 나는 그가 애플리케이션을로드하고 연결하는 것을 영원히 기다리지 않고 문제에 관해 사용자에게 알리는 것을 선호 할 것이다. 난 웹 앞뒤로 대답을 찾고, 자바에서 해결할 수있는 방법을 찾을 수 있지만 그들 중 누구도 안드로이드에 적용됩니다 (적어도 캐시를 inetaddress도 내 호스트 이름을 해결하기 위해 다른 클래스를 사용할 수 없습니다 impl 속성).

거기에 몇 가지 합리적인 시간 제한 (말할 : 2-3 초) 제한 시간을 제한 할 수있는 방법은 무엇입니까? 나는 안드로이드 네이티브 코드로 SSL 소켓을 다시 쓰는 데 필요한 시간을 절약하고 싶습니다.

감사합니다.

+0

다루 업데이트되는 경우 작동해야합니까?/reverse/DNS는 어디에 사용됩니까? (인증서의 ID 확인은 클라이언트가 연결하려는 DNS가 아닌 전달 DNS를 기반으로합니다. – Bruno

+0

서버 간 지점 간 연결을 설정하는 것은 쉬운 시도가 아닙니다. 클라이언트는 두 개의 리눅스 장치 (ok, linux 및 android)입니다. 내 안드로이드 응용 프로그램은 TLS 컨텍스트를 만들고 나중에 SSLSocketFactory를 사용하여 보안 소켓을 만듭니다. 그러나 문제는 Inet4Address (InetSocketAddress로 빌드 됨)를 사용하여 _sock.connect_를 호출 할 때를 보여줍니다. 나는이 호출 (sock.connect)을 두 개의 연속 호출로 분리했다. 즉, inet4address.getHostName()은 20 초 지연되었고, socket.connect는 이전 호출로 인해 가속화 될 수 있다고 생각하여 신속하게 작업을 시작했다. –

+0

InetAddress를 명시 적으로 처리하도록 선택한 이유가 무엇입니까? 왜'SSLSocketFactory.createSocket (String host, int port)'를 사용하지 않겠습니까? – Bruno

답변

1

이것은 ipv6 인터페이스가 구성되지 않은 경우에도 GLIBC가 ipv6 호스트 이름을 역방향 조회하려고 시도하는 버그와 관련이 있습니다.

문제 및 수정

여기에 설명 :

https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/417757

/etc/hosts 파일이 당신은 무엇에 연결 있는지 명확히 할 수 특정 IP 주소