SSL WebServices Apache Tomcatへの接続に問題があり、Java SEクライアントは正常に接続しますが、Androidクライアントは接続を望まず、次のエラーのいずれかを表示します。1.「セキュリティ要件が満たされていません-メッセージにセキュリティヘッダーがありません」、 2.「Java.lang.RuntimeException:java.lang.RuntimeException:エラー:0407006A:rsaルーチン:RSA_padding_check_PKCS1_type_1:ブロックタイプは01(SHA-1)ではありません。」接続するには、次のコードを記述します。
private SSLSocketFactory getSSLSocketFactory() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
KeyStore trusted = KeyStore.getInstance("PKCS12");
InputStream in = activity.getResources().openRawResource(R.raw.client_keystore);
try {
trusted.load(in, "blablabla".toCharArray());
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(trusted);
SSLContext context = SSLContext.getInstance("SSLv3");
context.init(null, tmf.getTrustManagers(), null);
return context.getSocketFactory();
}
public String SendRecieveMessage(String xmlData, String nameXML, String methodName, String methodAction) {
HttpsTransportSE httpTransport = new KeepAliveHttpsTransportSE("hostname", 8443, "/blablabla/blablabla?wsdl", 1000);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
SoapObject request = new SoapObject(activity.getResources().getString(R.string.SOAP_NAMESPACE), methodName); // set
// request
Log.e("Sending SOAP", xmlData);
String base64 = base64Coder.encodeString(xmlData);
request.addProperty(nameXML, base64);
envelope.setOutputSoapObject(request); // prepare request
try {
((HttpsServiceConnectionSE) httpTransport.getServiceConnection()).setSSLSocketFactory(getSSLSocketFactory());
} catch (KeyManagementException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (KeyStoreException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
SoapPrimitive result = null;
try {
httpTransport.call(methodAction, envelope);
result = (SoapPrimitive) envelope.getResponse(); // get
if (result != null) {
base64 = base64Coder.decodeString(result.toString());
} else {
base64 = null;
}
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("ERROR", "SOAPSendRecieve: " + e.getMessage());
base64 = null;
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
Log.e("ERROR", "SOAPSendRecieve: " + e.getMessage());
base64 = null;
} catch (IllegalArgumentException e) {
Log.e("ERROR", "SOAPSendRecieve: " + e.getMessage());
base64 = null;
}
} finally {
request = null;
result = null;
}
return base64;
}
blablabla.jksのサーバーによってblablabla.pfx(PKCS#12)に変換し、「KeyStoreExplorer」と「Portecle」の2つのプログラムを使用してみました。また、「BKS」の形式も試しました。同じ結果で、SSLkSOAP2で説明されています。公式ウェブサイトの例では、何が問題なのか、間違っているために間違いであるか、サーバー設定でクライアントが問題である可能性がありますか?
リクエストとレスポンスのダンプの例: