В приведенном ниже коде Java 8 появляется сообщение «подпись НЕ подписана с помощью соответствующего ключа», и я не понимаю, почему. Любые идеи, почему его не проверяют?Проверка подписи на Java с использованием открытого ключа OpenSSL и сертификата
Моя лучшая догадка заключается в том, что это связано с тем, как с помощью openssl создается секретный ключ или сертификат, но из моего исследования кажется, что я использую правильные команды. То, что я пытаюсь сделать, это загрузить закрытый ключ, подписать сообщение, а затем проверить подпись на открытый ключ, содержащийся в сертификате x509.
privatekey.pkcs8.key файл был создан с помощью MS Windows на основе OpenSSL с помощью следующих команд:
openssl.exe" genrsa -out privatekey.pem 1024
openssl pkcs8 -in privatekey.pem -inform PEM -topk8 -out privatekey.pkcs8.key -outform DER -nocrypt
publickey.cer также сгенерированные с помощью MS Windows на основе OpenSSL, используя следующие команды:
openssl req -x509 -key privatekey.pem -days 365 -out publickey.cer -new
Java-код, который я использую в попытке проверки подписи состоит в следующем:
public static void main(String[] args) throws Exception{
new TestSigs();
}
public TestSigs {
byte[] signature = generateSignatureForMessage("src/cryptoprivatekey.pkcs8.key", "Hello");
verifySignature("src/crypto/publickey.cer", signature);
}
public byte[] generateSignatureForMessage(String privateKeyPath, String message) throws Exception {
RSAPrivateKey privKey = loadPrivateRSAKeyFromFile(privateKeyPath);
Signature s = Signature.getInstance("SHA256withRSA");
s.initSign(privKey);
s.update(ByteBuffer.wrap(message.getBytes()));
byte[] signature = s.sign();
return signature;
}
private void verifySignature(String publicKeyPath, byte[] signature) throws Exception {
Certificate cert = loadCertificate(publicKeyPath);
Signature s = Signature.getInstance("SHA256withRSA");
s.initVerify(cert);
if(s.verify(signature)) {
System.out.println("signature signed by matching key");
} else {
System.out.println("signature NOT signed by matching key");
}
}
private Certificate loadCertificate(String filename) throws FileNotFoundException, CertificateException {
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
return cf.generateCertificate(bis);
}
private RSAPrivateKey loadPrivateRSAKeyFromFile(String keyPath) throws Exception {
byte[] privKeyBytes = loadRSAKeyBytesFromFile(keyPath);
KeyFactory kFact = KeyFactory.getInstance("RSA");
KeySpec ks = new PKCS8EncodedKeySpec(privKeyBytes);
return (RSAPrivateKey)kFact.generatePrivate(ks);
}
Спасибо! Я должен был понять, что вам нужно будет также применить исходные данные. – extorn