2016-12-07 7 views
2

Я пытаюсь установить 2-стороннее соединение TSL с веб-сервисом с использованием Java, мне был предоставлен сертификат pfx с закрытым ключом и цепочкой сертификатов из 3 сертификатов. Вот Java-код с помощью Spring Framework:Ключ-ключ клиента Обмен ключами с использованием цепочки сертификатов

@Bean 
public Client weatherClient(Jaxb2Marshaller marshaller) throws Exception { 
    Client client = new Client(); 
    client.setDefaultUri("....."); 
    client.setMarshaller(marshaller); 
    client.setUnmarshaller(marshaller); 

    KeyStore ks = KeyStore.getInstance("PKCS12"); 
    ks.load(keyStore.getInputStream(), keyStorePassword.toCharArray()); 

    LOGGER.info("Loaded keystore: " + keyStore.getURI().toString()); 
    System.out.println("Loaded keystore: " + keyStore.getURI().toString()); 

    keyStore.getInputStream().close(); 


    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());//KeyManagerFactory.getDefaultAlgorithm() 
    keyManagerFactory.init(ks, keyStorePassword.toCharArray()); 

    KeyStore ts = KeyStore.getInstance("PKCS12"); 
    ts.load(trustStore.getInputStream(), trustStorePassword.toCharArray());// 
    LOGGER.info("Loaded trustStore: " + trustStore.getURI().toString()); 
    System.out.println("Loaded trustStore: " + trustStore.getURI().toString()); 

    trustStore.getInputStream().close(); 

    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(ts); 

    HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender(); 
    messageSender.setKeyManagers(keyManagerFactory.getKeyManagers()); 
    messageSender.setTrustManagers(trustManagerFactory.getTrustManagers()); 
    client.setMessageSender(messageSender); 
    return client; 
} 

До сих пор я получаю ClientHello и и ServerHello, который посылает сертификат, и я получаю Found доверенный сертификат. Тогда есть запрос на сертификат, который не находит никаких свидетельств

*** CertificateRequest 
Cert Types: RSA, DSS 
Cert Authorities: 
<CN=Thawte SSL CA, O="Thawte, Inc.", C=US> 
.... 
.... 
*** ServerHelloDone 
Warning: no suitable certificate found - continuing without client authentication 
*** Certificate chain 
<Empty> 
*** 

Я добавил сертификаты индивидуально в LIB/безопасность/cacerts. Кажется, что первый обмен сертификатами происходит из хранилища cacerts, поскольку я получаю такое же поведение, если это единственное место, где добавлен сертификат. Кажется, что запрос ищет цепочку сертификатов, но не может ее найти, хотя я импортировал его в объект KeyStore как pkcs12 с закрытым ключом и цепочкой сертификатов. Любая помощь будет оценена

UPDATE

Я получаю отказ квитирования после ClientKeyExchange я предположил, что это связано с выше предупреждения, но я мог бы быть неправильно об этом.

*** ClientKeyExchange, RSA PreMasterSecret, TLSv1 
main, WRITE: TLSv1 Handshake, length = 269 
SESSION KEYGEN: 
PreMaster Secret: 
.... 
.... 
0000: B0 E2 38 5E 40 4E 7C C5       ..8^@N.. 
Server write IV: 
0000: 44 40 45 E1 82 45 15 9B       [email protected] 
main, WRITE: TLSv1 Change Cipher Spec, length = 1 
*** Finished 
verify_data: { 109, 220, 225, 98, 98, 233, 48, 215, 61, 50, 58, 207 } 
*** 
main, WRITE: TLSv1 Handshake, length = 40 
main, READ: TLSv1 Alert, length = 2 
main, RECV TLSv1 ALERT: fatal, handshake_failure 
%% Invalidated: [Session-1, SSL_RSA_WITH_3DES_EDE_CBC_SHA] 

UPDATE

Взаимная аутентификация работает, если добавить хранилище ключей в качестве переменной -Djavax.net.ssl.keyStore= , но с добавлением из хранилища ключей в качестве переменной, я получаю следующее. Хранилище ключей и хранилище доверенных сертификатов, указанные в коде встречается и цепочка сертификатов и доверие магазин показаны в отладить

*** 
found key for : devcert 
chain [0] = [ 
[ 
    Version: V3 ...... 

*** 
adding as trusted cert: 
    Subject: 

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

keyStore is : 
keyStore type is : jks 
keyStore provider is : 
init keystore 
init keymanager of type SunX509 
trustStore is: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts 
trustStore type is : jks 
trustStore provider is : 
init truststore 
adding as trusted cert: 
    Subject: CN=ubuntu 

Тогда есть сервер привет *** ServerHello, TLSv1 , который, для которого сертификат найден

*** 
    Found trusted certificate: 
but the Certificate Request does find a matching certificate as above, unless it is added as a variable 
*** CertificateRequest 
Cert Types: RSA, DSS 
Cert Authorities: 
<CN=Thawte SSL CA, O="Thawte, Inc.", C=US> 
.... 
.... 
*** ServerHelloDone 
Warning: no suitable certificate found - continuing without client authentication 
*** Certificate chain 
<Empty> 
*** 

Поведение с хранилища ключей добавлен в качестве varible -Djavax.net.ssl.keyStore=

*** ServerHelloDone 
matching alias: devcert 
*** Certificate chain 
chain [0] = [ 
[ 
    Version: V3 

Я хочу использовать хранилище ключей и доверительное хранилище из кода программы, так как хочу иметь возможность смотреть на динамически меняющиеся это позже

+0

Повторите свое редактирование, вам нужно будет посмотреть журналы SSL-сервера, чтобы узнать, что там не так. Если клиент отправил сообщение «Сертификат», сертификат клиента сработал. – EJP

+0

Спасибо, что полезно знать, у меня нет доступа к серверу, но я предполагаю, что некоторые обмен данными после обмена ключами клиентов вызывают ошибку. Возможно, передача неверных данных на сервер –

ответ

1

Вам необходимо не получили личный ключ. Это уже серьезное нарушение безопасности. Фактическая проблема заключается в том, что certficate либо не подписан ЦС, упомянутых в сообщении CertificateRequest, либо что он не относится к типу, упомянутому в нем.

+0

Мне был предоставлен файл .pfx с закрытым ключом на диске. Я могу подключиться к сервису с помощью сертификатов с помощью SoapUI.Сертификаты имеют тип Key Algorithm: RSA –

+0

И не подписан Thawte. – EJP

+0

Спасибо, я получил сертификат Thawte через мой браузер и импортирован в хранилище cacerts, без него я стал фатальным, description = certificate_unknown в фазе serverHello –

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