KSOAP2를 사용하는 Android의 XmlPullParserException과 관련하여 여러 가지 질문/답변을 여기에서 살펴 보았지만 지금까지 아무 것도 잘못 이해하지 못했습니다. 나는 iOS App을 Android로 포팅하기 시작했으며, 지금은 .Net 웹 서비스와 통신하도록 앱을 가져 오는이 부분에 붙어 있습니다. 다음은 문제의 코드입니다. 대부분은 웹 서비스에서 자체 서명 된 인증서를 가지고 있기 때문에 여러 가지 다른 질문/블로그/사이트에서 함께 작성되었습니다. 누구든지 팁을 가지고 있거나 내가 웹 서비스를 사용하는 몇 가지 다른 영역이 있기 때문에 위의 내용을 이해하는 데 도움이 될 몇 가지 독서 방향으로 나를 안내 할 수 있고 필요한 경우 내가 지금 얻고있는 것보다 더 잘 디버깅하는 법을 알아라.Android 및 HTTPS 웹 서비스 (XmlPullParserException)
String URL = "https://online.ensinet.com/Services/ENSIMobileservice.asmx";
String SOAP_ACTION = "http://ensinet.com/VerifyRep";
String NAMESPACE = "http://ensinet.com/";
String METHOD_NAME = "VerifyRep";
String SERVER = "online.ensinet.com";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
//PropertyInfo usernamePI = new PropertyInfo();
//usernamePI.setName("RepLogin");
//usernamePI.setValue(username);
//usernamePI.setType(String.class);
request.addProperty("RepLogin", username);
//PropertyInfo passPI = new PropertyInfo();
//passPI.setName("RepPass");
//passPI.setValue(passphrase);
//passPI.setType(String.class);
request.addProperty("RepPass",passphrase);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
try
{
allowAllSSL();
HttpsTransportSE androidHttpTransport = new HttpsTransportSE(SERVER,443, URL, 1000);
androidHttpTransport.call(SOAP_ACTION,envelope);
SoapObject response=(SoapObject) envelope.getResponse();
Log.i("Message", "the response contains: " + response.toString());
}
catch(Exception e)
{
Log.i("Message", "there was an error: " + e);
}
오케이 여기 좀 더 자세한 정보가 있습니다. 먼저 allowAllSSL()은 자격 증명이 없으므로 다른 포럼에서 자체 서명 된 인증서의 자격 관리자를 우회하는 방법이며 모바일 장치에서 수집하는 정보는 웹 응용 프로그램처럼 중요하지 않습니다. 모든 웹 서비스가 호스팅됩니다. 다음은
private static TrustManager[] trustManagers;
public static class _FakeX509TrustManager implements
javax.net.ssl.X509TrustManager {
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public boolean isClientTrusted(X509Certificate[] chain) {
return (true);
}
public boolean isServerTrusted(X509Certificate[] chain) {
return (true);
}
public X509Certificate[] getAcceptedIssuers() {
return (_AcceptedIssuers);
}
}
public static void allowAllSSL() {
javax.net.ssl.HttpsURLConnection
.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
javax.net.ssl.SSLContext context = null;
if (trustManagers == null) {
trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
}
try {
context = javax.net.ssl.SSLContext.getInstance("SSL");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
Log.e("allowAllSSL", e.toString());
} catch (KeyManagementException e) {
Log.e("allowAllSSL", e.toString());
}
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
.getSocketFactory());
}
}
또한 가짜 자격 증명 관리자를 설정하는 세부 방법은, 나는 requestDump에보고했고 나는 요청에 실제 웹 서비스의 일부가 아닌 <Header />
태그가 있다는 것을 발견 그래서 KSOAP2에 의해 추가 된 것 같아요. 그리고 지금까지 제가 가지고있는 START TAG erro의 일부일 수있는 제거 방법을 보지 못했습니다. 나는 SOAP 요청을 수동으로 빌드 할 것이라고 생각하는데, 나중에 오늘 밤 시도해 볼 것이므로 작동하는지 확인하십시오.
전체 스택 추적을 게시하십시오. 'allowAllSSL()'은 매우 의심 스럽습니다. 무엇을합니까? 우편 번호. 일반적으로 자체 서명 된 인증서가있는 경우 _any_ certificate가 _bad 아이디어 인 _을 허용하도록 앱을 신뢰하도록 설정해야합니다. –