我已经在英特尔论坛上发布了此问题,但是我的日程安排有限,我需要快速回答,因此我正在与所有可用的媒体联系。
我正在开发一个小型的Intel SGX应用程序,该应用程序可以通过Android服务提供商进行远程认证。我需要您的帮助,以帮助您了解如何使用我在英特尔注册的证书向IAS发出HTTPS请求(如documentation中所述)。
我有一个小的测试Java程序,它向IAS发出了一个简单的Retreive SigRL GET请求,只是为了测试它是否可以工作。但是当它尝试执行HTTPS请求时,我一直收到SSLHandshakeException。
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)
This tutorial生成一个client.pfx文件,该文件可用于将证书导入其他平台。我已将此文件复制到运行Java程序的Ubuntu系统,并双击将其导入。一切似乎都成功了,但是运行程序时我仍然不断收到这些异常。
我还使用(设置)>(锁屏和安全性)>(其他安全性设置)>(凭据存储/从设备存储安装)中的选项在Android上安装了client.crt文件。当我尝试从Android Activity运行此代码时(仅通过复制粘贴方法),我得到了完全相同的错误。
我需要能够从Ubuntu和Android(7.0,API 24)发出IAS请求。我使用本教程生成的证书已在英特尔注册(我已从英特尔开发人员服务收到电子邮件确认和服务提供商ID)。
原则上,我唯一需要知道的是如何正确使用/安装在Ubuntu和Android上生成的证书,以及是否在程序中正确发出HTTP请求。我仍然是一名学生,我需要与SGX合作进行一个项目,所以请以我的有限知识承受。我将非常感谢您的答复。