Tôi cần làm việc với ổ cắm TCP trên TLS cho ứng dụng tôi đang làm việc. Tôi đã trải qua hàng chục ví dụ và trong khi tôi không gặp vấn đề gì trong việc bắt tay, tôi dường như không đọc luồng đầu vào thông qua bất kỳ phương tiện nào (đã thử nhiều, bao gồm readline(), đọc tới mảng ký tự, v.v.). mỗi khi tôi thử, ứng dụng bị đóng băng tại chỗ đó. Nếu tôi gỡ lỗi, nó không bao giờ đi đến dòng mã tiếp theo.Ví dụ về Android SSLEngine
Trong một giải pháp đã cố gắng, tôi quyết định chuyển sang sử dụng SSLEngine, vì đó được cho là câu trả lời Java 1.5 cho java.nio cho SSL. Tuy nhiên, tôi đã tìm thấy một ví dụ (ở đây: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java) điều này khiến tôi hơi bối rối và tôi đã không triển khai thành công nó. Khi tôi thử, hàm unrap() tạo ra một bộ đệm trống, nơi mà tôi biết (từ việc sử dụng OpenSSL trên dòng lệnh) rằng dịch vụ được đề cập sẽ đẩy dữ liệu xuống đường ống.
Đề xuất được hoan nghênh, tôi đã đốt cháy quá nhiều thời gian cho việc này rồi. Dưới đây là các mã có liên quan:
SSLEngine engine = sslContext.createSSLEngine(uri.getHost(), uri.getPort());
engine.setUseClientMode(true);
engine.beginHandshake();
SSLSession session = engine.getSession();
int bufferMax = session.getPacketBufferSize();
int appBufferMax = session.getApplicationBufferSize() + 50;
ByteBuffer cTo = ByteBuffer.allocateDirect(bufferMax);
ByteBuffer sTo = ByteBuffer.allocateDirect(bufferMax);
ByteBuffer out = ByteBuffer.wrap(sessionId.getBytes());
ByteBuffer in = ByteBuffer.allocate(appBufferMax);
debug("sending secret");
SSLEngineResult rslt = engine.wrap(out, cTo);
debug("first result: " + rslt.toString());
sTo.flip();
rslt = engine.unwrap(sTo, in);
debug("next result" + rslt.toString());
Là bản cập nhật, tôi cũng đã thử lặp lại cuộc gọi không mong muốn trong khi (rslt.getStatus()! = SSLEngineResult.Status.OK) và không bao giờ được điền, và trạng thái không bao giờ trở thành OK. – Paul
Bạn đã thử chạy mã này trong một ứng dụng Java thông thường chưa? Điều đó ít nhất sẽ giúp xác định xem một vấn đề cụ thể của nó cho Android hay không. – elevine
Vâng, tôi không nghĩ rằng nó dành riêng cho android, tôi chỉ tình cờ làm việc đó trong một dự án android. – Paul