简体   繁体   English

SSLSocketFactory编译错误

[英]SSLSocketFactory compilation errors

I am using the following client SSLSocketFactory code to send a text and then eventually a .wav file to my server who is listening, however this code is giving me two errors. 我正在使用以下客户端SSLSocketFactory代码发送文本,然后最终将.wav文件发送到正在侦听的服务器,但是此代码给了我两个错误。

These two lines are giving me errors: 这两行给我错误:

SSLSocketFactory socketFactory = new SSLSocketFactory(ks);

This is saying that SSLSocketFactory is abstract and cannot be instantiated. 这就是说SSLSocketFactory是抽象的,无法实例化。

socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

For this the error is that is cannot resolve method setHostnameVerifier and cannot resolve symbol ALLOW_ALL_HOSTNAME_VERIFIER . 为此,该错误是无法解析方法setHostnameVerifier且无法解析符号ALLOW_ALL_HOSTNAME_VERIFIER

The code as a whole: 整个代码:

    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);
//        }
    }

The above two problems I have fixed but I am having this error output : 上面的两个问题我已经解决,但我有此错误输出:

 FATAL EXCEPTION: main


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


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

SSLSocketFactory is abstract so you have to use one of its children. SSLSocketFactory是抽象的,因此您必须使用其子级之一。 You can use SSLSocketFactory.getDefault() to get the default implementation. 您可以使用SSLSocketFactory.getDefault()获取默认实现。

setHostnameVerifier() is a method of HttpsURLConnection not SSLSocketFactory . setHostnameVerifier()HttpsURLConnection的方法,而不是SSLSocketFactory You should use it in that part of the code. 您应该在代码的该部分中使用它。

If you are not using HttpsURLConnection , you can and should verify the URL like this: 如果您不使用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();

You can see some real world examples in Android documentation: 您可以在Android文档中看到一些真实的示例:

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

您或者只是发明了构造函数new SSLSocketFactory(KeyStore)和方法SSSLSocketFactory.setHostnameVerifier() ,否则就导入了错误的SSLSocketFactory

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM