2012-02-14 4 views
1

Eclipse에서 기본 API를 사용하여 HTTPS를 통해 서버에 연결하고 있습니다. 내 키 저장소에 연결된 인증서가 있습니다. 그러나 Windows는 그것을 좋아하지 않으며 certificate chaining error을 던집니다. 우분투에서는 실제로 잘 작동합니다!Java 및 Windows - HTTPS를 통한 인증 문제

이제 Windows에서 나는 모든 인증서를 사용할 수있는 TrustManager을 기본적으로 생성하는 "해킹"을 보았습니다. 당분간 이것은 괜찮습니다. 나중에 다시 돌아올거야.하지만 내 현재 문제는 내 코드가 서버에 연결하고 uc.setRequestProperty("Authorization", "Basic " + encodedLogin);을 사용하여 인증하지만 내 양식에 대한 HTML 코드를 반환한다는 것입니다. 실제로는 처음에 로그인하는 것으로 생각했습니다. . 그 라인이 없으면 나는 403이된다.

브라우저에서 사이트에 갔을 때 로그인 상자가 나타납니다. 로그인했을 때 문제없이 로그인했습니다. Cancel을 클릭하고 로그인 상자를 닫으면 코드가 반환하는 정확한 HTML 양식으로 이동했습니다. 따라서이 팝업 상자에 어떻게 든 로그인해야하거나 웹 양식에 로그인하기 위해 두 번째 인증을해야합니다. 나는 충분히 명확한 설명이 그것 희망한다.

내 궁극적 인 목표는 분명히 로그인하여 사이트와의 추가 통신을 위해 인증 객체를 내 코드로 돌려 보내는 것입니다. 나는이 작은 딱딱한 부분에 며칠 동안 붙어있다! 어떤 도움이라도 대단히 감사합니다 !!

본인의 코드와 HTML 양식의 코드를 첨부했습니다.

감사합니다.

내 코드 :

try 
{ 
    String login = "MyUser:MyPass"; 
    byte[] encodedLogin = new Base64().encode(login.getBytes()); 

    StringBuilder parsedContentFromUrl = new StringBuilder(); 
    HttpsURLConnection uc = (HttpsURLConnection) webURL.openConnection(); 

    //uc.setRequestProperty("Proxy-Authorization", "Basic " + encodedLogin); 
    uc.setRequestProperty("Authorization", "Basic " + encodedLogin); 
    //uc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); 
    uc.connect(); 

    //uc.getInputStream(); 

    BufferedInputStream in = new BufferedInputStream(uc.getInputStream()); 
    //System.out.println(uc.getRequestProperty("WWW-Authenticate")); 

    int ch; 
    while ((ch = in.read()) != -1) { 
     parsedContentFromUrl.append((char) ch); 
    } 
    System.out.println(parsedContentFromUrl); 
} 
catch (IOException e) 
{ 
    System.out.println("IOException::"+e.getMessage()); 
    e.printStackTrace(); 
} 

HTML 웹 양식

<FORM METHOD=POST ACTION="/mylogin.form"> 
<FONT SIZE="+2"> 
<TABLE BORDER="0" WIDTH="400"> 
<TR> 
<TD ALIGN="LEFT"><UL><LI>Username</LI></UL></TD> 
<TD><INPUT NAME="username" SIZE="15"></TD> 
</TR> 
<TR> 
<TD ALIGN="LEFT"><UL><LI>Password</LI></UL></TD> 
<TD><INPUT TYPE="PASSWORD" NAME="password" SIZE="15"></TD> 
</TR> 
</TABLE> 
</FONT> 

<INPUT TYPE="HIDDEN" NAME="login-form-type" VALUE="pwd"> 

<BR><INPUT TYPE="SUBMIT" VALUE="Login"> 
</FORM> 
+0

인증 체인은 유효한 인증 기관에서 그 아래 특정 인스턴스까지의 체인입니다. 예 : 인증서를 서명 한 SectionB 인증서에 서명 한 CompanyZ 인증서에 서명하는 Verisign. 표준 호환 응용 프로그램을 사용하면 부인할 수 있습니다. – Alfabravo

+0

주석 주셔서 감사하지만 내 코드는 우분투에서 작동합니다. 내가 아는 한 내 질문의 그 부분은 Windows keytool/keystore 문제입니다. 다음 주에 다시 보도록하겠습니다. – eoinzy

답변

2

HTTP 인증은 웹 양식에 로그인과 같은 것은 아니다.

요청한 페이지 (로그인 페이지)가 표시되도록 HTTP 승인이 작동합니다 (예 : 403 오류가 수정 됨). HTML은 양식에 로그인하기 위해 /mylogin.form URL에서 POST를 수행해야 함을 보여줍니다. 현재 로그인 페이지의 URL에서 GET을 수행하고 있습니다.

서버가 두 개의 다른 인증 프로세스를 병렬로 수행하는 것은 드문 경우입니다. 서버가 잘못 구성되었을 수 있습니다.

+0

참고하시기 바랍니다. 서버는 동일한 세부 정보로 2 번의 별도 로그인을 요구했습니다. 브라우저에서 한 번 로그인하면 전달할 수 있습니다. 내 프로그램에서 이렇게하는 방법을 모르겠다. 그래서 나는 POST를 두 번째로 두 번 실행했다. – eoinzy