2016-08-08 14 views
2

Javaカードで鍵ペアの証明書を生成したいとします。私はAndroidアプリでpkcs#10リクエストを生成してJavaカードに送信する必要があると思うが、pkcs#10を生成するために私は私用キーが必要だが、秘密鍵はJavaカードにあり、残してはいけない。どうしたらいいですか?Javaカードで公開鍵を使用してAndroidアプリで証明書署名リクエストを生成する方法

+1

これと同様です。 PKCS#10はそれを要求しません。もしそうならば、それは愚かでしょう。 Androidレイヤーでリクエストを生成し、Java Cardレイヤーに署名するだけです。 – Shuckey

+0

Offcurse正しいです。 Androidレイヤーでリクエストを生成し、Java Cardレイヤーに署名する方法を教えてください。歌ったデータを追加する方法は、ansroidアプリのjavaカードから返され、csrを持っていますか? –

答えて

2

証明書署名要求を生成するために、Java Cardから秘密鍵を抽出する必要はありません。公開鍵をCSRに含めるだけで、秘密鍵で署名する必要があります。

ここではCertificate enrollment processは、説明されている一般的なプロセスと、Android搭載端末の関連コードを確認できます。

のAndroidデバイスは、Javaカードから公開鍵を取得する)プロセスはこの

1のようになる可能性があなたのケースでは、)CSRを構築し、

2を署名するためにJavaカードにコンテンツを送信Javaのカードは、秘密鍵 3)のAndroidデバイスは、サーバー

4)サーバはCSRデータとX509証明書を構築するCA秘密鍵でサインそれに署名したCSRを送信してCSRに署名し、X509を返します。クライアントへ

5)のAndroidデバイスが証明書を受け取り、コードについて

を保存するためにJavaカードに送信し、リンクされた例は以下のように変更

がCSR

//Necessary to extract the public key from card 
PKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder(
       new X500Name(principal), keyPair.getPublic()); 
を作成して追加し、有効になります

spongycastle JCESigner

private static class JCESigner implements ContentSigner { 

    @Override 
    public byte[] getSignature() { 
     try { 
      //MUST be executed in the Java Card. In this point you can 
      //send the outputStream.toByteArray() to the card and sign it with the private key 

      //signature.update(outputStream.toByteArray()); 
      //return signature.sign(); 
     } catch (GeneralSecurityException gse) { 
      return null; 
     } 
    } 

署名を行うためにカードに実行されるコードは、秘密鍵は、Javaカードの層を残すことはありませんしなければならない1

Signature signature = Signature.getInstance(sigAlgo); 
signature.initSign(privateKey); 
signature.update(dataToSign); 
byte signedData = signature.sign(); 
+0

pedrofbありがとうございました –

+0

@pedrofb JavaCardがX509をカードに保存する方法を示すサンプルまたはウェブサイトがありますか? – codenamezero

関連する問題