Keytool создает доверенный самоподписанный сертификат

Я пытаюсь использовать (java) keytool для создания самозаверяющего сертификата, но когда я пытаюсь его использовать, я получаю следующее исключение (полное исключение см. Внизу).

...<5 more exceptions above this>
Caused by: sun.security.validator.ValidatorException: No trusted certificate found
        at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304)
        at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107)
        at sun.security.validator.Validator.validate(Validator.java:203)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
        at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)
        ... 22 more

Я знаю, что могу обойти это с помощью этого кода:

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;

HostnameVerifier hv = new HostnameVerifier() {
    public boolean verify(String urlHostName, SSLSession session) {
        System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
        return true;
    }
};

HttpsURLConnection.setDefaultHostnameVerifier(hv);

(источник)

Но меня не интересуют эти решения, потому что я думаю, что это создает дыру в безопасности. (поправьте меня, если я ошибаюсь).

Может кто-то указать мне верное направление? Сейчас я тестирую локально, так что довольно легко что-то изменить. У меня есть доступ к коду сервера, коду клиента и к файлу .keystore.

Обновлять

Я пытался использовать один файл .keystore как для клиента, так и для сервера, но в надежде упростить свои проблемы я создал server.keystore (см. ниже) и client.truststore (см. ниже). Я достаточно уверен, что сертификаты верны, но если кто-то может проверить, я был бы признателен.

server.keystore

hostname[username:/this/is/a/path][711]% keytool -list -keystore server.keystore -v
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: hostname
Creation date: Feb 4, 2010
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname
Issuer: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname
Serial number: 4b6b0ea7
Valid from: Thu Feb 04 13:15:03 EST 2010 until: Wed May 05 14:15:03 EDT 2010
Certificate fingerprints:
         MD5:  81:C0:3F:EC:AD:5B:7B:C4:DA:08:CC:D7:11:1F:1D:38
         SHA1: F1:78:AD:C8:D0:3A:4C:0C:9A:4F:89:C0:2A:2F:E2:E6:D5:13:96:40
         Signature algorithm name: SHA1withDSA
         Version: 3


*******************************************
*******************************************

client.truststore

hostname[username:/this/is/a/path][713]% keytool -list -keystore client.truststore -v
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: mykey
Creation date: Feb 4, 2010
Entry type: trustedCertEntry

Owner: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname
Issuer: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname
Serial number: 4b6b0ea7
Valid from: Thu Feb 04 13:15:03 EST 2010 until: Wed May 05 14:15:03 EDT 2010
Certificate fingerprints:
         MD5:  81:C0:3F:EC:AD:5B:7B:C4:DA:08:CC:D7:11:1F:1D:38
         SHA1: F1:78:AD:C8:D0:3A:4C:0C:9A:4F:89:C0:2A:2F:E2:E6:D5:13:96:40
         Signature algorithm name: SHA1withDSA
         Version: 3


*******************************************
*******************************************

Обновлять

Я подумал, что было бы полезно включить все исключение:

javax.xml.soap.SOAPException: java.io.IOException: Could not transmit message
        at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:115)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:66)
        at com.alcatel.tpapps.common.utils.SOAPClient.execute(SOAPClient.java:193)
        at com.alcatel.tpapps.common.utils.SOAPClient.main(SOAPClient.java:280)
Caused by: java.io.IOException: Could not transmit message
        at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:192)
        at org.jboss.ws.core.client.SOAPRemotingConnection.invoke(SOAPRemotingConnection.java:77)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:106)
        ... 3 more
Caused by: org.jboss.remoting.CannotConnectException: Can not connect http client invoker. sun.security.validator.ValidatorException: No trusted certificate found.
        at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:368)
        at org.jboss.remoting.transport.http.HTTPClientInvoker.transport(HTTPClientInvoker.java:148)
        at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:141)
        at org.jboss.remoting.Client.invoke(Client.java:1858)
        at org.jboss.remoting.Client.invoke(Client.java:718)
        at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:171)
        ... 5 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1584)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:877)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1089)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1116)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1100)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:857)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:288)
        ... 10 more
Caused by: sun.security.validator.ValidatorException: No trusted certificate found
        at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304)
        at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107)
        at sun.security.validator.Validator.validate(Validator.java:203)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
        at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)
        ... 22 more

