Как использовать сертификат поставщика услуг Intel SGX с Ubuntu и Android?

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

Я занимаюсь разработкой небольшого приложения Intel SGX, которое проводит удаленную аттестацию с помощью поставщика услуг Android. Мне нужна ваша помощь, чтобы понять, как использовать сертификат, который я зарегистрировал в Intel, для выполнения HTTPS-запросов к IAS (как указано в документации).

У меня есть небольшая тестовая Java-программа, которая выполняет простой GET-запрос Retreive SigRL к IAS, просто чтобы проверить, работает ли он вообще. Но я продолжаю получать SSLHandshakeException, когда он пытается выполнить HTTPS-запрос.

Java-код:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;

public class Prog {

    public static void main(String[] args) throws Exception {
        makeRequest();
    }

    public static void makeRequest() throws Exception {

        String url = "https://test-as.sgx.trustedservices.intel.com:443/attestation/sgx/v2/sigrl/00000010";
        URL target = new URL(url);

        /* Force TLSv1.2 */
        SSLContext sc = SSLContext.getInstance("TLSv1.2");
        sc.init(null, null, new java.security.SecureRandom());

        /* Set up HTTP properties. */
        HttpsURLConnection connection = (HttpsURLConnection) target.openConnection();
        connection.setSSLSocketFactory(sc.getSocketFactory());
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);

        /* Obtain and check response status quote. */
        int responseCode = connection.getResponseCode();

        /* Read response body into a String */
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuffer responseBuffer = new StringBuffer();
        while((inputLine = in.readLine()) != null){
            responseBuffer.append(inputLine);
        }
        in.close();
        String response = responseBuffer.toString();

        /* Evaluate result and print messages. */
        System.out.println("HTTP response status code: " + responseCode + "\n");
        System.out.println(response);
    }

}

Консольный вывод:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2038)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1135)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)
    at Prog.makeRequest(Prog.java:32)
    at Prog.main(Prog.java:13)

В этом руководстве создается файл client.pfx, который можно использовать для импорта сертификата на другие платформы. Я скопировал этот файл в систему Ubuntu, в которой запущена моя Java-программа, и дважды щелкнул ее, чтобы импортировать. Все казалось успешным, но я все еще продолжаю получать эти исключения при запуске программы.

Я также установил файл client.crt на Android с помощью параметра в (Настройки)>(Экран блокировки и безопасность)>(Другие параметры безопасности)>(Хранение учетных данных / Установка из хранилища устройства). Когда я пытаюсь запустить этот код из Android Activity (просто копируя метод), я получаю точно такую ​​же ошибку.

Мне нужно иметь возможность отправлять запросы IAS как из Ubuntu, так и из Android (7.0, API 24). Сертификат, сгенерированный с помощью этого руководства, уже зарегистрирован в Intel (я получил подтверждение по электронной почте и идентификатор поставщика услуг от Intel Developer Services).

В принципе, единственное, что мне нужно знать, - это как правильно использовать / установить сертификат, сгенерированный мной как в Ubuntu, так и в Android, и правильно ли я выполняю HTTP-запрос в программе. Я все еще студент, и мне нужно работать с SGX для проекта, поэтому, пожалуйста, имейте мои ограниченные знания. Буду очень благодарен за ответ.

0 ответов

Другие вопросы по тегам