[prev in list] [next in list] [prev in thread] [next in thread] 

List:       bouncycastle-crypto-dev
Subject:    [dev-crypto] PROBLEM WITH CONNECTION CLOSE HEADER
From:       Seng Leong <sengleong () AmericanApparel ! net>
Date:       2016-02-10 2:07:00
Message-ID: BLUPR07MB434009AF779E39D8B4F1653BED70 () BLUPR07MB434 ! namprd07 ! prod ! outlook ! com
[Download RAW message or body]

Hi dev-crypto:

I recently has a project that needs to support TSLv1.2 with JDK1.6_45. We need to \
connection to one of the third party server which, will be using TSLv1.2 only, and \
updating JDK is not an option for us yet. Then I starts to search the web find some \
examples about BouncyCastle, and complete my first draft implementation. However, \
when I run it, I got an exception as follow:

Exception in thread "main" java.io.IOException: Internal TLS error, this could be an \
                attack
       at org.bouncycastle.crypto.tls.TlsProtocol.failWithError(TlsProtocol.java:879)
       at org.bouncycastle.crypto.tls.TlsProtocol.safeReadRecord(TlsProtocol.java:530)
                
       at org.bouncycastle.crypto.tls.TlsProtocol.readApplicationData(TlsProtocol.java:498)
                
       at org.bouncycastle.crypto.tls.TlsInputStream.read(TlsInputStream.java:29)

Then I search around in google, and find an simple sample, when I run it, I got the \
same exception. The sample is basically make a ssl connection to \
www.google.com<http://www.google.com>:443. Below is code:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import org.bouncycastle.crypto.tls.CertificateRequest;
import org.bouncycastle.crypto.tls.DefaultTlsClient;
import org.bouncycastle.crypto.tls.TlsAuthentication;
import org.bouncycastle.crypto.tls.TlsClientProtocol;
import org.bouncycastle.crypto.tls.TlsCredentials;

public class BouncyCastleTest {


   public static void main(String[] args) throws Exception {
        java.security.SecureRandom secureRandom = new java.security.SecureRandom();
        Socket socket = new \
                Socket(java.net.InetAddress.getByName("www.google.com<http://www.google.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(org.bouncycastle.crypto.tls.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"));
        output.write("Host: \
www.google.com\r\n".getBytes("UTF-8"))<http://www.google.com/r/n%22.getBytes(%22UTF-8%22))>;
                
        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;
        while ((line = reader.readLine()) != null)
        {
            System.out.println(line);
        }

        try {
              if (socket != null) {
                     socket.close();
              }
              if (output != null) {
                     output.close();
              }
              if (input != null) {
                     input.close();
              }
        } catch (IOException e) {
              e.printStackTrace();
        }
    }
}

** copy mostly from http://stackoverflow.com/questions/18065170/how-do-i-do-tls-with-bouncycastle


When I run this sample, more than half of the page being outputted, but at last, it \
throws the above error at the end. However, if I change the header to connection: \
keep-alive, as below  output.write("Connection: keep-alive\r\n".getBytes("UTF-8"));

Then I can see the whole page from google with no problem, only the read.readline() \
will never returns (because the connection is active). What I am guessing is \
somewhere is not considering the steam has been closed by the server? I then download \
the debug version of the jar bcprov-debug-jdk15on-154.jar and run this again. And \
find out org.bouncycastle.crypto.tos.RecordStream.readRecord() line 140, the method \
readRecord() return false when TlsUtils.readAllOrNothing return null (I am guessing \
null is expected as the connection has been close?). When readRecord() return false, \
org.bouncycastle.crypto.tls.TlsProtocal.safeReadRecord() throws an EOFException, and \
pass the exception to failWithError, which then, throw the IOException with message \
showing on the above error.

Sorry about the lengthen email, as I am just trying to give as much as information I \
can find. Can anyone please take a look the above error?

Thank you very much, any help is greatly appreciated!
Seng Leong


[Attachment #3 (text/html)]

<html xmlns:v="urn:schemas-microsoft-com:vml" \
xmlns:o="urn:schemas-microsoft-com:office:office" \
xmlns:w="urn:schemas-microsoft-com:office:word" \
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" \
xmlns="http://www.w3.org/TR/REC-html40"> <head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:#0563C1;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:#954F72;
	text-decoration:underline;}
span.EmailStyle17
	{mso-style-type:personal;
	font-family:"Calibri",sans-serif;
	color:windowtext;}