person Community    schedule 04.02.2010    source источник


Ответы (4)


Вам нужно будет «установить доверие» между вашим сервером и клиентом (я предполагаю, что вам нужно только выполнить аутентификацию на стороне сервера). Это потому, что вы используете самоподписанные сертификаты. Это включает в себя импорт сертификата вашего сервера в хранилище доверенных сертификатов клиента:

На стороне сервера:

keytool -keystore <keystore file> -alias <alias> -export -file <certfilename>.cert

Скопируйте файл .cert на сторону клиента, а затем:

keytool -keystore <truststore file> -alias <alias> -import -file <certfilename>.cert
person Armadillo    schedule 04.02.2010
comment
+1: Спасибо за четкий ответ. Я почти уверен, что делаю именно это, за исключением того, что я настраиваю и клиент, и сервер на использование одного и того же файла хранилища ключей. То есть: server.keystore. Я считаю, что хранилище ключей может выступать как в качестве хранилища ключей, так и в качестве хранилища доверенных сертификатов. Я использую мой как хранилище ключей и доверенных сертификатов как для сервера, так и для клиента. Это законно? - person sixtyfootersdude; 04.02.2010
comment
Я сам не пробовал эту конфигурацию, но она может работать. Вам придется использовать разные псевдонимы для материала ключа и сертификата, поскольку они служат разным целям (и оба должны быть там). Кажется, вы знаете, что эта установка хороша только для целей тестирования, а не для производства... - person Armadillo; 04.02.2010
comment
Это означает, что мне нужно будет иметь один trustCertEntry и один privateKeyEntry в моем одном файле .keystore? Если у меня по-прежнему будут проблемы, я попытаюсь создать для клиента отдельный файл .keystore. Спасибо за вашу помощь. - person sixtyfootersdude; 04.02.2010
comment
Armadillo, Спасибо за отзыв, добавил обновление в вопрос. Я думаю, что лучше перейти к более простой конфигурации (одно хранилище ключей для сервера, одно хранилище доверия для клиента), как вы предложили. Однако я все еще получаю то же исключение. Возможно, теперь, когда у меня есть более четкий пример (выше), мне будет легче определить мою проблему. - person sixtyfootersdude; 04.02.2010
comment
Не уверен, что это реальная проблема, но у вас есть clientAuth=true в вашем соединителе порта 8443. Это потребовало бы установления доверия и в другом направлении (клиент -> сервер). В вашем порту 443 этого нет. Каково ваше требование? - person Armadillo; 04.02.2010
comment
Привет, Армадилло, я изменил это на false, но у меня все еще есть то же исключение. Спасибо за указатель - person sixtyfootersdude; 04.02.2010
comment
ХОРОШО. Итак, вы можете опубликовать свой клиентский код, чтобы я мог взглянуть? Кроме того, вы можете указать свой браузер на тот же порт? Что вы получаете? (вы должны иметь возможность запрашивать WSDL вашего веб-сервиса) - person Armadillo; 04.02.2010
comment
Ваш вопрос привел меня к интересному наблюдению. Мой клиент пытался получить доступ: sco-up:443/common/ws/A2 . Но мне было интересно, не в этом ли проблема. Я изменил этот адрес на sco-up:443/asdfasdhahdhadsfkjlasd (то есть мусор). И у меня такое же исключение. Мне это кажется очень странным. Собираюсь изучить это. - person sixtyfootersdude; 05.02.2010
comment
В ответ на ваш вопрос, если я перейду к sco-up:443/common/ws/A2 в браузере я получаю простой текст: HTTP GET не поддерживается. (Что мне кажется логичным). Если я перехожу к sco-up:443/asdfasdfkd/asdfads: я получаю что-то вроде HTML таблица с заголовком: HTTP-статус 404 — /asdfasdfkd/asdfadsf. - person sixtyfootersdude; 05.02.2010
comment
Как я могу запросить WSDL для веб-службы? Должен ли я сделать это, даже если он находится в httpS? Спасибо и счастливой пятницы. - person sixtyfootersdude; 05.02.2010
comment
На самом деле, я совершил глупую ошибку. Я не перезапускал свой сервер должным образом, поэтому он не перечитывал хранилища ключей. Спасибо всем за помощь, хороших выходных. - person sixtyfootersdude; 06.02.2010

