0

BouncyCastle (SpongyCastle) ライブラリを使用して、Jellybean 4.1.2 を実行している古い Android デバイスで TLS1.2 サーバーにログインしようとしていますが、機能しません。そのバージョンの Android ではデフォルトで TLS が有効になっていないため、それを使用するにはサードパーティのライブラリが必要でした。

2 つの問題があります。1. JSON 応答の代わりに HTTP 302 を受け取ります。2. JSON ペイロードを送信する方法がわかりません (使用する他のエンドポイントの場合)

HTTP 302 を使用すると、次の応答が返されます。

Result: HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Cache-Control: private
Expires: Thu, 01 Jan 1970 00:00:00 UTC
Set-Cookie: JSESSIONID=83C535625CDEF9DEC3D7890F1A9C86B0; Path=/; Secure; HttpOnly
Location: https://www.google.com/login/auth                                                               Content-Length: 0
Date: Wed, 14 Mar 2018 15:32:19 GMT
Via: 1.1 google
Set-Cookie: GCLB=CMfzgbfeh7bLpwE; path=/; HttpOnly
Alt-Svc: clear
Connection: close

そのため、ある種の Google ログインにリダイレクトしようとしているようですが、これは奇妙です。

また、ペイロードを送信しようとしている上記の番号 2 では、別のペイロードを追加するだけoutput.write(myJSONPayload);ですか、それとも何か他のことをする必要がありますか?

私のコードは次のとおりです。

{
    java.security.SecureRandom secureRandom = new java.security.SecureRandom();
    Socket socket = new Socket("www.myserver.com", 443);

    TlsClientProtocol protocol = new TlsClientProtocol(socket.getInputStream(), socket.getOutputStream(), secureRandom);
    DefaultTlsClient client = new DefaultTlsClient() {
        public TlsAuthentication getAuthentication() throws IOException {
            TlsAuthentication auth = new TlsAuthentication() {
                // Capture the server certificate information!
                public void notifyServerCertificate(Certificate serverCertificate) throws IOException {
                }

                public TlsCredentials getClientCredentials(CertificateRequest certificateRequest) throws IOException {
                    return null;
                }
            };
            return auth;
        }
    };
    protocol.connect(client);

    java.io.OutputStream output = protocol.getOutputStream();
    output.write("GET / HTTP/1.1\r\n".getBytes("UTF-8"));

    //Get auth with my own class to generate base 64 encoding
    output.write(("Authorization: " + BasicAuthentication.getAuthenticationHeader("myuser", "mypass")).getBytes());

    output.write("Host: www.myserver.com/logon\r\n".getBytes("UTF-8"));
    output.write("Connection: close\r\n".getBytes("UTF-8")); // So the server will close socket immediately.
    output.write("\r\n".getBytes("UTF-8")); // HTTP1.1 requirement: last line must be empty line.
    output.flush();

    java.io.InputStream input = protocol.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    String line;
    StringBuilder sb = new StringBuilder();
    try {
        while ((line = reader.readLine()) != null) {
            Log.d(TAG, "--> " + line);
            sb.append(line).append("\n");
        }
    } catch (TlsNoCloseNotifyException e) {
        Log.d(TAG, "End of stream");
    }

    String result = sb.toString();
    Log.d(TAG, "Result: " + result);
}

別の質問ですが、正しい HOST を指定していますか? にベース URL を入れてSocketに完全な URL を入れてもOutputStreamよろしいですか?

4

1 に答える 1