web-dev-qa-db-ja.com

Android KeyStore-RSAプライベートキーを保存する方法

Webサービス(自分で作成)から、base64文字列でエンコードされたRSAPrivateKey PKCS#8を受け取ります。私のAndroidアプリは、このキーを電話のどこかに安全に保存する必要があります。

Androidの4.3バージョンから、新しいKeyStoreAPIを使用してキーを保存することが可能です。キーを格納するために必要な仕様でKeyPairを生成する方法を示す コードaxampleの記事 を見つけました。そして、キーを回復した後。

// generate a key pair
Context ctx = getContext();
Calendar notBefore = Calendar.getInstance()
Calendar notAfter = Calendar.getInstance();
notAfter.add(1, Calendar.YEAR);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx)
            .setAlias("key1")
            .setSubject(
                    new X500Principal(String.format("CN=%s, OU=%s", alais,
                            ctx.getPackageName())))
            .setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime())
            .setEndDate(notAfter.getTime()).build();

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpGenerator.initialize(spec);
KeyPair kp = kpGenerator.generateKeyPair();

// in another part of the app, access the keys
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("key1", null);
RSAPublicKey pubKey = (RSAPublicKey)keyEntry.getCertificate().getPublicKey();
RSAPrivateKey privKey = (RSAPrivateKey) keyEntry.getPrivateKey();

しかし、既存のキーを保存する方法がわかりません。誰か助けてもらえますか?前もって感謝します

15
FUGAZI

KeyStoreには、秘密鍵を証明書(偽の自己署名証明書であっても)と一緒に保存する必要があります。キーをAndroidKeyStoreに保存するには、次の手順に従う必要があります。

  1. base64 PKCS#8をデコードして、PrivateKeyインスタンスを取得します
  2. webサービスが秘密鍵とともに証明書(または証明書チェーン)を送信するか、PKCS#8blobにも公開鍵が含まれています。
  3. 必要に応じて、秘密鍵の証明書を生成する必要があります。 BouncyCastle ライブラリはこれを行うことができます(コードサンプルは ここ にあります)。

これで、キーをキーストアに追加できます。

PrivateKey myKey = getKey();
X509Certificate certificate = getCertificate();
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
keystore.setKeyEntry("anAlias", myKey, null, new Certificate[] { certificate });
9
Jcs