Вы не можете совместно использовать хранилище ключей между клиентом и сервером, потому что хранилище ключей содержит закрытый ключ. При аутентификации клиент пропускает сертификаты с закрытыми ключами. Как сказано выше, вам необходимо развернуть хранилище доверенных сертификатов на стороне клиента.

Сертификаты в хранилище ключей ведут себя по-разному, в зависимости от того, как вы их создали или импортировали.

Тип записи импортированного сертификата (видимый при подробном перечислении всего хранилища ключей с помощью -list -v) — «trustedCertEntry». Тип записи сгенерированного сертификата — «PrivateKeyEntry». При экспорте сертификата вы экспортируете только его открытый ключ и необязательную ссылку на его издателя.

Похоже, вам нужно экспортировать самоподписанный сертификат в хранилище ключей в качестве доверенного сертификата в хранилище доверенных сертификатов (имена здесь имеют смысл).

Я бы не стал этого делать, потому что реализации SSL/TLS, вероятно, не поддерживают его. С точки зрения реального мира, это все равно, что развернуть полностью секретный закрытый ключ от Verisign на каком-то малоизвестном веб-сервере для подписи случайных страниц, в то время как единственная цель этого закрытого ключа — оставаться в сейфе и подписывать другие сертификаты. Разработчики SSL/TLS, вероятно, не будут загрязнять свой код таким вариантом использования, и в любом случае расширение сертификата «KeyUsage» может ограничить использование сертификата подписью, предотвращая шифрование.

Вот почему я предлагаю перестроить цепочку сертификатов для вашего теста.

Документация по keytool содержит интересную часть о создании цепочки (команда -gencert), но это очень схематичный пример, который не охватывает отношения между хранилищем ключей и доверенным хранилищем. Я расширил его, чтобы имитировать сторонний центр сертификации.

Временное хранилище their-keystore.jks представляет собой центр выдачи сертификатов. Я загружаю его цепочкой сертификатов ca2 -> ca1 -> ca, где ca считается корневым сертификатом. Цепочка появляется с каждым некорневым сертификатом (а именно ca1 и ca2), ссылающимся на своего издателя как Certificate[2]. Обратите внимание, что каждый сертификат является "PrivateKeyEntry".

Затем я загружаю my-keystore.jks этими сертификатами в следующем порядке: ca, ca1, ca2. Я импортирую ca с опцией -trustcacerts, что означает, что он становится корневым сертификатом. В my-keystore.jks каждый импортированный сертификат теперь является "trustedCertEntry", что означает наличие только открытого ключа. Отношения выдачи отображаются только в поле «Эмитент», но это нормально, поскольку доверительные отношения имели наибольшее значение во время импорта.

На данный момент my-keystore.jks имитирует среду, содержащую несколько доверенных сертификатов, например новую JRE. their-keystore.jks имитирует владельцев этих сертификатов, которые имеют право подписывать запросы на сертификаты.

Я тоже: я создаю самозаверяющий сертификат e1 в my-keystore.jks, подписываю его ca2 (через their-keystore.jks) и импортирую подписанный результат обратно в my-keystore.jks. e1 по-прежнему является «PrivateKeyEntry» (поскольку его закрытый ключ остается в my-keystore.jks), но теперь я построил следующую цепочку: e1 -> ca2 -> ca1. Кажется, что ca1 -> ca подразумевается, а ca является центром сертификации.

Чтобы создать доверенное хранилище, я просто импортирую сертификаты ca, ca1 и ca2 так же, как и для my-keystore.jks. Обратите внимание, что я не импортирую e1, так как ожидаю, что клиент SSL/TLS проверит его на соответствие ca2.

Я думаю, что это довольно близко к тому, как все работает в реальном мире. Что здесь хорошо, так это то, что у вас есть полный контроль над сертификатами и нет зависимости от cacerts JRE.

Вот код, воплощающий то, что я говорю, на практике. Кажется, работает с Jetty (клиент и сервер), если вы отключите список отзыва сертификатов (тема оставлена ​​​​на другой день).

#!/bin/bash

rm  their-keystore.jks 2> /dev/null
rm  my-keystore.jks    2> /dev/null
rm  my-truststore.jks  2> /dev/null

