我使用以下命令使用openssl创建了一个rsa密钥对(以及一个自签名证书):
openssl req -x509 -newkey rsa:2048 -keyout privado-ssl.pem -out certificado-ssl.pem -days 365 -nodes
生成的文件及其内容的名称为:
privado-ssl.pem中:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA45TtNcik6ToMf6pgfcZhnYx8XlQKWuYLF0KyVNJIHn+H1Wp9
Tyhbjw9xSsZOPw4RiwgUdidmdH0GlTvm0AxieYjT2gZDFoYH+O9Zd2+KMpOFWhFU
(etc, etc...)
-----END RSA PRIVATE KEY-----
CERTIFICADO-ssl.pem中:
-----BEGIN CERTIFICATE-----
MIIEmDCCA4CgAwIBAgIJAOMPP5KhPi+WMA0GCSqGSIb3DQEBBQUAMIGOMQswCQYD
VQQGEwJQRTENMAsGA1UECBMETGltYTENMAsGA1UEBxMETGltYTETMBEGA1UEChMK
Tm92YXRyb25pYzEMMAoGA1UECxMDQ0FUMRgwFgYDVQQDEw9EYW5pZWwgQ2FsZGVy
(etc, etc ...)
-----END CERTIFICATE-----
由于我使用java.security。*类来签名和验证签名,我将privado-ssl.pem(我的私钥)转换为PKSC8格式,使用以下方法将DER enconding:
openssl pkcs8 -topk8 -outform DER -in privado-ssl.pem -out privado-ssl-pkcs8-der.pem -nocrypt
但是,当使用所述类来验证签名时,我在验证签名时会得到错误(但没有例外)。
这是我从私钥文件中获取私钥的方式(作为字节数组):
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
KeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
return keyFactory.generatePrivate(privateKeySpec);
证书:
InputStream certificateInputStream = new ByteArrayInputStream(certificateBytes);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
return certificateFactory.generateCertificates(certificateInputStream).get(0);
对于签名和验证,我使用的是SHA1withRSA算法而没有提供商。
我可能做错了什么?如果您需要更多信息,请告诉我。绝望在这里:)