如何在 Android 应用程序中使用 Java 卡中的 public 密钥生成证书签名请求
How to generate certificate sign request in Android app with public key in Java card
我想为 Java 卡中的密钥对生成证书。我想我应该在 Android 应用程序中生成 pkcs#10 请求并将其发送到 Java 卡,但是要生成 pkcs#10 我需要私钥,但是私钥在 Java 卡中并且不应该离开它。我该怎么做?
您不需要从 Java 卡中提取私钥来生成证书签名请求。只需要在 CSR 中包含 public 密钥并使用私钥对其进行签名。
在这里 您可以看到解释的一般过程和 Android 设备涉及的代码。
在你的情况下,过程可能是这样的
1) android设备从Java卡中获取public密钥,构建CSR并将内容发送到Java卡进行签名
2) Java Card 使用私钥签署 CSR
3) android 设备将签名的 CSR 发送到服务器
4) 服务器使用 CSR 数据构建 X509 证书,使用 CA 私钥和 returns 将 X509 签名给客户端
5) Android设备收到证书后发送到Java卡进行存储
关于代码,链接示例添加以下修改将有效
创建 CSR
//Necessary to extract the public key from card
PKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder(
new X500Name(principal), keyPair.getPublic());
海绵城堡 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();
我想为 Java 卡中的密钥对生成证书。我想我应该在 Android 应用程序中生成 pkcs#10 请求并将其发送到 Java 卡,但是要生成 pkcs#10 我需要私钥,但是私钥在 Java 卡中并且不应该离开它。我该怎么做?
您不需要从 Java 卡中提取私钥来生成证书签名请求。只需要在 CSR 中包含 public 密钥并使用私钥对其进行签名。
在这里
在你的情况下,过程可能是这样的
1) android设备从Java卡中获取public密钥,构建CSR并将内容发送到Java卡进行签名
2) Java Card 使用私钥签署 CSR 3) android 设备将签名的 CSR 发送到服务器
4) 服务器使用 CSR 数据构建 X509 证书,使用 CA 私钥和 returns 将 X509 签名给客户端
5) Android设备收到证书后发送到Java卡进行存储
关于代码,链接示例添加以下修改将有效
创建 CSR
//Necessary to extract the public key from card
PKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder(
new X500Name(principal), keyPair.getPublic());
海绵城堡 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();