Всем привет.
В общем есть у меня сервер Nats и мне нужно к нему прицепится, nats использует шифрование канала без авторизации клиентов по ключу.
Есть соответственно серверный ключ rootCA и приватный ключ, в лучших традициях java делаю keystore.jks и truststore.jks, в первый сую приватный и серверный сертификаты в последний RootCA
Ниже кусок кода для примера..
public void testReadKeystore(){
final File keyStore = new File("/path/nats/keystore.jks");
final File trustStore = new File("/path/nats/truststore.jks");
KeyManagerFactory kmf = null;
TrustManagerFactory tmf = null;
try {
kmf = KeyManagerFactory.getInstance("SunX509", "SunJSSE");
final char[] keyPassPhrase = "b596d6ecb46769bc52acdf0a38d5ee26168e44a0".toCharArray();
final KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keyStore), keyPassPhrase);
kmf.init(ks, keyPassPhrase);
} catch (NoSuchAlgorithmException | CertificateException | KeyStoreException | UnrecoverableKeyException |
NoSuchProviderException| IOException e){
log.error("Error in opening keystore => " + e.getMessage());
}
//setup and load trust store
try{
final char[] trustPassPhrase = "b596d6ecb46769bc52acdf0a38d5ee26168e44a0".toCharArray();
final KeyStore tks = KeyStore.getInstance("JKS");
tks.load(new FileInputStream(trustStore), trustPassPhrase);
tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE");
tmf.init(tks);
}catch (NoSuchAlgorithmException | CertificateException | KeyStoreException | NoSuchProviderException |
IOException e){
log.error("Error in opening truststore => " + e.getMessage());
}
// create context
try {
if (kmf != null && tmf != null){
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
ConnectionFactory connectionFactory = new ConnectionFactory();
//connectionFactory.setConnectionName(appName);
//connectionFactory.setPingInterval(2000);
connectionFactory.setSecure(true);
connectionFactory.setTlsDebug(true);
connectionFactory.setSSLContext(sslContext);
//connectionFactory.setConnectionTimeout(2000);
connectionFactory.setVerbose(true);
connectionFactory.setServers("nats://key@host.com:4222");
//connectionFactory.setReconnectBufSize(60000);
//connectionFactory.setReconnectAllowed(true);
connectionFactory.createConnection();
} else {
log.error("Keystore and trust store not initialized...");
}
} catch (NoSuchAlgorithmException | IOException | TimeoutException | KeyManagementException e) {
log.error(e.getMessage());
}
}
В итоге получаем
11:06:50.330 [main] DEBUG io.nats.client.ConnectionImpl - Connecting to nats://key@host:4222
11:06:50.550 [main] DEBUG io.nats.client.ConnectionImpl - Connected to nats://key@host:4222
11:06:51.117 [main] ERROR SslTlsComplexTest - sun.security.validator.ValidatorException: Extended key usage does not permit use for TLS server authentication
Собственно вопрос.
Extended key usage does not permit use for TLS server authentication <- как с этим бороться.
PS. Из того, что я понял есть трабла если TLS сертификат wildcard.
Я не силен в криптографии и разобрать абстрактные повествования о причине данной ошибки у меня не выходит. Может есть сведущий?