我想为Java卡中的密钥对生成证书。我想我应该在Android应用程序中生成pkcs#10请求并将其发送到Java卡,但是要生成pkcs#10我需要私钥,但是私钥是在Java卡中而不应该离开它。我该怎么办?
答案 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();