Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline sergey123  
#1 Оставлено : 21 января 2022 г. 10:03:11(UTC)
sergey123

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.02.2020(UTC)
Сообщений: 1
Российская Федерация
Откуда: Москва

Подскажите пожалуйста куда копать. Мне необходима одностороння аутентификация на сервере по алгоритму GOST.

Пишу клиента.
На клиент(где коннектюсь к серверу) должна стоять только JCP ведь?

Что сделано.
Поставил JCP.
Добавл в него сертификаты.
Корневой и промежуточные.
Добавил в explorer сертификаты.
Мой код.
package com.company;

public class Main {

public static void main(String[] args) {
String trustStorePath = "c:\\cert\\cert"; //тут лежаь сертфикаты (regservice.cer, root.cer,regservice.pfx)

String trustStorePassword = "12345678"; пароль от хранилища в JCP
String urlPath = "https://IPсервере:порт сервера";

ConnectionGOST connectionGOST = new ConnectionGOST(trustStorePath,trustStorePassword,urlPath);
boolean checkConnected = connectionGOST.getCheckConnection();

if(checkConnected) {
System.out.println("Connected GOST true...");
}
if(!checkConnected) {
System.out.println("Connected GOST false...");
}


// write your code here
}




}

класс
package com.company;

import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.ssl.util.TLSContext;

import javax.net.ssl.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.cert.X509Certificate;

public class ConnectionGOST {
static boolean checkConnection = false;//проверка подключения к системе

public boolean getCheckConnection() {
return checkConnection;
}

static {
disableSslVerification();
}
private static void disableSslVerification() {
try
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};

// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};

// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}

public static void setCheckConnection(HttpsURLConnection connection) throws Exception {

if (connection != null) {
checkConnection = true;

} else {
checkConnection = false;
}
}

public ConnectionGOST(String URLPathTrust,String passwordTrust, String URLConnect) {
//http://www.cryptopro.ru/forum2/default.aspx?g=posts&t=18270
////если не добавить принудительно не видит контейнер c сертификатами

Security.addProvider(new ru.CryptoPro.JCP.JCP());
Security.addProvider(new ru.CryptoPro.reprov.RevCheck());
Security.addProvider(new ru.CryptoPro.ssl.Provider());
Security.addProvider(new ru.CryptoPro.Crypto.CryptoProvider());
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");

try {
SSLContext ctx = TLSContext.initClientSSL(
null,
URLPathTrust,
passwordTrust,
null
);

SSLSocketFactory factory = ctx.getSocketFactory();
connect(factory, URLConnect);

} catch (Exception e) {
System.out.println(e.getMessage());
}
}

/**
* Функция устанавливает подключение по заданному адресу
* на основе переданного SSLSocketFactory.
*/
public static void connect (SSLSocketFactory factory,
String urlPath) throws Exception {

URL url = new URL(urlPath);

// Установка нового соединения с заданным адресом.
System.setProperty("javax.net.ssl.trustStoreType", JCP.CERT_STORE_NAME);
System.setProperty("javax.net.ssl.trustStore", "c:\\cert\\cert");
System.setProperty("javax.net.ssl.trustStorePassword", "12345678");
System.setProperty("javax.net.ssl.keyStoreType", JCP.HD_STORE_NAME);
System.setProperty("javax.net.ssl.keyStorePassword", "12345678");


SSLContext sc = SSLContext.getInstance("TLSv1.2"); //$NON-NLS-1$
sc.init(null, null, new java.security.SecureRandom());
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(sc.getSocketFactory());

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
// Задание для него требуемого SSLSocketFactory.
//factory
connection.setSSLSocketFactory(factory);
setCheckConnection(connection);

if (checkConnection){
/*
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();

System.out.println(response.toString());*/
}
// Вывод на экран содержимого запрошенной страницы.
printContent(connection);

// Разрыв соединения.
connection.disconnect();

}

/**
* Функция выводит на экран содержимое запрошенной страницы.
*
* @param connection Соединение.
* @throws Exception
*/
private static void printContent (HttpsURLConnection connection)
throws Exception {

if (connection != null) {

printStream(connection.getInputStream());
}

}

/**
* Функция выводит на экран содержимое потока.
*
* @param inputStream Поток.
* @throws Exception
*/
public static void printStream (InputStream inputStream) throws Exception {

BufferedReader br = new BufferedReader(new InputStreamReader(
inputStream, "utf-8"));

String input;
while ((input = br.readLine()) != null) {
System.out.println(input);
}

br.close();

}




}




Ошибка
java.security.cert.CertificateException: No subject alternative names presentWARNING: main, handling exception: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
Process finished with exit code 0





Offline Евгений Афанасьев  
#2 Оставлено : 21 января 2022 г. 10:16:48(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,601
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 613 раз в 580 постах
Здравствуйте.
"На клиент(где коннектюсь к серверу) должна стоять только JCP ведь?" - да, JCP и cpSSL.jar из его состава.
"No subject alternative names present" - ошибка сообщает, что в серверном сертификате отсутствует расширение alternative names, которое должно содержать ip/dns сервера.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.