我们正在开发一个注重安全的应用程序,我们需要应用程序向我们发送用于连接的证书。
是否可以下载证书并在Android上发送。我们需要这样做,以便我们可以检查证书是否已被泄露。或者最好从证书中检索详细信息,将其写入日志然后发送。我们有一个可以发送详细信息的api
答案 0 :(得分:0)
我发现你之前要求钉住......
您可以按以下方式固定证书
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;
}
}
您可以在连接conn
之后运行此操作,然后如果引脚不匹配,您可以在发送数据之前中止。注意:上面的代码固定了证书的公钥而不是证书。
如果您只想要证书,可以获得cert.toString()