2016-11-29 4 views
0

В настоящее время я пишу программу Java, используя BouncyCastle, которая генерирует сертификат SSL X509 с помощью пары ключей RSA.X509 RSA bouncy castle sign and verify plain text in Java

Я смог успешно создать сертификат SSL, но также хочу, чтобы возможность затем подписывать произвольный простой текст и с этой подписью проверять право собственности на ключи, проверяя подпись на простой текст.

методы должны выглядеть следующим образом:

protected String SignData(String privateKey, String text) 
{ 
    //return a signature 
} 

и

protected boolean verifySignature(String text, String signature, String pubKey) 
{ 
    //return either true or false depending on whether the signature is valid or not 
} 

Я благополучно самозаверенный сертификат SSL, используя следующие:

protected X509Certificate generateCert() 
{ 
    try 
    { 
     Security.addProvider(new BouncyCastleProvider()); 
     // generate a key pair 
     KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); 
     keyPairGenerator.initialize(4096, new SecureRandom()); 
     KeyPair keyPair = keyPairGenerator.generateKeyPair(); 
     // build a certificate generator 
     X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); 
     X500Principal dnName = new X500Principal("cn=example"); 
     // add some options 
     certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis())); 
     certGen.setSubjectDN(new X509Name("dc=name")); 
     certGen.setIssuerDN(dnName); // use the same 
     // yesterday 
     certGen.setNotBefore(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000)); 
     // in 2 years 
     certGen.setNotAfter(new Date(System.currentTimeMillis() + 2 * 365 * 24 * 60 * 60 * 1000)); 
     certGen.setPublicKey(keyPair.getPublic()); 
     certGen.setSignatureAlgorithm("SHA256WithRSAEncryption"); 
     certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_timeStamping)); 

     // finally, sign the certificate with the private key of the same KeyPair 
     X509Certificate cert = certGen.generate(keyPair.getPrivate(), "BC"); 

     return cert; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

Для SSL сертификатов, вы не должны включать 'KeyPurposeId.id_kp_timeStamping' в расширенном использования ключа. Вам также потребуется включить доменное имя в тему 'CN = yourdomain.com' – pedrofb

ответ

0

Найдено решение :

в знак Зодиака:

 Signature rsaSign = Signature.getInstance("SHA256withRSA", "BC"); 
     rsaSign.initSign(pair.getPrivate()); 
     rsaSign.update(plaintext.getBytes("UTF-8")); 
     byte[] signature = rsaSign.sign(); 
     return signature; 

Для проверки:

 rsaVerify = Signature.getInstance("SHA256withRSA", "BC"); 
     rsaVerify.initVerify(pubKey); 
     rsaVerify.update(plaintext.getBytes("UTF-8")); 
     return rsaVerify.verify(signature); 
Смежные вопросы