Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Resttemplate. Как добавить publickey.pem ? / 7 сообщений из 7, страница 1 из 1
06.12.2020, 15:14
    #40025026
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Resttemplate. Как добавить publickey.pem ?
Добрый день!
Подскажите, пожалуйста, как построить обращение к внешнему RestAPI с использованием публичного ключа формата pem.
командой cURL успешно подключаюсь. Формат команды:
Код: powershell
1.
2.
3.
4.
curl -O -k --cert-type pem --key pubkey.pem \
-d "param1=value1&param2=value2" \
-H "Content-Type: application/x-www-form-urlencoded" \
-X POST url



Во всем разобрался, кроме как к Resttemplate привязать ключ.
В сети есть много примеров, но они с использованием сертификата. Сертификата у меня нет. Есть только публичный и приватный ключ. Приватный генерирую подпись, публичный нужен, на сколько я понимаю, для расшифровки ответа сервера.
...
Рейтинг: 0 / 0
06.12.2020, 15:22
    #40025029
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Resttemplate. Как добавить publickey.pem ?
IgorD,
В решении шел этим путем, и зашел в тупик:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
/*---------------------------------restTemplateKey--------------------------------------------------------*/
    public RestTemplate restTemplateKey(String certName, String certPass) throws Exception{
        InputStream resourceAsStream = new FileInputStream(certName);
        byte[] certAndKey = ByteStreams.toByteArray(resourceAsStream);
        byte[] keyBytes = parseDERFromPEM(certAndKey, "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----");

        PublicKey key = generatePublicKeyFromDER(keyBytes);


        KeyStore clientStore = KeyStore.getInstance("JKS");
        clientStore.load(null);
        clientStore.setKeyEntry("key-alias", key, null, null);


        SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
        sslContextBuilder.setProtocol("TLS");

        sslContextBuilder.loadKeyMaterial(clientStore, certPass.toCharArray());
        sslContextBuilder.loadTrustMaterial(new TrustSelfSignedStrategy());

        SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build());
        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(sslConnectionSocketFactory)
                .build();
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        requestFactory.setConnectTimeout(10000); // 10 seconds
        requestFactory.setReadTimeout(10000); // 10 seconds
        return new RestTemplate(requestFactory);
    }

/*-------------------------------generatePublicKeyFromDER------------------------------------------*/
    private PublicKey generatePublicKeyFromDER(byte[] keyBytes)  throws Exception {

        String modulusBase64 = new String(keyBytes);
        BASE64Decoder b64dec = new BASE64Decoder();
        String exponentBase64 = "65537";
        RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(new BigInteger    (1,
                b64dec.decodeBuffer(modulusBase64)),
                new BigInteger(1,b64dec.decodeBuffer(exponentBase64)));

        KeyFactory publicKeyFactory = KeyFactory.getInstance("RSA");

        return publicKeyFactory.generatePublic(publicKeySpec);

    }

/*---------------------------parseDERFromPEM------------------------------------------------------------*/
    private byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) {
        String data = new String(pem);
        String[] tokens = data.split(beginDelimiter);
        tokens = tokens[1].split(endDelimiter);
        return DatatypeConverter.parseBase64Binary(tokens[0]);
    }




получаю ошибку Cannot store non-PrivateKeys
Похоже этот путь заведомо тупиковый....
...
Рейтинг: 0 / 0
06.12.2020, 16:08
    #40025037
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Resttemplate. Как добавить publickey.pem ?
IgorD,

java.security.cert.CertificateFactory#generateCertificate(InputStream is) (т.е. CertificateFactory.getInstance("X.509")...)
...
Рейтинг: 0 / 0
07.12.2020, 00:23
    #40025114
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Resttemplate. Как добавить publickey.pem ?
Насколько я припоминаю handshake происходит в момент связи на уровне протокола т.е. до того как ваш аппликейшин кол сработает через REST.

Посмотрите вот эту довольно старую статью там главное есть лог хендшейка возможно это то что Вы пытаетесь осмыслить

https://vyatkins.wordpress.com/2013/11/19/java-base-ssl-connection-to-tomcat-with-server-and-client-certifications/
...
Рейтинг: 0 / 0
07.12.2020, 07:50
    #40025138
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Resttemplate. Как добавить publickey.pem ?
Sergunka,
Думаю да. Верно. Ему нужно сначала без телеги построить hello world томкате и изучить ssl.
Счас из каждого утюга https. Силой загоняют в стадо.
...
Рейтинг: 0 / 0
07.12.2020, 16:28
    #40025326
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Resttemplate. Как добавить publickey.pem ?
PetroNotC Sharp,
До подключения дело не доходит. Ошибка появляется на моменте попытки привязки ключа
Код: java
1.
clientStore.setKeyEntry("key-alias", key, null, null);
...
Рейтинг: 0 / 0
07.12.2020, 17:36
    #40025359
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Resttemplate. Как добавить publickey.pem ?
IgorD,
Я о том что выше
Sergunka сказал.
Всякие там рукопожатия лучше изучать на демке клиент и томкат. Как вариант.
А не сразу в сбербанк лезть или в телегу.
Имхо
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Resttemplate. Как добавить publickey.pem ? / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]