2010-07-07 4 views
7

나는 개발중인 서버와 그것에 접속하는 몇몇 개발자가있다. 이 서버는 SSLEngine과 함께 Java의 TLS 구현을 사용합니다.자바 SSL 역 DNS 조회를 비활성화하는 방법

우리는 처음에는 새로운 연결마다 긴 지연 (30-40 초)이 있음을 확인했습니다. 우리는 DNS 조회를 시간 초과되도록 되돌리기 위해 범위를 좁혔습니다. 우리는 모든 IP를 HOSTS 파일에 넣어 해결했습니다.

이제 우리는 점진적으로 사용자층을 넓히기 위해 노력하고 있습니다. 특히 HOSTS 파일을 수정하고 싶지 않습니다. 특히 정적 IP가 보장 될 수는 없으므로 문제가됩니다.

Java SSL/TLS에서 역 DNS 조회 단계를 사용하지 않도록 설정하는 방법이 있습니까?

구성 가능한 매개 변수로 사용하고 싶습니다. 개발 중에이 매개 변수를 해제 할 수 있습니다.

+0

사용중인 응용 프로그램 서버는 무엇입니까? Oracle WebLogic Server는 Sun JSSE 구현이 아닌 Certicom을 사용하므로 구성 메커니즘이 다릅니다. –

답변

3

이 질문은 2006 년에 Sun JSSE forums에 올랐습니다. 요점은 Windows Java 런타임에서만 발생하는 것입니다. this bug report에서, 바닥쪽으로, 하나의 제안 된 솔루션입니다. 그리고 여기 another proposed solution입니다 :

기본적으로 SSL 핸드 셰이크 중에 역방향 DNS 조회는 긴 타임 아웃이 발생합니다.

문제를 해결하려면 서버 주소를 InetAddress 개체 으로 캐시하고 서버에 새로운 연결을 만들 때마다 Socket 생성자에서 다시 사용하십시오.

이 중 하나가 적합합니다.

+0

캐시 란 무엇입니까? 어떻게 우리가 그것을 습득 할 수 있을까요? – Farhan

11

저는 IP 주소로만 SSL 소켓 연결을 만들려고 할 때이 같은 문제에 직면했습니다. 그 결과 DNS 역방향 조회가 발생했기 때문에 실제로는 느려졌습니다 ...

나에게 해결책은 SSL 연결을 위해 InetAddress를 만들 때 간단히 빈 문자열을 호스트 이름으로 전달하는 것입니다. 그건 내가

InetAddress.getByAddress("", addrBytes) 

InetAddress.getByAddress(addrBytes) 

를 변경하고 더 이상 역방향 DNS 조회를하지 않습니다이다.

0

빈 호스트 이름을 단일 호스트에 연결하기 위해 작동하는 InetAddress에 전달하는 아리의 해결책은 IP 주소로 여러 호스트에 연결할 때 몇 가지 부작용이있었습니다. Java는 튜플 <remote-hostname, port>을 사용해 SSLSession 오브젝트를 캐쉬합니다. 이것은 OpenJDK here에서 볼 수 있습니다. 따라서 이전 연결 (특히 내 경우에는 TLS 프로토콜 버전)에 대한 TLS 설정이 다른 호스트에 대한 새 연결에 적용되었습니다 (둘 다 동일한 빈 호스트 이름을 공유했기 때문에). 필자의 경우 새 호스트는 이전 호스트에서 협상 한 TLS v1 프로토콜의 다운 그레이드를 거부하여 TLS 핸드 셰이크 오류를 발생 시켰습니다.

이 솔루션은 대신과 같이 원격 IP 주소를 기반으로 고유의 호스트 이름을 구성하는 것이 었습니다 :

String hostname = String.format("host-%s", BaseEncoding.base16().encode(address.getAddress())); 
InetAddress newAddress = InetAddress.getByAddress(hostname, address.getAddress()); 

따라서 DNS 역방향 조회 자바 수행이 불가능했지만, 원격 호스트에 캐시 된 TLS 설정은 적용되었다 누화 효과가없는 동일한 원격 호스트 및 포트