echo "===================================================="
echo "Creating fake third-party chain ca2 -> ca1 -> ca ..."
echo "===================================================="

keytool -genkeypair -alias ca  -dname cn=ca                           \
  -validity 10000 -keyalg RSA -keysize 2048                           \
  -ext BasicConstraints:critical=ca:true,pathlen:10000                \
  -keystore their-keystore.jks -keypass Keypass -storepass Storepass

keytool -genkeypair -alias ca1 -dname cn=ca1                          \
  -validity 10000 -keyalg RSA -keysize 2048                           \
  -keystore their-keystore.jks -keypass Keypass -storepass Storepass

keytool -genkeypair -alias ca2 -dname cn=ca2                          \
  -validity 10000 -keyalg RSA -keysize 2048                           \
  -keystore their-keystore.jks -keypass Keypass -storepass Storepass


  keytool -certreq -alias ca1                                            \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass   \
| keytool -gencert -alias ca                                             \
    -ext KeyUsage:critical=keyCertSign                                   \
    -ext SubjectAlternativeName=dns:ca1                                  \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass   \
| keytool -importcert -alias ca1                                         \
    -keystore   their-keystore.jks -keypass Keypass -storepass Storepass

#echo "Debug exit" ; exit 0

  keytool -certreq -alias ca2                                           \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
| keytool -gencert -alias ca1                                           \
    -ext KeyUsage:critical=keyCertSign                                  \
    -ext SubjectAlternativeName=dns:ca2                                 \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
| keytool -importcert -alias ca2                                        \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass

keytool -list -v -storepass Storepass -keystore their-keystore.jks


echo  "===================================================================="
echo  "Fake third-party chain generated. Now generating my-keystore.jks ..."
echo  "===================================================================="
read -p "Press a key to continue."

# Import authority's certificate chain

  keytool -exportcert -alias ca                                         \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
| keytool -importcert -trustcacerts -noprompt -alias ca                 \
    -keystore  my-keystore.jks -keypass Keypass -storepass Storepass

  keytool -exportcert -alias ca1                                        \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
| keytool -importcert -noprompt -alias ca1                              \
    -keystore  my-keystore.jks -keypass Keypass -storepass Storepass

  keytool -exportcert -alias ca2                                        \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
| keytool -importcert -noprompt -alias ca2                              \
    -keystore  my-keystore.jks -keypass Keypass -storepass Storepass

# Create our own certificate, the authority signs it.

keytool -genkeypair -alias e1  -dname cn=e1                        \
  -validity 10000 -keyalg RSA -keysize 2048                        \
  -keystore my-keystore.jks -keypass Keypass -storepass Storepass

  keytool -certreq -alias e1                                            \
    -keystore my-keystore.jks -keypass Keypass -storepass Storepass     \
| keytool -gencert -alias ca2                                           \
    -ext SubjectAlternativeName=dns:localhost                           \
    -ext KeyUsage:critical=keyEncipherment,digitalSignature             \
    -ext ExtendedKeyUsage=serverAuth,clientAuth                         \
    -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
| keytool -importcert -alias e1                                         \
    -keystore my-keystore.jks -keypass Keypass -storepass Storepass

keytool -list -v  -storepass Storepass -keystore  my-keystore.jks

echo "================================================="
echo "Keystore generated. Now generating truststore ..."
echo "================================================="
read -p "Press a key to continue."

  keytool -exportcert -alias ca                                        \
    -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
| keytool -importcert -trustcacerts -noprompt -alias ca                \
    -keystore my-truststore.jks -keypass Keypass -storepass Storepass

  keytool -exportcert -alias ca1                                       \
    -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
| keytool -importcert -noprompt -alias ca1                             \
    -keystore my-truststore.jks -keypass Keypass -storepass Storepass

  keytool -exportcert -alias ca2                                       \
    -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
| keytool -importcert -noprompt -alias ca2                             \
    -keystore my-truststore.jks -keypass Keypass -storepass Storepass

keytool -list -v  -storepass Storepass -keystore  my-truststore.jks

