15

Вопрос по ssl-certificate, java, https – Добавление сертификата в хранилище ключей с использованием кода Java

Я пытаюсь установить соединение https с помощью файла сертификата сервера .cer. Я могу вручную получить файл сертификата с помощью браузера и поместить его в хранилище ключей с помощью keytool. Затем я могу получить доступ к хранилищу ключей с ...

Вы должны понимать, что вы утрачиваете возможность аутентифицировать сервер, делая это. Вы не знаете, отправляете ли вы платежную информацию в HP или мошеннику. Любой законный платежный процессор правильно настроит свой сервис, чтобы вы могли его аутентифицировать. В противном случае использование TLS совершенно бессмысленно.

от erickson

Какой цели это служит? Я не могу представить, почему вы хотели бы сделать это.

от erickson

Вам не нужен сертификат сервера в вашем хранилище ключей. Если сервер настроен правильно, все, что вам нужно, это & quot; root & quot; цепочки сертификатов сервера.

от erickson

Я пытаюсь проверить содержимое формы на своем внутреннем сервере, прежде чем отправлять запрос клиента обратно на сервер hp. Я полагаю, что это предотвратит любое вмешательство в оплату через браузер, и мой сервер сможет выполнить все ожидаемые проверки вместо того, чтобы веб-сайт hp делал это. Однако для этого мне нужно получить сертификат сервера, использующий код Java для выполнения рукопожатия. Я не хочу каждый раз вручную загружать сертификат и помещать его в хранилище ключей. Я хочу, чтобы код сделал эту часть автоматически ..

от Rohit

К сожалению, поскольку я подключаюсь к внешнему серверу, я не могу контролировать их настройки.

от Rohit

2 ответа

0

Я написал небольшую библиотекуSSL-Utils-андроид сделать это.

Вы можете просто загрузить любой сертификат, указав имя файла из каталога активов.

Использование:

OkHttpClient client = new OkHttpClient();
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer");
client.setSslSocketFactory(sslContext.getSocketFactory());
13

Редактировать:это кажется, делает именно то, что вы хотите.

Используя следующий код, можно добавить хранилище доверия во время выполнения.

import java.io.InputStream;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

public class SSLClasspathTrustStoreLoader {
    public static void setTrustStore(String trustStore, String password) throws Exception {
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        InputStream keystoreStream = SSLClasspathTrustStoreLoader.class.getResourceAsStream(trustStore);
        keystore.load(keystoreStream, password.toCharArray());
        trustManagerFactory.init(keystore);
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustManagers, null);
        SSLContext.setDefault(sc);
    }
}

Я использовал этот код для установки безопасного соединения LDAP с активным сервером каталогов.

это также может быть полезным, внизу есть класс, который может импортировать сертификат во время выполнения.

Похожие вопросы