TLSv1.3 fails to read cert chain after HTTP redirect
Jamil Nimeh
jamil.j.nimeh at oracle.com
Thu Nov 1 19:03:13 UTC 2018
Hi Daniel thanks for bringing this up, this sounds like
https://bugs.openjdk.java.net/browse/JDK-8212885. I'm very close to a
fix on this one, just working out a few issues in testing.
--Jamil
On 10/8/2018 2:34 PM, Daniel Christensen wrote:
> I have a custom HostnameVerifier that attempts to examine the
> certificate chain using SSLSession#getPeerCertificates(). After
> upgrading to Java 11, where it seems that TLSv1.3 is used by default,
> I am seeing that getPeerCertificates() throws an
> SSLPeerUnverifiedException after an HTTP redirect has occurred. If I
> force the protocol to TLSv1.2 this does not occur. If there is no
> redirect, then this does not occur.
>
> Is this a bug in Java or a change in behavior with TLSv1.3?
>
> The code below demonstrates the problem when 'protocol' is either
> 'TLS' or 'TLSv1.3' and path is '/redirect'.
>
> doTest("TLSv1.3", "/redirect"); // Fails with SSLPeerUnverifiedException
> doTest("TLSv1.3", "/content"); // Succeeds
> doTest("TLSv1.2", "/redirect"); // Succeeds
> doTest("TLSv1.2", "/content"); // Succeeds
>
> private void doTest(String protocol, String path) throws
> IOException, NoSuchAlgorithmException, KeyManagementException
> {
> whenHttp(server)
> .match(get("/redirect"))
> .then(status(HttpStatus.MOVED_PERMANENTLY_301),
> contentType("text/html"), header("Location", "/content"),
> stringContent("redirected"));
> whenHttp(server)
> .match(get("/content"))
> .then(ok(), contentType("text/html"),
> stringContent("ok"));
>
> URL url = new URL("https", "localhost", server.getPort(), path);
> HttpsURLConnection conn =
> (HttpsURLConnection)url.openConnection();
> SSLContext ctx = SSLContext.getInstance(protocol);
> TrustManager[] tms = {new X509TrustManager()
> {
> @Override public void checkClientTrusted(X509Certificate[]
> chain, String authType){}
> @Override public void checkServerTrusted(X509Certificate[]
> chain, String authType){}
> @Override public X509Certificate[] getAcceptedIssuers() {
> return new X509Certificate[0]; }
> }};
> ctx.init(null, tms, new SecureRandom());
> conn.setSSLSocketFactory(ctx.getSocketFactory());
> conn.setHostnameVerifier(new HostnameVerifier()
> {
> @Override
> public boolean verify(String hostname, SSLSession session)
> {
> java.security.cert.Certificate[] chain = null;
> try
> {
> chain = session.getPeerCertificates();
> }
> catch (SSLPeerUnverifiedException e)
> {
> throw new RuntimeException(e);
> }
> return true;
> }
> });
> int status = conn.getResponseCode();
> assertEquals(200, status);
> }
>
>
> Thanks,
> Dan
>
> Daniel L. Christensen
> Distinguished Engineer
> Micro Focus
> http://www.microfocus.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/security-dev/attachments/20181101/466152a7/attachment.htm>
More information about the security-dev
mailing list