gpt4 book ai didi

java - 如何在 Java 中读取 sha1WithRSAEncryption 公共(public) DER key ?

转载 作者:行者123 更新时间:2023-12-01 10:54:29 25 4
gpt4 key购买 nike

openssl x509 -inform DER -text 

在我的 DER 文件中给出了这个问题底部的转储。

我尝试用以下方式阅读它:

static PublicKey getCertKey() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
URL keyUrl = Resources.getResource(LManager.class, "iid.der");
byte[] keyBytes = Resources.toByteArray(keyUrl);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}

我得到:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: ObjectIdentifier() -- data isn't an object ID (tag = -96)
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:205)
at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
....
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Caused by: java.security.InvalidKeyException: IOException: ObjectIdentifier() -- data isn't an object ID (tag = -96)
at sun.security.x509.X509Key.decode(X509Key.java:397)
at sun.security.x509.X509Key.decode(X509Key.java:403)
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:83)
at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)
... 25 more


Certificate:
Data:
Version: 3 (0x2)
Serial Number:
a9:cb:e1:41:03:30:df:c5
Signature Algorithm: sha1WithRSAEncryption
Issuer: REDACTED
Validity
Not Before: Jun 5 14:28:02 2014 GMT
Not After : Jun 5 14:28:02 2024 GMT
Subject: REDACTED
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:87:bd:18:df:ff:49:12:b6:92:76:e3:c9:21:b4:
86:8d:f2:a9:03:37:7b:64:c3:85:63:bc:0f:67:bc:
f9:76:6a:72:4e:f9:e2:01:52:a3:df:40:6d:3d:91:
99:70:a5:6a:66:c8:ef:1b:18:1d:91:5a:a5:b1:0b:
0b:81:fd:d7:27:22:86:fa:c3:8d:b4:93:d5:98:e4:
2d:08:20:6b:43:44:d6:ae:37:79:2e:bc:65:e4:c3:
71:c4:9c:5d:04:8d:8a:f4:a5:cc:96:52:f0:72:59:
8e:0a:b3:06:55:e3:65:fb:63:b5:d2:4b:5d:e1:38:
87:0b:e8:d2:c0:f8:7f:78:fd
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
25:D6:CC:08:15:CA:B6:F0:9C:59:DC:14:52:2C:EF:B5:41:76:51:38
X509v3 Authority Key Identifier:
keyid:25:D6:CC:08:15:CA:B6:F0:9C:59:DC:14:52:2C:EF:B5:41:76:51:38
DirName:/C=US/ST=Washington/L=Seattle/O=Amazon.com Inc./CN=ec2.amazonaws.com
serial:A9:CB:E1:41:03:30:DF:C5

X509v3 Basic Constraints:
CA:TRUE

最佳答案

首先,openssl -inform DER -text是一个错误。 openssl程序是一个运行一组函数之一的包装器,由第一个参数标识,在本例中必须是 x509 ,所以openssl x509 -inform DER -text

这是一个线索。您的文件是 X.509 证书,而不仅仅是公钥。一般的证书,特别是 X.509 证书,包含公钥,但这与公钥不同。

由于您的文件是 X.509 证书,因此请使用 CertificateFactory X.509 类型来读取它。模式类似:使用静态 .getInstance()获取工厂的方法然后使用 .generateCertificate()接受一些输入,这里是一个读取数据的流(直接从文件中读取数据,如果有缓冲,则从内存中读取数据),并生成 Certificate目的。 (注意 java.security.cert.Certificate 不是过时且已弃用的 java.security.Certificate ——某些 IDE 可能不会默认为好的 IDE。)

如果您想使用证书中的公钥进行加密或验证等操作,请调用 .getPublicKey()关于Certificate 。如果您想查看其他信息,例如特定于 X.509 的主题名称或扩展名,请转换 CertificateX509Certificate (也在 java.lang.security.cert 中)并使用 its additional methods .

此外:证书是使用 sha1withRSA签名的。公钥本身是 RSA key ,可以用于任何 RSA 操作 - 但由于证书声明该 key 属于 CA,因此应该使用相应的私钥仅用于签署证书和/或 CRL(由 KeyUsage 控制,如果存在,但除非您对其进行了编辑),因此除了验证这些证书和/或 CRL 之外,使用此公钥执行其他操作是无用的。由于 key 只有 1024 位,使用比 SHA1 更强的签名哈希会被浪费,除非 RSA-1024 已经被认为是不安全的(自 2014 年初以来)并且使用 SHA1-RSA < em>证书被认为存在风险,并在明年某个时候被禁止。

关于java - 如何在 Java 中读取 sha1WithRSAEncryption 公共(public) DER key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33696864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com