java - 在 java 中使用 Bouncy CaSTLe 从 CSR 文件获取公钥

标签 java rsa bouncycastle public-key-encryption

我有一个客户端生成的 CSR 文件,我想从中提取公钥。 他们提供了 KeyStore Explorer 软件来检查它。

但是我无法使用该工具从中提取公钥。如何使用 BC 使用 Java 程序从 CSR 文件中获取公钥?

CSR 是使用 RSA 2048 生成的,使用带有 RSA 的 SHA1。

从该工具中,我可以看到公钥的 ASN1 数据,但看不到 ASCII 格式。 至少我如何使用 ASN1 数据使用 BC 获取 ASCII 格式的公钥

SEQUENCE
{
    SEQUENCE
    {
        OBJECT IDENTIFIER=RSA encryption (1.2.840.113549.1.1.1)
        NULL
    }
    BIT STRING= //BITS HERE
}

最佳答案

这取决于您所说的“ASCII 格式”是什么意思。但通常你可以这样做:

// Read the CSR
FileReader fileReader = new FileReader("/path/to/your.csr");
PemReader pemReader = new PemReader(fileReader);

PKCS10CertificationRequest csr = 
    new PKCS10CertificationRequest(pemReader.readPemObject().getContent());

pemReader.close();
fileReader.close();

// Write the Public Key as a PEM-File
StringWriter output = new StringWriter();
PemWriter pemWriter = new PemWriter(output);

PemObject pkPemObject = new PemObject("PUBLIC KEY", 
    csr.getSubjectPublicKeyInfo().getEncoded());

pemWriter.writeObject(pkPemObject);
pemWriter.close();

System.out.println(output.getBuffer());

// Extract the Public Key as "RSAKeyParameters" so you can use for
// encryption/signing operations.
RSAKeyParameters pubkey = 
    (RSAKeyParameters)PublicKeyFactory.createKey(csr.getSubjectPublicKeyInfo());

这就是您将获得的:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxlRixVjOXAmUQ2zORREO
VSQDQejyjWzT3bDznPltiPMwM3SOmPmZyrB8jF3iFvzdFge1QG2WdDj7PzmysXNL
/1xRa0efWv8nURx1eV86hvU6ThNqY3WPyYYXSjTcN74uhGSJo7d5zG6JSL4Cj+l4
RO+nh/5Pa8438ufS+9hXndKPFT2aub9roKysxWpsctpNoOIjfyxkLv9Z9sqxuggG
nwYkwYmoDjPAQp2gRpCp7Hw5F6jSkA33NR5S/aPdyvzKZDbuoRdAl2sTubL1TLG3
nC6tetGsmFRRkNiJjPSNtbXXtN6RB2eJL0epyaFFLksFBaL6nvYIgB1uqFroUY15
2QIDAQAB
-----END PUBLIC KEY-----

我已经使用最新版本的 BC-provider 对此进行了测试。您需要“提供者”和“PKIX/PKCS...”jar(否则您必须处理已弃用的 API 调用)。

关于java - 在 java 中使用 Bouncy CaSTLe 从 CSR 文件获取公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14995711/

相关文章:

java - Java 中的冒泡排序 ArrayIndexOutOfBounds

java - 从文件中读取字符串时卡住

c# - 如何仅从比特币签名中获取 ECDSA 公钥? ... SEC1 4.1.6 (mod p) 域上曲线的 key 恢复

android - Android 上的 SSL(通过 BouncyCaSTLe)

java - 使用 BouncyCaSTLe 在 Java 中使用 ECIES 进行加密

java - 删除具有空值的 treeMap 条目

java - 如何从 oracle 网站下载 JDK 的特定更新?

ssl - 从私钥中提取公钥

.NET RSA.Create(String algName) : What goes in algName?

java - 使用 rsa 公钥字符串(不是文件),当我加密时,出现错误 "invalid key format"