ich Sie vorher für Pinning gefragt siehe schicken ...
Sie das Zertifikat in der folgenden Art und Weise kann pinnen
Certificate[] certs = conn.getServerCertificates();
MessageDigest md = MessageDigest.getInstance("SHA-256");
for (Certificate cert : certs) {
X509Certificate x509Certificate = (X509Certificate) cert;
byte[] key = x509Certificate.getPublicKey().getEncoded();
md.update(key, 0, key.length);
byte[] hashBytes = md.digest();
StringBuilder hexHash = new StringBuilder();
for (byte hashByte : hashBytes) {
int k = 0xFF & hashByte;
String tmp = (k < 16) ? "0" : "";
tmp += Integer.toHexString(0xFF & hashByte);
hexHash.append(tmp);
}
// You can even log cert.toString()
Log.d(TAG, hexHash.toString()); get the hash from here
// If you create `pins` as a Set with all the valid pins from above
if (pins.contains(hexHash.toString())) {
return true;
}
}
du nach dem Lauf kann Verbindung wurde dann verbunden, wenn der Pin nicht übereinstimmt, können Sie vor dem Senden von Daten abbrechen. Hinweis: Der obige Code pinnt den öffentlichen Schlüssel des Zertifikats, nicht das Zertifikat.
Wenn Sie nur das Zertifikat möchten, können Sie einfach cert.toString()
, wenn ich 'URL url = new URL (PATH) versuchen und laufen;' 'HttpsURLConnection Verbindung = (HttpsURLConnection) url.openConnection();' und ' connection.connect(); 'Ich bekomme eine' javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Vertrauensanker für den Zertifizierungspfad nicht gefunden ', wenn ich einen Proxy auf meinem Android-Gerät verwende (mitmproxy und fiddler), aber nicht Wenn Sie keinen Proxy verwenden –
Ich nehme an, Sie verwenden ein M + Gerät, in diesem Fall müssen Sie Ihr Proxy-SSL-Zertifikat zur Netzwerksicherheitskonfiguration hinzufügen. – Ryan
Ich führe dies auf Android 6.0 und 7.0. Ich weiß nicht, wie die Netzwerksicherheitskonfiguration konfiguriert wird. Es scheint in Android 6.0 zu funktionieren. –