HttpUrlConnection не находит вызов NTLM на Android
Я пытаюсь подключить приложение Android к серверу IIS с помощью класса HttpUrlConnection.
моему серверу требуется аутентификация пользователя, поэтому он отправляет клиенту следующий вызов:
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
моя проблема в том, что HttpUrlConnection, похоже, не анализирует его. Таким образом, getPasswordAuthentication() никогда не вызывается, и он возвращает IOException "нет проблем с аутентификацией".
вот мой код :
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("myUsername", "myPassword".toCharArray());
}
});
URL url = new URL(myUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Encoding", "gzip");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Connection", "close");
conn.setDoOutput(true);
conn.setDoInput(true);
try
{
conn.connect();
status_code = conn.getResponseCode();
}catch (IOException e) {
...
}
Я действительно начинаю думать, что NTLM challenge просто не поддерживается HttpUrlConnection. Я видел некоторые библиотеки, которые, похоже, выполняют эту работу, но я бы предпочел не использовать внешние библиотеки.
может ли кто-нибудь подтвердить, возможно ли или нет сделать HttpUrlConnection обрабатывать вызов NTLM без внешних библиотек?
3 ответов
Я только смог заставить его работать с HttpClient, установив AuthScheme и библиотеку ниже:http://jcifs.samba.org/src/jcifs-krb5-1.3.17.zip.
HttpClient httpclient = new HttpClient(httpParameters, context);
NTCredentials creds = new NTCredentials(“username”, “password”, "", "dir");
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(context.getString(“whatever is your main URL”), -1), creds);
httpclient.getAuthSchemes().register("ntlm", new NTLMSchemeFactory());
затем вы реализуете двигатель и завод JCIFS. Вы можете найти образцы в http://hc.apache.org/httpcomponents-client-4.2.x/ntlm.html
мы все еще можем заставить его работать с HttpsURLConnection-определить Аутентификатор и обойти Certvalidation (доверяя всем сертификатам)
пакета com.инфосек.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class SSLConnect {
public static void main(String[] args) throws Exception {
String urlString = System.getProperty("url", "https://yourURLgoesHere:8443/test?");
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
Authenticator.setDefault(new MyAuthenticator("domainname\yourname", "yourpassword"));
URL url = new URL(urlString);
URLConnection urlConnection = url.openConnection();
HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) urlConnection;
SSLSocketFactory sslSocketFactory = createTrustAllSslSocketFactory();
httpsUrlConnection.setSSLSocketFactory(sslSocketFactory);
try (InputStream inputStream = httpsUrlConnection.getInputStream()) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = reader.readLine()) != null) {
// if you want to print the content
System.out.println(line);
}
}
}
// Trust any Server that provides the SSL certificate by bypassing trust managers
private static SSLSocketFactory createTrustAllSslSocketFactory() throws Exception {
TrustManager[] byPassTrustManagers = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
} };
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, byPassTrustManagers, new SecureRandom());
return sslContext.getSocketFactory();
}
}
// Authenticator which intercepts and provide required credential
class MyAuthenticator extends Authenticator {
private String httpUsername;
private String httpPassword;
public MyAuthenticator(String httpUsername, String httpPassword) {
this.httpUsername = httpUsername;
this.httpPassword = httpPassword;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
System.out.println("Scheme:" + getRequestingScheme());
return new PasswordAuthentication(httpUsername, httpPassword.toCharArray());
}
}
HttpUrlConnection работает с NTLM, используя http://jcifs.samba.org/ библиотека просто нуждается в некоторых незначительных корректировках, таких как удаление кода smb java, который вам либо не нужен, и исправление получения responseCode.