gpt4 book ai didi

java - SSLSocketFactory编译错误

转载 作者:行者123 更新时间:2023-12-02 11:01:39 35 4
gpt4 key购买 nike

我正在使用以下客户端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)`

最佳答案

SSLSocketFactory是抽象的,因此您必须使用其子级之一。您可以使用SSLSocketFactory.getDefault()来获取默认实现。
setHostnameVerifier()HttpsURLConnection而非SSLSocketFactory的方法。您应该在代码的该部分中使用它。

如果您不使用HttpsURLConnection,则可以并且应该这样验证网址:

// 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

关于java - SSLSocketFactory编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36539385/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com