Я пытаюсь реализовать SSL с TLS v1.2 в Android. Код, который я написал, выглядит следующим образом:
try {
if (mSocket == null || !mSocket.isBound()
|| mSocket.isClosed()) {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream inputStream = mContext.getAssets().open("keystore.pfx");
try {
keyStore.load(inputStream, mContext.getString(R.string.pw).toCharArray());
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
}
}
KeyStore trustStore = KeyStore.getInstance("PKCS12");
InputStream inputStreamts = mContext.getAssets().open("truststore.pfx");
try {
trustStore.load(inputStreamts, mContext.getString(R.string.ts_pw).toCharArray());
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} finally {
if (inputStreamts != null) {
inputStreamts.close();
}
}
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, mContext.getString(R.string.pw).toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
mSocket = (SSLSocket) factory.createSocket(businessIp, businessPort);
mSocket.setEnabledProtocols(new String[]{"TLSv1.2"});
mSocket.setEnabledCipherSuites(sslContext.getServerSocketFactory().getSupportedCipherSuites());
}
mSocket.setUseClientMode(true);
StringBuilder inputLineBuilder = new StringBuilder();
if (mSocket != null) {
try {
//printSocketInfo(mSocket);
mSocket.startHandshake();
OutputStream os = mSocket.getOutputStream();
os.write(f_RequestData);
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(os)));
out.flush();
if (out.checkError())
System.out.println("SSLSocketClient: java.io.PrintWriter error");
BufferedReader in = new BufferedReader(
new InputStreamReader(
mSocket.getInputStream()));
String response;
while ((response = in.readLine()) != null)
inputLineBuilder.append(response);
in.close();
out.close();
mSocket.close();
m_Response = inputLineBuilder.toString();
}catch(Exception e){e.printstacktrace();}
}
} catch (UnknownHostException e) {
e.printstacktrace();
} catch (SocketTimeoutException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
Сокет успешно создан, но при выполнении mSocket.startHandshake () я получаю следующее исключение:
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err:
javax.net.ssl.SSLHandshakeException: рукопожатие не удалось
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at
com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake (ConscryptFileDescriptorSocket.java:276)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at
com.example.networkmanager.ConnectionManager $ 1.run (ConnectionManager.java:135)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at
java.lang.Thread.run (Thread.java:764)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: вызвано:
javax.net.ssl.SSLProtocolException: SSL рукопожатие прервано:
ssl = 0x724c726080: сбой в библиотеке SSL, обычно ошибка протокола
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err:
Ошибка: 10000410: SSL
Подпрограммы: OPENSSL_internal: SSLV3_ALERT_HANDSHAKE_FAILURE
(external / boringssl / src / ssl / tls_record.cc: 579 0x7242eb8540: 0x00000001)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err:
Ошибка: 1000009a: SSL
Подпрограммы: OPENSSL_internal: HANDSHAKE_FAILURE_ON_CLIENT_HELLO
(Внешний / boringssl / SRC / SSL / handshake_client.cc: 893
0x724ebf70d7: 0x00000000)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at
com.android.org.conscrypt.NativeCrypto.SSL_do_handshake (собственный метод)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at
com.android.org.conscrypt.SslWrapper.doHandshake (SslWrapper.java:374)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at
com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake (ConscryptFileDescriptorSocket.java:217)
2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: ... 2
более
При попытке распечатать информацию о сокете. Следующая информация, которую я могу видеть:
Need client authentication = false
Cipher suite = SSL_NULL_WITH_NULL_NULL
Protocol = NONE
Peer Host = null
Peer Port = -1
Is Valid = false
Наряду со следующим исключением при попытке получить принцип равноправия:
javax.net.ssl.SSLPeerUnverifiedException: нет сертификата однорангового узла
на com.android.org.conscrypt.SSLNullSession.getPeerPrincipal (SSLNullSession.java:122)
в com.neml.direct.qr.networkmanager.ConnectionManager.printSocketInfo (ConnectionManager.java:246)
в com.neml.direct.qr.networkmanager.ConnectionManager $ 1.run (ConnectionManager.java:134)
at java.lang.Thread.run (Thread.java:764)
Я искал эту проблему в нескольких сообщениях и блогах stackoverflow.
следующие вещи, которые я уже проверил:
- KeyStore & TrustStore загружен правильно и не является нулевым.
- Проверен порядок цепочки сертификатов. Это правильно.
Я не могу понять, чего мне не хватает, что еще нужно сделать, чтобы успешно начать рукопожатие. Пожалуйста помоги. Любая помощь будет оценена.