2016-03-30 5 views
2

В приведенном ниже коде 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); 
} 

ответ

2

Ваша подпись (без каламбуров) метода verifySignature - это рассказ о том, что ваша реализация не может работать. Для проверяемого Signature процессору необходимо получить доступ как к подписанным данным, так и к подписи. Какой ваш метод не обеспечивает:

private void verifySignature(String publicKeyPath, byte[] signature) 

Я предлагаю вам изменить его, чтобы быть симметричным методом generateSignatureForMessage, то есть:

  1. Вы кормите подпись объект содержания он должен работать (содержание которые должны быть подписаны для подписания, подписанное содержание для проверки подписи)
  2. Вы спрашиваете объект подписи для выполнения работ (sign или verify)

Что добавить к реализации родственным:

private void verifySignature(String publicKeyPath, byte[] signature, byte[] signedContent) throws Exception { 
    Certificate cert = loadCertificate(publicKeyPath); 
    Signature s = Signature.getInstance("SHA256withRSA"); 
    s.initVerify(cert); 
    s.update(signedContent); 
    if(s.verify(signature)) { 
     System.out.println("signature signed by matching key"); 
    } else { 
     System.out.println("signature NOT signed by matching key"); 
    } 
} 
+0

Спасибо! Я должен был понять, что вам нужно будет также применить исходные данные. – extorn

Смежные вопросы