Path: blob/master/test/jdk/sun/security/ssl/SSLContextImpl/TrustTrustedCert.java
41152 views
/*1* Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425//26// SunJSSE does not support dynamic system properties, no way to re-use27// system properties in samevm/agentvm mode.28//2930/*31* @test32* @bug 7113275 816484633* @summary compatibility issue with MD2 trust anchor and old X509TrustManager34* @library /javax/net/ssl/templates35* @run main/othervm TrustTrustedCert PKIX TLSv1.1 true36* @run main/othervm TrustTrustedCert PKIX TLSv1.1 false37* @run main/othervm TrustTrustedCert SunX509 TLSv1.1 false38* @run main/othervm TrustTrustedCert PKIX TLSv1.2 false39* @run main/othervm TrustTrustedCert SunX509 TLSv1.2 false40*/4142import java.net.*;43import java.io.*;44import javax.net.ssl.*;45import java.security.*;46import java.security.cert.*;47import java.security.spec.*;48import java.security.interfaces.*;49import java.util.Base64;5051public class TrustTrustedCert extends SSLSocketTemplate {5253/*54* Certificates and key used in the test.55*/5657// It's a trust anchor signed with MD2 hash function.58static String trustedCertStr =59"-----BEGIN CERTIFICATE-----\n" +60"MIICkjCCAfugAwIBAgIBADANBgkqhkiG9w0BAQIFADA7MQswCQYDVQQGEwJVUzEN\n" +61"MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" +62"MTExMTE4MTExNDA0WhcNMzIxMDI4MTExNDA0WjA7MQswCQYDVQQGEwJVUzENMAsG\n" +63"A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwgZ8wDQYJ\n" +64"KoZIhvcNAQEBBQADgY0AMIGJAoGBAPGyB9tugUGgxtdeqe0qJEwf9x1Gy4BOi1yR\n" +65"wzDZY4H5LquvIfQ2V3J9X1MQENVsFvkvp65ZcFcy+ObOucXUUPFcd/iw2DVb5QXA\n" +66"ffyeVqWD56GPi8Qe37wrJO3L6fBhN9oxp/BbdRLgjU81zx8qLEyPODhPMxV4OkcA\n" +67"SDwZTSxxAgMBAAGjgaUwgaIwHQYDVR0OBBYEFLOAtr/YrYj9H04EDLA0fd14jisF\n" +68"MGMGA1UdIwRcMFqAFLOAtr/YrYj9H04EDLA0fd14jisFoT+kPTA7MQswCQYDVQQG\n" +69"EwJVUzENMAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2\n" +70"Y2WCAQAwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEC\n" +71"BQADgYEAr8ExpXu/FTIRiMzPm0ubqwME4lniilwQUiEOD/4DbksNjEIcUyS2hIk1\n" +72"qsmjJz3SHBnwhxl9dhJVwk2tZLkPGW86Zn0TPVRsttK4inTgCC9GFGeqQBdrU/uf\n" +73"lipBzXWljrfbg4N/kK8m2LabtKUMMnGysM8rN0Fx2PYm5xxGvtM=\n" +74"-----END CERTIFICATE-----";7576// The certificate issued by above trust anchor, signed with MD577static String targetCertStr =78"-----BEGIN CERTIFICATE-----\n" +79"MIICeDCCAeGgAwIBAgIBAjANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" +80"MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" +81"MTExMTE4MTExNDA2WhcNMzEwODA1MTExNDA2WjBPMQswCQYDVQQGEwJVUzENMAsG\n" +82"A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxEjAQBgNV\n" +83"BAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwDnm96mw\n" +84"fXCH4bgXk1US0VcJsQVxUtGMyncAveMuzBzNzOmKZPeqyYX1Fuh4q+cuza03WTJd\n" +85"G9nOkNr364e3Rn1aaHjCMcBmFflObnGnhhufNmIGYogJ9dJPmhUVPEVAXrMG+Ces\n" +86"NKy2E8woGnLMrqu6yiuTClbLBPK8fWzTXrECAwEAAaN4MHYwCwYDVR0PBAQDAgPo\n" +87"MB0GA1UdDgQWBBSdRrpocLPJXyGfDmMWJrcEf29WGDAfBgNVHSMEGDAWgBSzgLa/\n" +88"2K2I/R9OBAywNH3deI4rBTAnBgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIG\n" +89"CCsGAQUFBwMDMA0GCSqGSIb3DQEBBAUAA4GBAKJ71ZiCUykkJrCLYUxlFlhvUcr9\n" +90"sTcOc67QdroW5f412NI15SXWDiley/JOasIiuIFPjaJBjOKoHOvTjG/snVu9wEgq\n" +91"YNR8dPsO+NM8r79C6jO+Jx5fYAC7os2XxS75h3NX0ElJcbwIXGBJ6xRrsFh/BGYH\n" +92"yvudOlX4BkVR0l1K\n" +93"-----END CERTIFICATE-----";9495// Private key in the format of PKCS#8.96static String targetPrivateKey =97"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMA55vepsH1wh+G4\n" +98"F5NVEtFXCbEFcVLRjMp3AL3jLswczczpimT3qsmF9RboeKvnLs2tN1kyXRvZzpDa\n" +99"9+uHt0Z9Wmh4wjHAZhX5Tm5xp4YbnzZiBmKICfXST5oVFTxFQF6zBvgnrDSsthPM\n" +100"KBpyzK6rusorkwpWywTyvH1s016xAgMBAAECgYEAn9bF3oRkdDoBU0i/mcww5I+K\n" +101"SH9tFt+WQbiojjz9ac49trkvUfu7MO1Jui2+QbrvaSkyj+HYGFOJd1wMsPXeB7ck\n" +102"5mOIYV4uZK8jfNMSQ8v0tFEeIPp5lKdw1XnrQfSe+abo2eL5Lwso437Y4s3w37+H\n" +103"aY3d76hR5qly+Ys+Ww0CQQDjeOoX89d/xhRqGXKjCx8ImE/dPmsI8O27cwtKrDYJ\n" +104"6t0v/xryVIdvOYcRBvKnqEogOH7T1kI+LnWKUTJ2ehJ7AkEA2FVloPVqCehXcc7e\n" +105"z3TDpU9w1B0JXklcV5HddYsRqp9RukN/VK4szKE7F1yoarIUtfE9Lr9082Jwyp3M\n" +106"L11xwwJBAKsZ+Hur3x0tUY29No2Nf/pnFyvEF57SGwA0uPmiL8Ol9lpz+UDudDEl\n" +107"hIM6Rqv12kwCMuQE9i7vo1o3WU3k5KECQEqhg1L49yD935TqiiFFpe0Ur9btQXse\n" +108"kdXAA4d2d5zGI7q/aGD9SYU6phkUJSHR16VA2RuUfzMrpb+wmm1IrmMCQFtLoKRT\n" +109"A5kokFb+E3Gplu29tJvCUpfwgBFRS+wmkvtiaU/tiyDcVgDO+An5DwedxxdVzqiE\n" +110"njWHoKY3axDQ8OU=\n";111112static char passphrase[] = "passphrase".toCharArray();113114@Override115protected SSLContext createServerSSLContext() throws Exception {116return generateSSLContext();117}118119@Override120protected void configureServerSocket(SSLServerSocket socket) {121socket.setNeedClientAuth(true);122}123124@Override125protected void runServerApplication(SSLSocket socket) throws Exception {126InputStream sslIS = socket.getInputStream();127OutputStream sslOS = socket.getOutputStream();128129try {130sslIS.read();131sslOS.write('A');132sslOS.flush();133} catch (SSLException | SocketException se) {134if (!expectFail) {135throw se;136} // Otherwise, ignore.137}138}139140@Override141protected SSLContext createClientSSLContext() throws Exception {142return generateSSLContext();143}144145@Override146protected void runClientApplication(SSLSocket socket) throws Exception {147// enable the specified TLS protocol148socket.setEnabledProtocols(new String[] { tlsProtocol });149150InputStream sslIS = socket.getInputStream();151OutputStream sslOS = socket.getOutputStream();152153try {154sslOS.write('B');155sslOS.flush();156sslIS.read();157} catch (SSLHandshakeException e) {158if (expectFail) {159// focus on the CertPathValidatorException160Throwable t = e.getCause().getCause();161if (t == null || !t.toString().contains("MD5withRSA")) {162throw new RuntimeException(163"Expected to see MD5withRSA in exception output", t);164}165} else {166throw e;167}168}169}170171/*172* =============================================================173* The remainder is just support stuff174*/175private static String tmAlgorithm; // trust manager176private static String tlsProtocol; // trust manager177// set this flag to test context of CertificateException178private static boolean expectFail;179180private static void parseArguments(String[] args) {181tmAlgorithm = args[0];182tlsProtocol = args[1];183expectFail = Boolean.parseBoolean(args[2]);184}185186private static SSLContext generateSSLContext() throws Exception {187188// generate certificate from cert string189CertificateFactory cf = CertificateFactory.getInstance("X.509");190191// create a key store192KeyStore ks = KeyStore.getInstance("JKS");193ks.load(null, null);194195// import the trused cert196X509Certificate trusedCert = null;197ByteArrayInputStream is =198new ByteArrayInputStream(trustedCertStr.getBytes());199trusedCert = (X509Certificate)cf.generateCertificate(is);200is.close();201202ks.setCertificateEntry("Trusted RSA Signer", trusedCert);203204// generate the private key.205PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec(206Base64.getMimeDecoder().decode(targetPrivateKey));207KeyFactory kf = KeyFactory.getInstance("RSA");208RSAPrivateKey priKey =209(RSAPrivateKey)kf.generatePrivate(priKeySpec);210211// generate certificate chain212is = new ByteArrayInputStream(targetCertStr.getBytes());213X509Certificate keyCert = (X509Certificate)cf.generateCertificate(is);214is.close();215216X509Certificate[] chain = new X509Certificate[2];217chain[0] = keyCert;218chain[1] = trusedCert;219220// import the key entry and the chain221ks.setKeyEntry("TheKey", priKey, passphrase, chain);222223// create SSL context224TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmAlgorithm);225tmf.init(ks);226227// create the customized KM and TM228NoneExtendedX509TM myTM =229new NoneExtendedX509TM(tmf.getTrustManagers()[0]);230NoneExtendedX509KM myKM =231new NoneExtendedX509KM("TheKey", chain, priKey);232233SSLContext ctx = SSLContext.getInstance(tlsProtocol);234// KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509");235// kmf.init(ks, passphrase);236// ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);237ctx.init(new KeyManager[]{myKM}, new TrustManager[]{myTM}, null);238ks = null;239240return ctx;241}242243static class NoneExtendedX509TM implements X509TrustManager {244X509TrustManager tm;245246NoneExtendedX509TM(TrustManager tm) {247this.tm = (X509TrustManager)tm;248}249250public void checkClientTrusted(X509Certificate chain[], String authType)251throws CertificateException {252tm.checkClientTrusted(chain, authType);253}254255public void checkServerTrusted(X509Certificate chain[], String authType)256throws CertificateException {257tm.checkServerTrusted(chain, authType);258}259260public X509Certificate[] getAcceptedIssuers() {261return tm.getAcceptedIssuers();262}263}264265static class NoneExtendedX509KM implements X509KeyManager {266private String keyAlias;267private X509Certificate[] chain;268private PrivateKey privateKey;269270NoneExtendedX509KM(String keyAlias, X509Certificate[] chain,271PrivateKey privateKey) {272this.keyAlias = keyAlias;273this.chain = chain;274this.privateKey = privateKey;275}276277public String[] getClientAliases(String keyType, Principal[] issuers) {278return new String[] {keyAlias};279}280281public String chooseClientAlias(String[] keyType, Principal[] issuers,282Socket socket) {283return keyAlias;284}285286public String[] getServerAliases(String keyType, Principal[] issuers) {287return new String[] {keyAlias};288}289290public String chooseServerAlias(String keyType, Principal[] issuers,291Socket socket) {292return keyAlias;293}294295public X509Certificate[] getCertificateChain(String alias) {296return chain;297}298299public PrivateKey getPrivateKey(String alias) {300return privateKey;301}302}303304public static void main(String[] args) throws Exception {305/*306* Get the customized arguments.307*/308parseArguments(args);309310/*311* MD5 is used in this test case, don't disable MD5 algorithm.312* if expectFail is set, we're testing exception message313*/314if (!expectFail) {315Security.setProperty("jdk.certpath.disabledAlgorithms",316"MD2, RSA keySize < 1024");317}318Security.setProperty("jdk.tls.disabledAlgorithms",319"SSLv3, RC4, DH keySize < 768");320321/*322* Start the tests.323*/324new TrustTrustedCert().run();325}326}327328329