如何使用Java卡中的公钥在Android应用程序中生成证书签名请求

时间:2016-08-08 20:01:42

标签: android eclipse certificate javacard csr

我想为Java卡中的密钥对生成证书。我想我应该在Android应用程序中生成pkcs#10请求并将其发送到Java卡,但是要生成pkcs#10我需要私钥,但是私钥是在Java卡中而不应该离开它。我该怎么办?

1 个答案:

答案 0 :(得分:2)

您无需从Java Card中提取私钥即可生成证书签名请求。只需要在CSR中包含公钥并使用私钥对其进行签名。

在这里Certificate enrollment process,您可以看到解释的一般流程以及Android设备的相关代码。

在你的情况下,过程可能就像这样

1)android设备从Java Card获取公钥,构建CSR并将内容发送到Java Card进行签名

2)Java Card使用私钥对CSR进行签名 3)android设备将签名的CSR发送到服务器

4)服务器使用CSR数据构建X509证书,使用CA私钥对其进行签名并将X509返回给客户端

5)Android设备接收证书并将其发送到Java Card进行存储

关于代码,链接的示例将有效添加以下修改

创建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;
        }
    }

卡中执行的代码执行签名与此类似

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