gpt4 book ai didi

Android - 以编程方式从 keystore 检索证书(手动安装)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:49 26 4
gpt4 key购买 nike

在我的 android 设备上,我手动安装了一个证书,目的是允许我访问特定网站。

当我查看“安全性——用户证书”时,我可以看到我的证书。

我的网站显示在一个webview中,所以我必须使用下面的代码

@Override
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {
if (mCertificates == null || mPrivateKey == null) {
loadCertificateAndPrivateKey();
}
request.proceed(mPrivateKey, mCertificates);
}

在我的 loadCertificateAndPrivateKey() 函数中,我将获得这样的证书

KeyStore ks = KeyStore.getInstance("AndroidCAStore");
if (ks != null)
{
ks.load(null, null);
Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements())
{
String alias = (String) aliases.nextElement();
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias);
if(cert.getIssuerDN().getName().contains("TOTO")){
mCertificates = new X509Certificate[1];
mCertificates[0] = (X509Certificate)cert;


mPrivateKey = ??;

}
}

但是我不知道如何获取私钥...
我尝试过这种方式,但关键对象为空(当我直接从我的应用程序加载我的证书时,相同的代码有效)

Key key = keyStore.getKey(alias, password.toCharArray());
if (key instanceof PrivateKey) {
mPrivateKey = (PrivateKey)key;
}

所以我有几个问题:

  • 这是检索证书的正确方法吗?
  • 为什么无法使用证书密码检索私钥?
  • 如何取回这个私钥?

感谢您的回答!

最佳答案

我找到了这样做的方法,希望它能帮助别人。

我关注了this link解释如何实现整个流程。

最后,我得到了下面的代码。首先,定义一个 KeyChainAliasCallback 并调用显示一个 Activity 的 KainChain.choosePrivateKeyAlias 以具有访问证书存储的用户授权。

KeyChainAliasCallback keyChainAliasCallback = new KeyChainAliasCallback() {
@Override
public void alias(@Nullable String s) {
Log.d(TAG, "selected alias = " + s);
asyncTask.execute();
}
};
KeyChain.choosePrivateKeyAlias(this, keyChainAliasCallback, null, null, null, -1, CERT_ALIAS);

然后,您可以从内部存储中检索私钥和证书链(您必须使用异步函数)

AsyncTask<Void, Void, Boolean> asyncTask = new AsyncTask<Void, Void, Boolean>() {

private Exception error;

@Override
protected Boolean doInBackground(Void... arg) {
try {

PrivateKey pk = KeyChain.getPrivateKey(mContext, CERT_ALIAS);
X509Certificate[] chain = KeyChain.getCertificateChain(mContext, CERT_ALIAS);

byte[] data = "foobar".getBytes("ASCII");
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initSign(pk);
sig.update(data);
byte[] signed = sig.sign();

PublicKey pubk = chain[0].getPublicKey();
sig.initVerify(pubk);
sig.update(data);
boolean valid = sig.verify(signed);
Log.d(TAG, "signature is valid: " + valid);

if(valid) {
mPrivateKey = pk;
mCertificates = chain;
}

return valid;
} catch (Exception e) {
e.printStackTrace();
error = e;

return null;
}
}

@Override
protected void onPostExecute(Boolean valid) {
if (error != null) {
Toast.makeText(mContext, "Error: " + error.getMessage(),
Toast.LENGTH_LONG).show();

return;
} else {
Toast.makeText(mContext, "Signature is valid: " + valid,
Toast.LENGTH_SHORT).show();
mWebView.loadUrl("https://blablabla.com");
}


}
};

然后,您可以使用此功能提供证书:

@Override
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {
request.proceed(mPrivateKey, mCertificates);
}

我必须找到的最后一件事是如何只显示一次 choosePrivateKeyAlias 对话框(第一次)。

关于Android - 以编程方式从 keystore 检索证书(手动安装),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44952900/

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