Java 两个不同的私钥

Java 两个不同的私钥,java,x509certificate,keystore,private-key,Java,X509certificate,Keystore,Private Key,我正在尝试数字签名,然后验证AuthnRequest。 我使用以下命令生成了私钥和公钥证书: 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

我正在尝试数字签名,然后验证AuthnRequest。 我使用以下命令生成了私钥和公钥证书:

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代码访问私钥条目和公钥证书:

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);

当我比较字符串“key”和“privatekey.pem”文件中的内容时,两者都是不同的。这是我没有正确理解的问题,还是在代码中获取私钥值时出现问题?

很难说您的java提供商将使用哪种编码。另外,当您与“privatekey.pem”文件进行比较时,您是如何获得内容的

String key = Base64.getEncoder().encodeToString(keyEntry.getPrivateKey().getEncoded());
我没有直接的解决方案,但有以下几点建议:

打印出你的pem

> openssl -in privatekey.pem -outform <DER/PEM>
>openssl-in-privatekey.pem-outform
打印中的某个地方将是base64编码的私钥


另外,请检查JCE提供程序使用的编码。

很难说java提供程序将使用哪种编码。另外,当您与“privatekey.pem”文件进行比较时,您是如何获得内容的

我没有直接的解决方案,但有以下几点建议:

打印出你的pem

> openssl -in privatekey.pem -outform <DER/PEM>
>openssl-in-privatekey.pem-outform
打印中的某个地方将是base64编码的私钥


此外,请尝试检查JCE提供程序使用的编码。

有几种格式可用于私钥存储。其中包括和。它们在加密算法和ASN.1结构上有所不同。此外,PKCS#8还支持RSA以外的其他密钥算法

例如,这是未加密PKCS#8文件的第一个字节的ASN.1转储:


私钥存储有几种格式。其中包括和。它们在加密算法和ASN.1结构上有所不同。此外,PKCS#8还支持RSA以外的其他密钥算法

例如,这是未加密PKCS#8文件的第一个字节的ASN.1转储:


它与“Base64.encode(keyEntry.getPrivateKey().getEncoded())”对我所做的操作相同。它与“Base64.encode(keyEntry.getPrivateKey().getEncoded())对我所做的操作相同。我已经在文本编辑器中打开了privatekey.pem文件。在您的文本编辑器中,它的内容类似于“----开始RSA私钥-----结束RSA私钥----”显示在的位置,它看起来像MIIEuwIBADANBgkqhkiG9w0BAQEF………o25O4os===是的,它看起来就是这样。但这里有一个问题,您所谈论的.pem文件中的值与我从Java代码加载的文件中的值不同。我从相同的密钥库和KeyEntry加载了它。用openssl以DER和PEM格式打印出来怎么样?它会产生不同的输出吗?它还将有助于使用keytool本身打印输出。keytool-list-v-keystore keystore.jks。java可能使用与pem文件不同的编码。这取决于您的JCE提供商。我已经在文本编辑器中打开了privatekey.pem文件。在您的文本编辑器中,它的内容类似于“----开始RSA私钥-----结束RSA私钥----”显示在的位置,它看起来像MIIEuwIBADANBgkqhkiG9w0BAQEF………o25O4os===是的,它看起来就是这样。但这里有一个问题,您所谈论的.pem文件中的值与我从Java代码加载的文件中的值不同。我从相同的密钥库和KeyEntry加载了它。用openssl以DER和PEM格式打印出来怎么样?它会产生不同的输出吗?它还将有助于使用keytool本身打印输出。keytool-list-v-keystore keystore.jks。java可能使用与pem文件不同的编码。这取决于您的JCE Provider哦,是的,我运行了您提到的命令,私钥内容现在完全相同。这是否意味着私钥与PKCS#1和PKCS#8不同,或者密钥保持不变,只是用于私钥存储的格式?@MuhammadAlmanfaroq密钥本身不会更改,PKCS#1和#8只是不同的存储格式。@Omikron Hi,我得到了一个base64编码的RSA公钥字符串,我怎么知道它是PKCS#1还是PKCS#fromat?事实上,我得到了两个格式字符串,我可以用different方法将其解码为java RSApublickey对象,我想确定一个方法中的哪种格式并进行翻译~哦,是的,我运行了你提到的命令,私钥内容现在是相同的。这是否意味着私钥与PKCS#1和PKCS#8不同,或者密钥保持不变,只是用于私钥存储的格式?@MuhammadAlmanfaroq密钥本身不会更改,PKCS#1和#8只是不同的存储格式。@Omikron Hi,我得到了一个base64编码的RSA公钥字符串,我怎么知道它是PKCS#1还是PKCS#fromat?实际上,我得到了两个格式字符串,我可以用different方法将其解码为java RSApublickey对象,我想确定一个方法中的哪种格式并进行翻译~
0000  4A4: SEQUENCE {
0004    1:   INTEGER 0
0007  101:   INTEGER    
         :     00 B3 17 E6 31 3C 36 24    ....1<6$
openssl pkcs8 -topk8 -in privatekey.pem -out privatekey.pkcs8 -nocrypt