Добавление сертификата в хранилище ключей с использованием кода Java

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

Теперь я хочу реализовать даже процесс получения файла сертификата и добавления его в мое хранилище ключей с использованием кода Java и без использования keytool или браузера для получения сертификата.

Может, кто-нибудь подскажет, как к этому подойти и что мне нужно делат

 Rohit12 апр. 2012 г., 15:03
К сожалению, поскольку я подключаюсь к внешнему серверу, я не могу контролировать их настройки.
 erickson10 апр. 2012 г., 00:54
Какой цели это служит? Я не могу представить, почему вы хотели бы сделать это.
 erickson12 апр. 2012 г., 02:31
Вам не нужен сертификат сервера в вашем хранилище ключей. Если сервер настроен правильно, все, что вам нужно, это «корень» цепочки сертификатов сервера.
 Rohit11 апр. 2012 г., 17:32
Я пытаюсь проверить содержимое формы на своем внутреннем сервере, прежде чем отправлять запрос клиента обратно на сервер hp. Я полагаю, что это предотвратит любое вмешательство в оплату через браузер, и мой сервер сможет выполнить все ожидаемые проверки вместо того, чтобы веб-сайт hp делал это. Однако для этого мне нужно получить сертификат сервера, используя код Java для выполнения рукопожатия. Я не хочу каждый раз вручную загружать сертификат и помещать его в хранилище ключей. Я хочу, чтобы код выполнял эту часть автоматически ..
 erickson12 апр. 2012 г., 17:27
Вы должны понимать, что при этом вы утрачиваете способность аутентифицировать сервер. Вы не знаете, отправляете ли вы платежную информацию в HP или мошеннику. Любой законный платежный процессор правильно настроит свой сервис, чтобы вы могли его аутентифицировать. В противном случае использование TLS совершенно бессмысленно.

Ответы на вопрос(3)

Эт, кажется, делает именно то, что вы хотите.

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

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 с активным сервером каталогов.

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

 Nick Grealy30 окт. 2015 г., 00:01
@ Sandro - ссылка 410 GONE
 Rohit11 апр. 2012 г., 16:09
Спасибо за ссылку Сандро ... Это действительно помогло.
 Sandro30 окт. 2015 г., 10:00
 Sandro09 апр. 2012 г., 20:59
Google для "Ява скачать сертификат с сайта" я нашелэт. Кажется, он делает именно то, что вы хотите.
 Rohit09 апр. 2012 г., 20:40
Спасибо за ваш ответ, Сандро. У меня есть дополнительный вопрос, пожалуйста. Как вы получаете сертификат для конкретного URL-адреса?

SSL-Utils-андроид чтобы сделать это.

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

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

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

https: //docs.oracle.com/cd/E19509-01/820-3503/ggfgo/index.htm https: //www.sslshopper.com/article-most-common-java-keytool-keystore-commands.htm

javac -cp .:/home/ec2-user/velu/*: QuickStart.java
java -cp .:/home/ec2-user/velu/*:  QuickStart


[[email protected] velu]$ ls
QuickStart.class  commons-codec-1.2.jar       input-payload.txt          logback-core-1.1.3.jar
QuickStart.java   commons-httpclient-3.1.jar  httpclient-4.5.jar  jdk-8u101-linux-x64.rpm    slf4j-api-1.7.12.jar
certificates      commons-logging-1.2.jar     httpcore-4.4.1.jar  logback-classic-1.1.3.jar



import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class QuickStart {

        public static void main(String[] args) throws Exception {
                System.setProperty("javax.net.ssl.keyStore", "/home/user/velu/certificates/myownOut.pkcs12");
                System.setProperty("javax.net.ssl.keyStorePassword", "password");

                System.setProperty("javax.net.ssl.trustStore", "/home/user/velu/certificates/myTrustStore");
                System.setProperty("javax.net.ssl.trustStorePassword", "password");

System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "debug");

                CloseableHttpClient httpclient = HttpClients.createDefault();

                HttpClientParams params = new HttpClientParams();
                params.setConnectionManagerClass(MultiThreadedHttpConnectionManager.class);
                HttpClient client = new HttpClient(params);

                HttpMethod m = new PostMethod("https://velu.org:443/Services/com/Echo");

                m.setRequestHeader("content-type", "application/xml");
                //m.setRequestHeader("Accept", "application/xml");
//              m.setRequestHeader("SOAPAction", "Echo");
                try {

                        ((PostMethod) m).setRequestEntity(new StringRequestEntity(getFileContent(), "application/xml", "UTF-8"));
                        System.out.println("VELU EXCUTING");
                        client.executeMethod(m);
                        if (m.getStatusCode() == 200) {
                                System.out.println("VELU RECEIVED:" + m.getResponseBodyAsString());
                        }
                } catch (IOException e) {
                        System.out.println(e.toString());
                } finally {
                        m.releaseConnection();
                }

        }

        public static String getFileContent() {

                BufferedReader br = null;
                String fileContent = "";
                try {

                        br = new BufferedReader(new FileReader(
                                        "/home/user/velu/input-payload.txt")); // Note that this file format should be proper.
                        String sCurrentLine = "";
                        while ((sCurrentLine = br.readLine()) != null) {
                                fileContent += sCurrentLine;
                        }
                        System.out.println(fileContent);

                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        try {
                                if (br != null)
                                        br.close();
                        } catch (IOException ex) {
                                ex.printStackTrace();
                        }
                }
                return fileContent;
        }

Ваш ответ на вопрос