在安卓系统中安全存储客户端证书和密钥(.pem)

问题描述 投票:0回答:1

我正在开发一个Android应用,供内部使用,向我们的服务器发送测试请求。认证是通过Basic+客户端证书。我现在做的是将证书和密钥文件存储在assetscerts中,通过输入获取密钥和Basic Auth的密码,然后保存在SharedPreferences中,这可能不安全。我主要关心的是两个.pem-文件。我读了很多关于将它们保存在Android Keystore中的文章,但不是很确定。是否可以 "安装 "证书,然后删除pem文件?"我在搜索解决方案时,发现大部分时间都是应用程序自生成证书的问题。但我有两个.pem文件,需要用来发送请求。

由于将证书存储在assets中,我担心它可以被反向工程。

现在的例子代码。

SecurityContext context = SecurityContext.defaultContext;
ByteData cert = await rootBundle.load("assets/certs/xy.cert.pem");
context.useCertificateChainBytes(cert.buffer.asUint8List());
ByteData key = await rootBundle.load("assets/certs/xy.key.pem");
final storage = FlutterSecureStorage();
String passphrase = await storage.read(key: "passphrase");
String basic = await storage.read(key: "basic");
context.usePrivateKeyBytes(key.buffer.asUint8List(), password:passphrase);
HttpClient client = new HttpClient(context: context);
var uri = "https://url.com";
var method = 'POST';
var request = await client.openUrl(method,Uri.parse(uri));
request.headers.set('Content-Type', 'application/json; charset=utf-8');
request.headers.set("Authorization", basic);

但我想确保它不能从其他应用程序中提取。

EDIT:

也许应该提到:我正在用flutter工作,但这并没有让它变得更容易。

android security certificate
1个回答
0
投票

这其实是一个供应问题。你并不希望你的所有应用都用同一个密钥进行认证--一旦密钥泄露,所有应用的安装都会受到影响。

如果你真的想使用基于证书的认证,你最好在第一次使用时生成一个keycertificate,然后使用它。不过说起来容易做起来难,所以你可以考虑使用类似于 FIDO2 API 在安卓系统中可用,如果你真的需要强大的认证。

© www.soinside.com 2019 - 2024. All rights reserved.