В настоящее время я пишу программу 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;
}
}
Для SSL сертификатов, вы не должны включать 'KeyPurposeId.id_kp_timeStamping' в расширенном использования ключа. Вам также потребуется включить доменное имя в тему 'CN = yourdomain.com' – pedrofb