rm  their-keystore.jks 2> /dev/null
person Community    schedule 20.07.2013
comment
Весь этот ответ основан на заблуждении о том, что самозаверяющие сертификаты не работают и/или не поддерживаются, и/или небезопасно пропускают закрытый ключ. Поскольку все это неправда, ответ бессмысленен и не касается заданного вопроса. - person user207421; 23.02.2017
comment
Да ладно, @EJP Я использую самозаверяющие сертификаты в своих сценариях, поэтому я предполагаю, что они работают. Что я предлагаю шестидесятифутовому чуваку, так это попытаться воспроизвести его проблему с хорошо понятной цепочкой доверия. - person Laurent Caillette; 24.02.2017
comment
Слезай сам. В своем пятом абзаце вы сказали, что «реализации SSL/TLS, вероятно, не поддерживают его», а последующие замечания, по-видимому, подразумевают, что вы считаете, что сертификаты содержат закрытые ключи. - person user207421; 24.02.2017
comment
Нет, вы неправильно поняли суть. Когда я пишу, это похоже на развертывание полностью секретного закрытого ключа от Verisign на каком-то малоизвестном веб-сервере для подписи случайных страниц, при этом не задействовано хранилище доверенных сертификатов. Я четко упомянул расширение «KeyUsage», которое устанавливает разницу между центром сертификации и аутентификацией доменного имени. Это все о подписи сертификата (на стороне хранилища ключей, если хотите), и хранилище доверенных сертификатов не задействовано. [продолжение...] - person Laurent Caillette; 24.02.2017
comment
[...продолжение] При запуске HTTPS-клиента на Java произошел сбой из-за того, что хранилище доверенных сертификатов импортировало только самозаверяющий сертификат для аутентификации доменного имени. Но это удалось после импорта самозаверяющего сертификата, подписывающего сертификат для аутентификации доменного имени. - person Laurent Caillette; 24.02.2017
comment
В вашем четвертом и пятом абзацах черным по белому написано, что «реализации SSL/TLS, вероятно, не поддерживают его», где «это» означает «экспорт [инг] самозаверяющего сертификата в вашем хранилище ключей в качестве доверенного сертификата в вашем трастовый магазин». MS SSL, JSSE и OpenSSL, наиболее часто используемые реализации на планете, поддерживают именно это. - person user207421; 24.02.2017
comment
Упомянутый вами абзац немного неясен, и я могу ошибаться в своих предположениях о реализациях SSL/TLS (отсюда и условное выражение, которое я использовал). Но вы ошибаетесь, заключая, что я считаю, что сертификаты содержат закрытые ключи. Вы, наверное, пропустили 3-й абзац, где я написал: Когда вы экспортируете сертификат, вы экспортируете только его открытый ключ. - person Laurent Caillette; 24.02.2017

Вы не должны этого делать. Хранилище ключей является строго частным. Если вы расскажете об этом кому-либо, вы нанесете фатальный ущерб безопасности. Нет смысла делать такие вещи только для того, чтобы заставить их работать, потому что они не работают — это просто брешь в системе безопасности. Вы должны сделать это правильно: экспортировать из хранилища ключей сервера в хранилище доверенных сертификатов клиента и из хранилища ключей клиента, если оно есть, в хранилище ключей сервера.

person user207421    schedule 15.02.2010

Я не понимаю. Используете ли вы хранилище ключей сервера с клиентом? Каков именно ваш вариант использования? Вы пытаетесь настроить взаимную аутентификацию?

Если да, то вы на неправильном пути здесь. Вам понадобится хранилище ключей клиента (для самозаверяющего сертификата клиента и закрытого ключа) и хранилище доверенных сертификатов клиента (для "автономного" самозаверяющего сертификата сервера, т. е. без его закрытого ключа). Оба отличаются от хранилища ключей сервера.

person Pascal Thivent    schedule 04.02.2010
comment
Я подумал, что могу использовать хранилище ключей сервера с клиентом для тестирования. Это гарантирует, что у клиента есть сертификат сервера. Хотя, возможно, клиенту нужен собственный самоподписанный сертификат... - person sixtyfootersdude; 04.02.2010
comment
Как я уже сказал, это зависит от того, что вы хотите сделать (что мне не ясно). Если вы хотите реализовать взаимную аутентификацию, клиенту тоже нужен свой сертификат. И в этом случае я не думаю, что вы можете использовать хранилище ключей сервера в качестве хранилища доверия клиента. - person Pascal Thivent; 04.02.2010