span.EmailStyle18
	{mso-style-type:personal-reply;
	font-family:"Calibri",sans-serif;
	color:#1F497D;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi dev-crypto:<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">I recently has a project that needs to support TSLv1.2 with \
JDK1.6_45. We need to connection to one of the third party server which, will be \
using TSLv1.2 only, and updating JDK is not an option for us yet. Then I starts to \
search the web  find some examples about BouncyCastle, and complete my first draft \
implementation. However, when I run it, I got an exception as follow:<o:p></o:p></p> \
<p class="MsoNormal"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" \
style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:red">Exception in thread \
&quot;main&quot; </span><u><span \
style="font-size:10.0pt;font-family:Consolas;color:#0066CC">java.io.IOException</span></u><span \
style="font-size:10.0pt;font-family:Consolas;color:red">: Internal TLS error, this \
could be an attack</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
at org.bouncycastle.crypto.tls.TlsProtocol.failWithError(</span><u><span \
style="font-size:10.0pt;font-family:Consolas;color:#0066CC">TlsProtocol.java:879</span></u><span \
style="font-size:10.0pt;font-family:Consolas;color:red">)</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
at org.bouncycastle.crypto.tls.TlsProtocol.safeReadRecord(</span><u><span \
style="font-size:10.0pt;font-family:Consolas;color:#0066CC">TlsProtocol.java:530</span></u><span \
style="font-size:10.0pt;font-family:Consolas;color:red">)</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
at org.bouncycastle.crypto.tls.TlsProtocol.readApplicationData(</span><u><span \
style="font-size:10.0pt;font-family:Consolas;color:#0066CC">TlsProtocol.java:498</span></u><span \
style="font-size:10.0pt;font-family:Consolas;color:red">)</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal"><span \
style="font-size:10.0pt;font-family:Consolas;color:red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
at org.bouncycastle.crypto.tls.TlsInputStream.read(</span><u><span \
style="font-size:10.0pt;font-family:Consolas;color:#0066CC">TlsInputStream.java:29</span></u><span \
style="font-size:10.0pt;font-family:Consolas;color:red">)<o:p></o:p></span></p> <p \
class="MsoNormal"><span \
style="font-size:10.0pt;font-family:Consolas;color:red"><o:p>&nbsp;</o:p></span></p> \
<p class="MsoNormal">Then I search around in google, and find an simple sample, when \
I run it, I got the same exception. The sample is basically make a ssl connection to \
<a href="http://www.google.com">www.google.com</a>:443. Below is code:<o:p></o:p></p> \
<p class="MsoNormal"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" \
style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
java.io.BufferedReader;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
java.io.IOException;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
java.io.InputStreamReader;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
java.net.Socket;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas"><o:p>&nbsp;</o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
org.bouncycastle.crypto.tls.CertificateRequest;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
org.bouncycastle.crypto.tls.DefaultTlsClient;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
org.bouncycastle.crypto.tls.TlsAuthentication;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
org.bouncycastle.crypto.tls.TlsClientProtocol;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">import</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
org.bouncycastle.crypto.tls.TlsCredentials;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas"><o:p>&nbsp;</o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">public</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">class</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> BouncyCastleTest \
{</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas"><o:p>&nbsp;</o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp; \
</span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">public</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">static</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">void</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> main(String[] </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">args</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">) </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">throws</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> Exception {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
java.security.SecureRandom </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">secureRandom</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
java.security.SecureRandom();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
Socket </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">socket</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
Socket(java.net.InetAddress.<i>getByName</i>(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;</span><a \
href="http://www.google.com"><span \
style="font-size:10.0pt;font-family:Consolas">www.google.com</span></a><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">),  443);</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
TlsClientProtocol </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">protocol</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
TlsClientProtocol(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">socket</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getInputStream(), \
</span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">socket</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getOutputStream(),</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">secureRandom</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
DefaultTlsClient </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">client</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> DefaultTlsClient() \
{</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">public</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> TlsAuthentication \
getAuthentication() </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">throws</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> IOException {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
TlsAuthentication </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">auth</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> TlsAuthentication() \
{</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbs \
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#3F7F5F">// Capture \
the server certificate information!</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbs \
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">public</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">void</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
notifyServerCertificate(org.bouncycastle.crypto.tls.Certificate </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">serverCertificate</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">) </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">throws</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> IOException {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbs \
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
}</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas"><o:p>&nbsp;</o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbs \
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">public</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> TlsCredentials \
getClientCredentials(CertificateRequest </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">certificateRequest</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">) </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">throws</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> IOException {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbs \
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">return</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">null</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbs \
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
}</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
};</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> \
<p class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">return</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">auth</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
}</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
};</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> \
<p class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">protocol</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.connect(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">client</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas"><o:p>&nbsp;</o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
java.io.OutputStream </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">protocol</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getOutputStream();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.write(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;GET / \
HTTP/1.1\r\n&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getBytes(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;UTF-8&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">));</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.write(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;Host: </span><a \
href="http://www.google.com/r/n%22.getBytes(%22UTF-8%22))"><span \
style="font-size:10.0pt;font-family:Consolas">www.google.com\r\n&quot;.getBytes(&quot;UTF-8&quot;))</span></a><span \
style="font-size:10.0pt;font-family:Consolas;color:black">;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.write(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;Connection: \
close\r\n&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getBytes(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;UTF-8&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">)); </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#3F7F5F">// So the server will \
close socket immediately.</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.write(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;\r\n&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getBytes(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;UTF-8&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">)); </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#3F7F5F">// HTTP1.1 requirement: \
last line must be empty line.</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.flush();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
<p class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
java.io.InputStream </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">input</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">protocol</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getInputStream();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;BufferedReader </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">reader</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> \
BufferedReader(</span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">  \
InputStreamReader(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">input</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">));</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
String </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">line</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">;</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">while</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> ((</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">line</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">  = </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">reader</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.readLine()) != \
</span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">null</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">)</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
{</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
System.</span><b><i><span \
style="font-size:10.0pt;font-family:Consolas;color:#0000C0">out</span></i></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.println(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">line</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
}</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">try</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">  {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">if</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> (</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">socket</span><span \
                style="font-size:10.0pt;font-family:Consolas;color:black">
 != </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">null</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">) {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">socket</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.close();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">if</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> (</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
                style="font-size:10.0pt;font-family:Consolas;color:black">
 != </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">null</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">) {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.close();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><b><span \
style="font-size:10.0pt;font-family:Consolas;color:#7F0055">if</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> (</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">input</span><span \
                style="font-size:10.0pt;font-family:Consolas;color:black">
 != </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">null</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black">) {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">input</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.close();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
} </span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">catch</span></b><span \
style="font-size:10.0pt;font-family:Consolas;color:black"> (IOException </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">e</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">) {</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span \
style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">e</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.printStackTrace();</span><span \
style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
}</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp; }&nbsp; \
</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p> <p \
class="MsoNormal"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p> <p \
class="MsoNormal"><span \
style="font-size:10.0pt;font-family:Consolas;color:black"><o:p>&nbsp;</o:p></span></p>
 <p class="MsoNormal"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">** copy mostly from \
</span><a href="http://stackoverflow.com/questions/18065170/how-do-i-do-tls-with-bouncycastle"><span \
style="font-size:10.0pt;font-family:Consolas">http://stackoverflow.com/questions/18065170/how-do-i-do-tls-with-bouncycastle</span></a><span \
style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p> <p \
class="MsoNormal"><span \
style="font-size:10.0pt;font-family:Consolas;color:black"><o:p>&nbsp;</o:p></span></p>
 <p class="MsoNormal">When I run this sample, more than half of the page being \
outputted, but at last, it throws the above error at the end. However, if I change \
the header to connection: keep-alive, as below<o:p></o:p></p> <p class="MsoNormal" \
style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </span><span style="font-size:10.0pt;font-family:Consolas;color:#6A3E3E">output</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.write(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;Connection: \
keep-alive\r\n&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">.getBytes(</span><span \
style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">&quot;UTF-8&quot;</span><span \
style="font-size:10.0pt;font-family:Consolas;color:black">)); <o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span \
style="font-size:10.0pt;font-family:Consolas;color:black"><o:p>&nbsp;</o:p></span></p>
 <p class="MsoNormal" style="text-autospace:none">Then I can see the whole page from \
google with no problem, only the read.readline() will never returns (because the \
connection is active). <o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none">What I am guessing is somewhere is \
not considering the steam has been closed by the server? <o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none">I then download the debug version of \
the jar bcprov-debug-jdk15on-154.jar and run this again. And find out \
org.bouncycastle.crypto.tos.RecordStream.readRecord() line 140, the method \
readRecord() return false  when TlsUtils.readAllOrNothing return null (I am guessing \
null is expected as the connection has been close?). When readRecord() return false, \
org.bouncycastle.crypto.tls.TlsProtocal.safeReadRecord() throws an EOFException, and \
pass the exception to failWithError,  which then, throw the IOException with message \
showing on the above error. <o:p> </o:p></p>
<p class="MsoNormal" style="text-autospace:none"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal" style="text-autospace:none">Sorry about the lengthen email, as I \
am just trying to give as much as information I can find. Can anyone please take a \
look the above error? <o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal" style="text-autospace:none">Thank you very much, any help is \
greatly appreciated! <o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none">Seng Leong<o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none"><o:p>&nbsp;</o:p></p>
</div>
</body>
</html>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic