两个不同的私钥
Two different Private Keys
我正在尝试对 AuthnRequest 进行数字签名然后验证。
我使用以下命令生成了私钥和 public 密钥证书:
openssl genrsa -out privatekey.pem 2048
openssl req -new -x509 -key privatekey.pem -out publickey.cer -days 365
openssl pkcs12 -export -out public_privatekey.pfx -inkey privatekey.pem -in publickey.cer
通过以下命令将 PFX 转换为 JKS:
keytool -importkeystore -srckeystore public_privatekey.pfx -srcstoretype pkcs12
-destkeystore clientcert.jks -deststoretype JKS
并且我正在使用以下 java 代码访问该私钥条目和 public 密钥证书:
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystoreFile), "dps123!@#".toCharArray());
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("1", new KeyStore.PasswordProtection("dps123!@#".toCharArray()));
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) keyEntry.getCertificate();
我必须通过以下方式将私钥值打印到控制台:
String key = Base64.encode(keyEntry.getPrivateKey().getEncoded());
System.out.println(key);
当我比较String "key" 的内容和"privatekey.pem" 文件中的内容时,两者是不同的。是我理解不正确还是在代码中获取私钥值有问题?
String key = Base64.getEncoder().encodeToString(keyEntry.getPrivateKey().getEncoded());
很难说您的 java 提供商将使用哪种编码。另外,当你与"privatekey.pem"文件进行比较时,你如何获取内容?
我没有直接的解决方案,但有以下一些建议:
打印出你的 pem
> openssl -in privatekey.pem -outform <DER/PEM>
打印中的某处将是 base64 编码的私钥。
此外,请尝试检查您的 JCE 提供程序使用的编码。
私钥存储有多种格式。其中有PKCS#1 and PKCS#8。它们在加密算法和 ASN.1 结构上有所不同。此外,PKCS#8 还支持除 RSA 之外的其他密钥算法。
例如,这是未加密的 PKCS#8 文件的第一个字节的 ASN.1 转储:
0000 4BE: SEQUENCE {
0004 1: INTEGER 0
0007 D: SEQUENCE {
0009 9: OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
: (PKCS #1)
0014 0: NULL
: }
0016 4A8: OCTET STRING, encapsulates {
001A 4A4: SEQUENCE {
001E 1: INTEGER 0
0021 101: INTEGER
: 00 B3 17 E6 31 3C 36 24 ....1<6$
和 PKCS#1 格式的相同密钥(同样只有前几个字节,文件的其余部分基本上是原始密钥):
0000 4A4: SEQUENCE {
0004 1: INTEGER 0
0007 101: INTEGER
: 00 B3 17 E6 31 3C 36 24 ....1<6$
本网站对这两种格式有更详细的解释:
https://tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pem
Java 通常生成 PKCS#8 格式,而 OpenSSL 支持这两种格式并可以在它们之间转换:https://www.openssl.org/docs/apps/pkcs8.html
KeyStore Explorer 也可以生成、处理和转换这两种格式。
因此,如果您使用 OpenSSL 或 KSE 将 privatekey.pem
转换为 PKCS#8,它看起来应该与 System.out.println(key)
:
的输出相同
openssl pkcs8 -topk8 -in privatekey.pem -out privatekey.pkcs8 -nocrypt
我正在尝试对 AuthnRequest 进行数字签名然后验证。 我使用以下命令生成了私钥和 public 密钥证书:
openssl genrsa -out privatekey.pem 2048
openssl req -new -x509 -key privatekey.pem -out publickey.cer -days 365
openssl pkcs12 -export -out public_privatekey.pfx -inkey privatekey.pem -in publickey.cer
通过以下命令将 PFX 转换为 JKS:
keytool -importkeystore -srckeystore public_privatekey.pfx -srcstoretype pkcs12
-destkeystore clientcert.jks -deststoretype JKS
并且我正在使用以下 java 代码访问该私钥条目和 public 密钥证书:
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystoreFile), "dps123!@#".toCharArray());
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("1", new KeyStore.PasswordProtection("dps123!@#".toCharArray()));
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) keyEntry.getCertificate();
我必须通过以下方式将私钥值打印到控制台:
String key = Base64.encode(keyEntry.getPrivateKey().getEncoded());
System.out.println(key);
当我比较String "key" 的内容和"privatekey.pem" 文件中的内容时,两者是不同的。是我理解不正确还是在代码中获取私钥值有问题?
String key = Base64.getEncoder().encodeToString(keyEntry.getPrivateKey().getEncoded());
很难说您的 java 提供商将使用哪种编码。另外,当你与"privatekey.pem"文件进行比较时,你如何获取内容?
我没有直接的解决方案,但有以下一些建议:
打印出你的 pem
> openssl -in privatekey.pem -outform <DER/PEM>
打印中的某处将是 base64 编码的私钥。
此外,请尝试检查您的 JCE 提供程序使用的编码。
私钥存储有多种格式。其中有PKCS#1 and PKCS#8。它们在加密算法和 ASN.1 结构上有所不同。此外,PKCS#8 还支持除 RSA 之外的其他密钥算法。
例如,这是未加密的 PKCS#8 文件的第一个字节的 ASN.1 转储:
0000 4BE: SEQUENCE {
0004 1: INTEGER 0
0007 D: SEQUENCE {
0009 9: OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
: (PKCS #1)
0014 0: NULL
: }
0016 4A8: OCTET STRING, encapsulates {
001A 4A4: SEQUENCE {
001E 1: INTEGER 0
0021 101: INTEGER
: 00 B3 17 E6 31 3C 36 24 ....1<6$
和 PKCS#1 格式的相同密钥(同样只有前几个字节,文件的其余部分基本上是原始密钥):
0000 4A4: SEQUENCE {
0004 1: INTEGER 0
0007 101: INTEGER
: 00 B3 17 E6 31 3C 36 24 ....1<6$
本网站对这两种格式有更详细的解释: https://tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pem
Java 通常生成 PKCS#8 格式,而 OpenSSL 支持这两种格式并可以在它们之间转换:https://www.openssl.org/docs/apps/pkcs8.html
KeyStore Explorer 也可以生成、处理和转换这两种格式。
因此,如果您使用 OpenSSL 或 KSE 将 privatekey.pem
转换为 PKCS#8,它看起来应该与 System.out.println(key)
:
openssl pkcs8 -topk8 -in privatekey.pem -out privatekey.pkcs8 -nocrypt