gpt4 book ai didi

Android 在哪里保存服务器 TLS X509Certificate

转载 作者:行者123 更新时间:2023-11-30 03:14:26 26 4
gpt4 key购买 nike

我正在尝试连接到服务器 o 获取我需要重用的 SSL 证书(用于应用程序中的安全 TCP 连接)。我需要将二进制形式的证书传递给这些类,如果用户第二天尝试重新连接到同一台服务器,我还需要将这个新证书与保存的证书进行比较。出于这个原因,我有这段代码:

ttpsURLConnection = (HttpsURLConnection)url.openConnection();
inputStream = httpsURLConnection.getInputStream();
Certificate[] cert = httpsURLConnection.getServerCertificates();

//we are taking the last certificate which should be the server certificate
X509Certificate x509Certificate = (X509Certificate) cert[cert.length-1];
byte [] encodedCertificate = x509Certificate.getEncoded();

我想知道保存此证书的最佳和最安全的方法,以便不必每次都打开连接。

首先,我想到在这篇文章的帮助下使用 Android KeyChain: http://nelenkov.blogspot.com.es/2011/11/using-ics-keychain-api.html .问题是他需要用户交互,然后用户必须在他的设备上激活图案或图钉,否则这将不起作用。另一个不便之处是证书将对所有应用程序可用,我不希望这样。

我也尝试过使用 KeySore:

String keyStoreType = KeyStore.getDefaultType();
keyStore = KeyStore.getInstance(keyStoreType);

InputStream stream = null;
char[] password = null;
keyStore.load(stream, password);
if(keyStore.getCertificate(CERTIFICATE_ALIAS) == null){
Log.d(TAG, "KeyStore doesn't contain field "+CERTIFICATE_ALIAS);
keyStore.setCertificateEntry(CERTIFICATE_ALIAS, certificate);
} else {
Log.d(TAG, "KeyStore already contains field "+CERTIFICATE_ALIAS);
}
}

每次我回来 keyStore.getCertificate(CERTIFICATE_ALIAS) == null 总是返回 true,所以不可能以这种方式“保存”证书。

当然,我正在考虑使用私有(private)模式将证书保存到 SharedPreferences,但我想知道它是否安全?如果没有,是否有更好的方法来保存仅供我的应用程序使用的证书(api 级别 14++) 谢谢

最佳答案

证书在设计上是公开的,因此将它们存储在何处并不重要。 KeyStore 可以工作,但您必须调用 store 方法才能将其实际刷新到磁盘。如果您需要连接到多个服务器,使用证书主题名称的 SHA1 散列作为 key 可能是个好主意,这样您就不必搜索整个 keystore 。如果您使用这种方法,您可以简单地将证书保存为文件并将文件名用作 key (ala Apache,Android 也在内部为受信任的证书执行此操作)。

如果您将它们导入系统信任库(通过 KeyChain),证书将在系统范围内用作信任 anchor ,这可能不是您想要的。

关于Android 在哪里保存服务器 TLS X509Certificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com