Ошибки компиляции SSLSocketFactory

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

Эти две строки дают мне ошибки:

SSLSocketFactory socketFactory = new SSLSocketFactory(ks);

Это говорит о том, что SSLSocketFactory является абстрактным и не может быть создан.

socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

Для этого ошибка в том, что не может разрешить метод setHostnameVerifier и не может разрешить символ ALLOW_ALL_HOSTNAME_VERIFIER,

Код в целом:

    Button send;
    EditText textSend;
    private String ip_address = "192.168.10.103";
    private int port = 5000;
    private SSLSocket socket = null;
    private BufferedWriter out = null;
    private BufferedReader in = null;
    private final String TAG = "TAG";
    private char keystorepass[] = "....".toCharArray();
    private char keypassword[] = "....".toCharArray();



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_screen);
        send = (Button) findViewById(R.id.send);
        textSend = (EditText) findViewById(R.id.textsend);

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String send = textSend.getText().toString();
                if(send.isEmpty()){
                    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(sendScreen.this);
                    dialogBuilder.setMessage("Enter Text!");
                    dialogBuilder.setTitle("No TEXT");
                    dialogBuilder.setPositiveButton("OK...", null);
                    dialogBuilder.show();
                }else{
                    Log.i(TAG,"makes it to here");
                    try{

                        KeyStore ks = KeyStore.getInstance("BKS");
                        InputStream keyin = v.getResources().openRawResource(R.raw.androidKey);
                        ks.load(keyin,keystorepass);
                        SSLSocketFactory socketFactory = new SSLSocketFactory(ks);
                        socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

                        socket = (SSLSocket)
                                socketFactory.createSocket(new Socket(ip_address,port), ip_address, port, false);
                        socket.startHandshake();

                        printServerCertificate(socket);
                        printSocketInfo(socket);

                        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        chat(send);
                    } catch (UnknownHostException e) {
                        Toast.makeText(v.getContext(), "Unknown host", Toast.LENGTH_SHORT).show();
                        Log.i(TAG,"Unknown host");
                        //System.exit(1);
                    } catch  (IOException e) {
                        Toast.makeText(v.getContext(), "No I/O", Toast.LENGTH_SHORT).show();
                        Log.i(TAG,"No I/O");
                        e.printStackTrace();
                        //System.exit(1);
                    } catch (KeyStoreException e) {
                        Toast.makeText(v.getContext(), "Keystore ks error", Toast.LENGTH_SHORT).show();
                        Log.i(TAG,"Keystore ks error");
                        //System.exit(-1);
                    } catch (NoSuchAlgorithmException e) {
                        Toast.makeText(v.getContext(), "No such algorithm for ks.load", Toast.LENGTH_SHORT).show();
                        Log.i(TAG,"No such algorithm for ks.load");
                        e.printStackTrace();
                        //System.exit(-1);
                    } catch (CertificateException e) {
                        Toast.makeText(v.getContext(), "certificate missing", Toast.LENGTH_SHORT).show();
                        Log.i(TAG,"certificate missing");
                        e.printStackTrace();
                        //System.exit(-1);
                    } catch (UnrecoverableKeyException e) {
                        Toast.makeText(v.getContext(), "UnrecoverableKeyException", Toast.LENGTH_SHORT).show();
                        Log.i(TAG,"unrecoverableKeyException");
                        e.printStackTrace();
                        //System.exit(-1);
                    } catch (KeyManagementException e) {
                        Toast.makeText(v.getContext(), "KeyManagementException", Toast.LENGTH_SHORT).show();
                        Log.i(TAG,"key management exception");
                        e.printStackTrace();
                        //System.exit(-1);
                    }
                }
            }
        });


    }
    private void printServerCertificate(SSLSocket socket) {
        try {
            Certificate[] serverCerts =
                    socket.getSession().getPeerCertificates();
            for (int i = 0; i < serverCerts.length; i++) {
                Certificate myCert = serverCerts[i];
                Log.i(TAG,"====Certificate:" + (i+1) + "====");
                Log.i(TAG,"-Public Key-\n" + myCert.getPublicKey());
                Log.i(TAG,"-Certificate Type-\n " + myCert.getType());

                System.out.println();
            }
        } catch (SSLPeerUnverifiedException e) {
            Log.i(TAG,"Could not verify peer");
            e.printStackTrace();
            System.exit(-1);
        }
    }
    private void printSocketInfo(SSLSocket s) {
        Log.i(TAG,"Socket class: "+s.getClass());
        Log.i(TAG,"   Remote address = "
                +s.getInetAddress().toString());
        Log.i(TAG,"   Remote port = "+s.getPort());
        Log.i(TAG,"   Local socket address = "
                +s.getLocalSocketAddress().toString());
        Log.i(TAG,"   Local address = "
                +s.getLocalAddress().toString());
        Log.i(TAG,"   Local port = "+s.getLocalPort());
        Log.i(TAG,"   Need client authentication = "
                +s.getNeedClientAuth());
        SSLSession ss = s.getSession();
        Log.i(TAG,"   Cipher suite = "+ss.getCipherSuite());
        Log.i(TAG,"   Protocol = "+ss.getProtocol());
    }

    public void chat(String temp){
        String message = temp;
        String line = "";
        // send id of the device to match with the image
        try {
            out.write(message+"\n");
            out.flush();
        } catch (IOException e2) {
            Log.i(TAG,"Read failed");
            System.exit(1);
        }
        // receive a ready command from the server
//        try {
//            line = in.readLine();
//            mResponse.setText("SERVER SAID: "+line);
//            //Log.i(TAG,line);
//        } catch (IOException e1) {
//            Log.i(TAG,"Read failed");
//            System.exit(1);
//        }
    }

Две вышеупомянутые проблемы, которые я исправил, но у меня вывод этой ошибки:

 FATAL EXCEPTION: main


Process: com.example.admirmonteiro.testclient, PID: 13735


android.os.NetworkOnMainThreadException
                                                                                      `at` `android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)`

2 ответа

Вы либо только что изобрели конструктор new SSLSocketFactory(KeyStore) и метод SSSLSocketFactory.setHostnameVerifier()или вы неправильно импортировали SSLSocketFactory,

SSLSocketFactory является абстрактным, поэтому вы должны использовать один из его детей. Ты можешь использовать SSLSocketFactory.getDefault() чтобы получить реализацию по умолчанию.

setHostnameVerifier() это метод HttpsURLConnection не SSLSocketFactory, Вы должны использовать это в той части кода.

Если вы не используете HttpsURLConnectionВы можете и должны подтвердить URL-адрес следующим образом:

// Open SSLSocket directly to gmail.com
SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("gmail.com", 443);
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSession s = socket.getSession();

// Verify that the certicate hostname is for mail.google.com
// This is due to lack of SNI support in the current SSLSocket.
if (!hv.verify("mail.google.com", s)) {
    throw new SSLHandshakeException("Expected mail.google.com, "
                                    "found " + s.getPeerPrincipal());
}

// At this point SSLSocket performed certificate verificaiton and
// we have performed hostname verification, so it is safe to proceed.

// ... use socket ...
socket.close();

Вы можете увидеть некоторые реальные примеры в документации Android:

http://developer.android.com/training/articles/security-ssl.html

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