2016-04-12 9 views
0

Если хранилище ключей, содержащее один или более PrivateKeyEntry, указано как хранилище доверия, будет ли JSSE создавать привязку доверия из сертификата конечного объекта в каждой из этих записей?Использует ли JSSE сертификат в PrivateKeyEntry как якорь доверия?

Другими словами, достаточно ли иметь сертификат под номером PrivateKeyEntry, если у нас есть одно хранилище ключей с доверенными и частными записями? Или, должен ли мы также добавить этот сертификат как TrustedCertificateEntry?

+0

Вы должны описать сценарий a, но более подробно – Robert

ответ

0

Это не имеет значения, где сертификат помещается либо под PrivateKeyEntry или под trustedCertEntry, JVM доверяет хозяина из сертификата в любом случае.

Протестировано локально.

Запустить локальный сервер с https и хранилищем ключей с только один PrivateKeyEntry.

и запустить клиент с кодом:

public static String getHTML(String urlToRead) throws Exception { 
    StringBuilder result = new StringBuilder(); 
    URL url = new URL(urlToRead); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setRequestMethod("GET"); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
    String line; 
    while((line = rd.readLine()) != null) { 
     result.append(line); 
    } 
    rd.close(); 
    return result.toString(); 
} 

public static void main(String[] args) throws Exception { 
    String testUrl="https://localhost/test"; 
    System.out.println(getHTML(testUrl)); 
} 

Без всякого:

Исключение в потоке "главный" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX Не удалось создать путь по пути: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти действительный путь сертификации для запрошенной цели

С доверенных сертификатами, который содержит только один PrivateKeyEntry (тот же файл JKS, который был использован для сервера в качестве хранилища ключей):

<!DOCTYPE....</html> 
+1

Это совершенно неверно. Это имеет значение. Java доверяет 'trustCertEntry' для входящих сертификатов и использует' privateKeyEntry' для * исходящих * сертификатов. – EJP

+0

EJP. Не важно, зачем нам использовать одно хранилище с обоими, прежде чем у меня всегда было два ... Но теперь это только одно, на самом деле вот почему возникает этот вопрос ... Я тоже всегда думал, что вы об этом , но это не так, тест показывает, что сервер может иметь только один PrivateKeyEntry, и этого будет достаточно, чтобы доверять. .. – Maksym

+0

Достаточно, чтобы сервер предоставил свой сертификат клиентам. Верят ли они, что это совершенно отдельный вопрос, и он не позволит сервару доверять любым сертификатам, если он использует этот KeyStore в качестве своего доверия. Очевидно, вы не пробовали этого или, возможно, не поняли свой собственный вопрос. – EJP

0

достаточно ли иметь сертификат под PrivateKeyEntry, если у нас есть один хранилище ключей как с доверенными, так и с частными лицами

У вас никогда не должно быть такого хранилища ключей.

или мы также должны добавить сертификат как trustedCertEntry, чтобы делать запросы к себе/другому узлу под прокси?

trustedCertEntry используется для входящих сертификатов. Запись закрытого ключа используется для исходящих сертификатов.

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

  1. Файл хранилища ключей, который содержит trustedCertEntryявляется доверенными, в смысле javax.net.ssl.trustStore, и он говорит JSSE, которые входящие сертификатов доверять, прямо или косвенно.

  2. Файл хранилища ключей, который содержит PrivateKeyEntry является хранилища ключей, в смысле javax.net.ssl.keyStore, и он говорит JSSE, какие сертификаты использовать для исходящих сертификатов.

  3. Файл хранилища ключей, который содержит оба, радикально искажен. Трастовый магазин - это просто список сертификатов, которым нужно доверять. Это не секрет. KeyStore содержит ваш секретный ключ, и он абсолютно секрет для всех. Конфликт между ними является серьезным нарушением безопасности.

Если неважно, почему бы было два разных типа входа?

Это не вопрос. Если у вас есть закрытый ключ, в котором должен быть доверенный сертификат, это означает, что у вас есть чужой секретный ключ, который является нарушением безопасности prima facie.

+0

отредактированный ответ. Знаете ли вы, что java поддерживает также формат keystore pkcs12, возможно, поэтому он не проверяет, является ли он trustedCertEntry или нет ... Поскольку pkcs12 не имеет доверия в CertEntry. – Maksym

+2

Возможно, это не так, но API Java KeyStore API и его поставщики определенно поддерживают наличие записей trustedCert и PrivateKey в одном хранилище, а также для некоторых типов (по крайней мере, JCEKS и BKS) записей SecretKey; privatekey * part * (или secretkey) зашифровывается и не нарушается по сути. И если он используется как truststore, он * включает * первый (сущностный) сертификат PrivateKeyEntry; см. http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/security/validator/KeyStores.java в методе getTrustedCerts(). –

+0

@ dave_thompson_085 Конечно, это неизбежно. Я не понимаю твое последнее предложение. Траст-центр содержит сертификаты: я не вижу, что примечательно. – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^