То, чего я пытался добиться, - это использовать уже предоставленный закрытый ключ и сертификат для подписи сообщения, которое отправлялось куда-то, что требовалось для того, чтобы убедиться, что сообщение исходит от меня (закрытые ключи подписываются, пока открытые ключи шифруются).
Итак, если у вас уже есть файл .key и файл .crt?
Попробуйте это:
Шаг 1: Преобразование ключа и сертификата в файл .p12
openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -name alias -out yourconvertedfile.p12
Шаг 2: Импортировать ключ и создать файл .jsk с помощью одной команды
keytool -importkeystore -deststorepass changeit -destkeystore keystore.jks -srckeystore umeme.p12 -srcstoretype PKCS12
Шаг 3: В вашей Java:
char[] keyPassword = "changeit".toCharArray();
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream keyStoreData = new FileInputStream("keystore.jks");
keyStore.load(keyStoreData, keyPassword);
KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("alias", entryPassword);
System.out.println(privateKeyEntry.toString());
Если вам нужно подписать какую-либо строку с помощью этого ключа, сделайте следующее:
Шаг 1: преобразовать текст, который вы хотите зашифровать
byte[] data = "test".getBytes("UTF8");
Шаг 2: Получить закрытый ключ в кодировке base64
keyStore.load(keyStoreData, keyPassword);
//get cert, pubkey and private key from the store by alias
Certificate cert = keyStore.getCertificate("localhost");
PublicKey publicKey = cert.getPublicKey();
KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);
//sign with this alg
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));
sig.initVerify(keyPair.getPublic());
sig.update(data);
System.out.println(sig.verify(signatureBytes));
Ссылка:
- Как импортировать существующий сертификат x509 и закрытый ключ в хранилище ключей Java для использования в SSL?
- http://tutorials.jenkov.com/java-cryptography/keystore.html
- http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm
- Как подписать строку закрытым ключом
Финальная программа
public static void main(String[] args) throws Exception {
byte[] data = "test".getBytes("UTF8");
// load keystore
char[] keyPassword = "changeit".toCharArray();
KeyStore keyStore = KeyStore.getInstance("JKS");
//System.getProperty("user.dir") + "" < for a file in particular path
InputStream keyStoreData = new FileInputStream("keystore.jks");
keyStore.load(keyStoreData, keyPassword);
Key key = keyStore.getKey("localhost", keyPassword);
Certificate cert = keyStore.getCertificate("localhost");
PublicKey publicKey = cert.getPublicKey();
KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));
sig.initVerify(keyPair.getPublic());
sig.update(data);
System.out.println(sig.verify(signatureBytes));
}