2016-05-02 2 views
0

Я пишу некоторые инструменты (предназначенные только для использования в среде разработки), где я пытаюсь автоматизировать отправку сообщений в HTTP-сообщение. Мой метод (ниже) sendByHTTPSNaive() использует наивную реализацию javax.net.ssl.TrustManager, чтобы принимать любые сертификаты. (Опять же, это для тестирования разработки.) Я получаю несанкционированный код 401. Ниже приведен мой метод и вывод отладочного сообщения TLS. Люди сети проекта говорят мне, что я столкнулся только с xml-шлюзом, который должен пройти наивный TrustManager, но заверили меня, что нет другой аутентификации. У меня закончились идеи о том, как отладить эту проблему, если это какая-то вещь TLS, или же есть другой уровень аутентификации помимо шлюза xml?Невозможно отправить сообщение HTTPS с Java

public String sendByHTTPSNaive(String destinationURI, 
           String msgBodyContent) { 

    String result = "no response"; 
    try { 
     URL url = new URL(destinationURI); 
     // URLConnection con = url.openConnection(); 

     HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 

     // specify that we will send output and accept input 
     con.setDoInput(true); 
     con.setDoOutput(true); 
     con.setConnectTimeout(20000); // long timeout, but not infinite 
     con.setReadTimeout(20000); 
     con.setUseCaches(false); 
     con.setDefaultUseCaches(false); 

     NoopHostnameVerifier HOSTNAME_VERIFIER = new NoopHostnameVerifier(); 
     TrustManager[] TRUST_MANAGER = { new NaiveTrustManager() }; 
     if (con instanceof HttpsURLConnection) { 

      SSLContext context = SSLContext.getInstance("TLS"); 
      context.init(new KeyManager[0], TRUST_MANAGER, 
              new SecureRandom()); 
      SSLSocketFactory socketFactory = context.getSocketFactory(); 
      ((HttpsURLConnection) con).setSSLSocketFactory(socketFactory); 
      ((HttpsURLConnection) con).setHostnameVerifier(HOSTNAME_VERIFIER); 
     } 

     // tell the web server what we are sending 
     con.setRequestProperty("Content-Type", "text/xml"); 
     OutputStreamWriter writer = new OutputStreamWriter(
             con.getOutputStream()); 
     writer.write(msgBodyContent); 
     writer.flush(); 
     writer.close(); 

     // reading the response 
     InputStreamReader reader = new InputStreamReader(con.getInputStream()); 
     StringBuilder buf = new StringBuilder(); 

     char[] cbuf = new char[2048]; 
     int num; 

     while (-1 != (num = reader.read(cbuf))) { 
      buf.append(cbuf, 0, num); 
     } 

     result = buf.toString(); 
    } catch (Throwable t) { 
     t.printStackTrace(System.out); 
    } 
    return result; 
} 

отладочный вывод, используя -Djavax.net.debug флаг = все

HTTP/1.1 401 Una 
uthorized..Serve 
r: Apache-Coyote 
/1.1..WWW-Authen 
ticate: Basic re 
alm="L7SSGBasicR 
ealm"..L7-Policy 
-URL: https://ab 
cdefghi.jklmno.c 
om:443/ssg/polic 
y/disco?serviceo 
id=20938758..Con 
tent-Length: 23. 
.Date: Thu, 28 A 
pr 2016 16:00:56 
GMT....Authenti 
cation RequiredC 
..._.2..5\"B.... 
:............... 

ответ

0

Ваш TLS работает нормально, ошибка приходит от HTTP. Вам необходимо предоставить информацию аутентификации вместе с запросом - в частности, заголовок Authorization. Ответ содержит заголовок «WWW-Authenticate», который бросает вызов клиенту для предоставления учетных данных. Клиент должен повторить запрос с соответствующим заголовком «Авторизация».

Смежные вопросы