WSO2 EI - двухсторонний SSL - handshake_failure - PullRequest
0 голосов
/ 22 сентября 2018

У меня проблема с установкой двусторонней аутентификации SSL.Мне нужно получить доступ к конечной точке HTTPS от интегратора wso2 entreprise.Поставщик услуг дал мне хранилище ключей pfx, содержащее сертификаты и закрытый ключ, которые я должен предоставить серверу.

Я установил это хранилище ключей pfx на свой компьютер с Windows и попытался получить доступ к конечной точке из Chrome (конечная точка имеетслужба GET в корневом контексте, возвращающая приветственное сообщение).При доступе к этой конечной точке chrome говорит мне выбрать сертификат для предоставления серверу ... я выбираю хороший, и возвращается приветственное сообщение ... хорошо, сертификат работает.

Я пытался с помощью curlтакже, предоставляя ключ, cacert и cert (извлекается из файлов pfx с использованием openssl).Все работало нормально.

Проблема в том, когда я пытаюсь получить доступ к этой конечной точке из службы wso2 ei.Я импортировал мой pfx-файл в хранилище ключей по умолчанию (wso2carbon.jks), выполнив следующие действия, используя keytool:

  1. Импорт pfx в jks

    keytool -importkeystore -srckeystore .pfx-srcstoretype pkcs12 -destkeystore wso2carbon.jks -deststoretype JKS -srcstorepass -deststorepass wso2carbon

  2. Экспорт открытого ключа jks

    keytool -export -alias "" -keystore wso2carbon.js-file publickey.pem -storepass wso2carbon

  3. Импорт открытого ключа по умолчанию client-trustore.jks

    keytool -import -alias "" -file publickey.pem -keystoreclient-truststore.jks -storepass wso2carbon

  4. Обновить пароль псевдонима в хранилище ключей wso2carbon (должен совпадать с jks pwd)

    keytool -keypasswd -alias "" -новый wso2carbon -keystore wso2carbon.jks -keypass -storepass wso2carbon

  5. Добавлены сертификаты корневого и промежуточного сервера в trustore

    keytool -import -v -trustcacerts -alias root -file root.cer -keystore client-truststore.jks -storepass wso2carbon keytool -import -v -trustcacerts -alias intermed -file intermed.cer -keystore client-truststore.jks -storepass wso2carbon

Перезапустил WSO2 EI, затем попытался получить доступ к конечной точке (сбой рукопожатия !!!)

Я активировал -Djavax.net.debug = ssl: handshake, ниже следа ошибки.Похоже, WSO2 EI не может найти сертификаты, запрашиваемые сервером

...
*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withRSA, Unknown (hash:0x6, signature:0x2), SHA512withECDSA, SHA384withRSA, Unknown (hash:0x5, signature:0x2), SHA384withECDSA, SHA256withRSA, Unknown (hash:0x4, signature:0x2), SHA256withECDSA, SHA224withRSA, Unknown (hash:0x3, signature:0x2), SHA224withECDSA, SHA1withRSA, SHA1withDSA, SHA1withECDSA
Cert Authorities:
<CN=Autorite Bureau RTE, O=RTE, L=Pacy, ST=Eure, C=FR>
<CN=Autorite Racine RTE, O=RTE, L=Pacy, ST=Eure, C=FR>
<CN=Autorite Bureau Machine RTE, DC=bureau, DC=si, DC=interne>
*** ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>
***
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1.2
PassThroughMessageProcessor-2, WRITE: TLSv1.2 Handshake, length = 320
SESSION KEYGEN:
PreMaster Secret:
... no IV derived for this protocol
PassThroughMessageProcessor-2, WRITE: TLSv1.2 Change Cipher Spec, length = 64
*** Finished
verify_data:  { 111, 185, 151, 74, 99, 156, 152, 185, 240, 222, 162, 116 }
***
PassThroughMessageProcessor-2, WRITE: TLSv1.2 Handshake, length = 80
PassThroughMessageProcessor-2, READ: TLSv1.2 Alert, length = 64
PassThroughMessageProcessor-2, RECV TLSv1.2 ALERT:  fatal, handshake_failure
%% Invalidated:  [Session-1, TLS_RSA_WITH_AES_256_CBC_SHA256]
%% Invalidated:  [Session-2, TLS_RSA_WITH_AES_256_CBC_SHA256]
PassThroughMessageProcessor-2, called closeSocket()
PassThroughMessageProcessor-2, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
PassThroughMessageProcessor-2, called close()
PassThroughMessageProcessor-2, called closeInternal(true)

Я пытался с SOAP UI, ссылаясь на ранее созданное хранилище ключей, и вызов GET возвращает сообщение приветствия (рукопожатие успешно).

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

System.setProperty("javax.net.ssl.keyStore", keystorePath);
        System.setProperty("javax.net.ssl.keyStorePassword", CERT_PASSWORD);
        System.setProperty("javax.net.ssl.keyStoreType", "JKS");
        URL myUrl;
        try {
            myUrl = new URL(endpoint);
            HttpsURLConnection conn = (HttpsURLConnection) myUrl.openConnection();
            InputStream is = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            String inputLine;

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

Cert Authorities:
<CN=Autorite Bureau RTE, O=RTE, L=Pacy, ST=Eure, C=FR>
<CN=Autorite Racine RTE, O=RTE, L=Pacy, ST=Eure, C=FR>
<CN=Autorite Bureau Machine RTE, DC=bureau, DC=si, DC=interne>
*** ServerHelloDone
matching alias: alias-cert

Я ценю любую помощь.Спасибо.

С уважением, Руди

...