Ich bin mit diesem für die letzten zwei Tage fest, wo ich gegenseitige Authentifizierung auf dem Server mit Client-Zertifikat implementieren müssen. Ich habe meine .pfx-Datei im rohen Ordner im res-Verzeichnis.Https Androiden zu Server-Kommunikation gibt immer 403 Antwort
Ich habe es in res/raw/certificate.pfx
Ich habe auch die HttpURLConnection in Android und stellen Sie die SSLSocketFactory die einen implementiert, die ich von meinem Zertifikat erzeugt. Aber das Problem ist, dass der Server immer 403 zurückgibt. Ich habe versucht, alle Request-Eigenschaften einschließlich "User Agent" hinzuzufügen. Aber nichts scheint zu funktionieren.
Ich habe den folgenden Code beigefügt. Ich vertraue dem Zertifikat so.
public SSLSocketFactory getSSLSocketFactory_Certificate(String keyStoreType, int keystoreResId)
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException, NoSuchProviderException {
InputStream caInput = context.getResources().openRawResource(keystoreResId);
// creating a KeyStore containing trusted CAs
if (keyStoreType == null || keyStoreType.length() == 0) {
keyStoreType = KeyStore.getDefaultType();
}
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(caInput, "".toCharArray());
// creating a TrustManager that trusts the CAs in the KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, wrappedTrustManagers, null);
return sslContext.getSocketFactory();
}
Und schließlich in meiner Tätigkeit i machen https Aufruf wie folgt
URL url = null;
HttpURLConnection conn;
try {
url = new URL("https://example.com");
conn = (HttpURLConnection) url.openConnection();
if (conn instanceof HttpsURLConnection) {
((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory);
}
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
int responseCode = conn.getResponseCode();
System.out.println("Server response code" + responseCode);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Aber das Ergebnis ist immer 403 verboten. Ich bin mir nicht sicher, wo ich falsch liege. Jemand bitte hilf mir.