У меня есть открытый ключ и закрытый ключ (PKCS # 1: т.е. "НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ RSA") в качестве отдельных строковых входов. Эти ключи создаются с помощью следующих команд:
openssl req -new -x509 -keyout ca-key.pem -out ca-cert.pem -days 365 -passout pass:abcd123 -subj "/C=IN/ST=KAD/L=CAT/O=MIN/OU=OPQ/CN=*.xyz.com/[email protected]"
openssl genrsa -out client_private.key 2048
openssl req -new -sha256 -key client_private.key -subj "/C=IN/ST=KAD/L=CAT/O=MIN/OU=OPQ/CN=client.xyx.com" -out client.csr
openssl x509 -req -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client.crt -days 365 -sha256
openssl x509 -in client.crt -out client.pem -outform PEM
где содержимое client.csr предоставляется как строка открытого ключа, а содержимое client_private.key предоставляется как строка закрытого ключа
Теперь мне нужно создать хранилище ключей Java, добавить эти ключи и прагматично экспортировать в виде файла JKS. Я прошел через несколько ссылок и попробовал пример надувного замка, но я получаю ошибку ниже.
javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 2
Я пишу клиент kafka с включенным SSL и аутентификацией клиента, а для сервера установлены все необходимые параметры. создание хранилища доверия и командной строки хранилища ключей работает нормально. Но с помощью java-программы я не могу выполнить аутентификацию клиента (SSL работает нормально). Ниже фрагмент кода:
public void initClientAuthStore(String certString, String keyString)
throws GeneralSecurityException, IOException {
clientAuthStore = KeyStore.getInstance(getType());
clientAuthStore.load(null, getPassword().toCharArray());
Certificate clientCert = CertificateHandler.getCertificate(certString);
Certificate[] certificateChain = {trustStoreCertificate, clientCert};
log.debug("initClientAuthStore: Certificate is created");
// keyString.getBytes(StandardCharsets.UTF_8);
// clientAuthStore.setKeyEntry(
// keyStoreAlias, getPrivateKey(keyString), getPassword().toCharArray(), certificate);
PrivateKey privateKey = getPrivateKey(keyString);
clientAuthStore.setKeyEntry(
keyStoreAlias,
privateKey,
getPassword().toCharArray(),
certificateChain);
log.debug("initClientAuthStore: setting certificate and private key is success.");
}
public PrivateKey getPrivateKey(String key) throws IOException {
PemObject privateKeyObject;
PemReader pemReader =
new PemReader(
new InputStreamReader(
new ByteArrayInputStream(key.getBytes(Charset.forName("UTF-8"))),
StandardCharsets.UTF_8));
privateKeyObject = pemReader.readPemObject();
RSAPrivateCrtKeyParameters privateKeyParameter;
if (privateKeyObject.getType().endsWith("RSA PRIVATE KEY")) {
log.info("PRIVATE KEY TYPE: pkcs#1");
// PKCS#1 key
RSAPrivateKey rsa = RSAPrivateKey.getInstance(privateKeyObject.getContent());
privateKeyParameter =
new RSAPrivateCrtKeyParameters(
rsa.getModulus(),
rsa.getPublicExponent(),
rsa.getPrivateExponent(),
rsa.getPrime1(),
rsa.getPrime2(),
rsa.getExponent1(),
rsa.getExponent2(),
rsa.getCoefficient());
} else if (privateKeyObject.getType().endsWith("PRIVATE KEY")) {
log.info("PRIVATE KEY TYPE: pkcs#8");
// PKCS#8 key
privateKeyParameter =
(RSAPrivateCrtKeyParameters) PrivateKeyFactory.createKey(privateKeyObject.getContent());
} else {
throw new RuntimeException("Unsupported key type: " + privateKeyObject.getType());
}
JcaPEMKeyConverter jcaPemKeyConverter = new JcaPEMKeyConverter();
PrivateKey privateKey =
jcaPemKeyConverter.getPrivateKey(
PrivateKeyInfoFactory.createPrivateKeyInfo(privateKeyParameter));
log.info("PRIVATE KEY generated. {}", privateKey.getFormat());
return privateKey;
}
Получение ошибки ниже:
javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 2
Не уверен, что не так, и если мне не хватает какого-либо кодирования/декодирования и т. д. Я получаю закрытый ключ PKCS # 1 в качестве ввода строки, и мне приходится использовать надувной замок для преобразования в PKCS # 8, генерировать закрытый ключ и добавлять в хранилище. Примечание: закрытый ключ является содержимым client_private.key.