android.permission.INTERNET
MainActivity.java:
package com.example.sample_sslsocket;
import java.io.IOException;
import java.net.UnknownHostException;
import java.security.cert.Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//get UI view
textView = (TextView) this.findViewById(R.id.textView1);
textView.setText("");
//start SSL test sample.
new Thread(new Runnable(){
@Override
public void run() {
mainTest();
}}).start();
}
private void TRACE(final String log){
this.runOnUiThread(new Runnable(){
@Override
public void run() {
Log.w("MainActivity", log);
textView.append(log+"\r\n");
}}
);
}
private void mainTest(){
/**
* 443 is the network port number used by the SSL https: URi scheme.
*/
int port = 443;
String hostname = "www.google.com";
SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
TRACE("Creating a SSL Socket For "+hostname+" on port "+port);
SSLSocket socket = null;
try {
socket = (SSLSocket) factory.createSocket(hostname, port);
} catch (UnknownHostException e) {
TRACE("factory.createSocket >> UnknownHostException");
} catch (IOException e) {
TRACE("factory.createSocket >> IOException");
}
TRACE("factory.createSocket >> successful");
/**
* Starts an SSL handshake on this connection. Common reasons include a
* need to use new encryption keys, to change cipher suites, or to
* initiate a new session. To force complete reauthentication, the
* current session could be invalidated before starting this handshake.
* If data has already been sent on the connection, it continues to flow
* during this handshake. When the handshake completes, this will be
* signaled with an event. This method is synchronous for the initial
* handshake on a connection and returns when the negotiated handshake
* is complete. Some protocols may not support multiple handshakes on an
* existing socket and may throw an IOException.
*/
try {
socket.startHandshake();
} catch (IOException e) {
TRACE("socket.startHandshake >> IOException");
}
TRACE("Handshaking Complete");
/**
* Retrieve the server's certificate chain
*
* Returns the identity of the peer which was established as part of
* defining the session. Note: This method can be used only when using
* certificate-based cipher suites; using it with non-certificate-based
* cipher suites, such as Kerberos, will throw an
* SSLPeerUnverifiedException.
*
*
* Returns: an ordered array of peer certificates, with the peer's own
* certificate first followed by any certificate authorities.
*/
Certificate[] serverCerts = null;
try {
serverCerts = socket.getSession().getPeerCertificates();
} catch (SSLPeerUnverifiedException e) {
TRACE(" socket.getSession().getPeerCertificates >> SSLPeerUnverifiedException");
}
TRACE("Retreived Server's Certificate Chain");
TRACE(serverCerts.length + "Certifcates Found\n\n\n");
for (int i = 0; i < serverCerts.length; i++) {
Certificate myCert = serverCerts[i];
TRACE("====Certificate:" + (i+1) + "====");
TRACE("-Public Key-\n" + myCert.getPublicKey());
TRACE("-Certificate Type-\n " + myCert.getType());
TRACE("");
}
String packet = "GET / HTTP/1.1\r\n\r\n";
TRACE("sending packet = "+packet);
try {
socket.getOutputStream().write(packet.getBytes());
TRACE("sending packet succeeded");
} catch (IOException e1) {
TRACE("socket.getOutputStream().write >> IOException");
}
TRACE("recving packet");
byte[] recv = new byte[10000];
try {
int recvLen = socket.getInputStream().read(recv, 0, recv.length);
String str = new String(recv, 0, recvLen);
TRACE("recv packet = "+str);
} catch (IOException e1) {
TRACE("socket.getInputStream().read >> IOException");
}
try {
TRACE("closing socket");
socket.close();
TRACE("socket closed");
} catch (IOException e) {
TRACE("socket.close >> IOException");
}
}
}
activity_main.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.sample_sslsocket.MainActivity"
tools:ignore="MergeRootFrame" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="TextView" />
</LinearLayout>
</ScrollView>
</LinearLayout>
</FrameLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sample_sslsocket"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.sample_sslsocket.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
沒有留言 :
張貼留言