History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/security/ssl/X509TrustManagerImpl.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/security/ssl/X509TrustManagerImpl.java+359−0
@@ -0,0 +1,359 @@
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26
27package sun.security.ssl;
28
29import java.net.Socket;
30import javax.net.ssl.SSLSession;
31
32import java.util.*;
33import java.security.*;
34import java.security.cert.*;
35
36import javax.net.ssl.*;
37
38import sun.security.validator.*;
39
40import sun.security.util.HostnameChecker;
41
42/**
43 * This class implements the SunJSSE X.509 trust manager using the internal
44 * validator API in J2SE core. The logic in this class is minimal.<p>
45 * <p>
46 * This class supports both the Simple validation algorithm from previous
47 * JSSE versions and PKIX validation. Currently, it is not possible for the
48 * application to specify PKIX parameters other than trust anchors. This will
49 * be fixed in a future release using new APIs. When that happens, it may also
50 * make sense to separate the Simple and PKIX trust managers into separate
51 * classes.
52 *
53 * @author Andreas Sterbenz
54 */
55final class X509TrustManagerImpl extends X509ExtendedTrustManager
56 implements X509TrustManager {
57
58 private final String validatorType;
59
60 /**
61 * The Set of trusted X509Certificates.
62 */
63 private final Collection<X509Certificate> trustedCerts;
64
65 private final PKIXBuilderParameters pkixParams;
66
67 // note that we need separate validator for client and server due to
68 // the different extension checks. They are initialized lazily on demand.
69 private volatile Validator clientValidator, serverValidator;
70
71 private static final Debug debug = Debug.getInstance("ssl");
72
73 X509TrustManagerImpl(String validatorType, KeyStore ks)
74 throws KeyStoreException {
75 this.validatorType = validatorType;
76 this.pkixParams = null;
77 if (ks == null) {
78 trustedCerts = Collections.<X509Certificate>emptySet();
79 } else {
80 trustedCerts = KeyStores.getTrustedCerts(ks);
81 }
82 showTrustedCerts();
83 }
84
85 X509TrustManagerImpl(String validatorType, PKIXBuilderParameters params) {
86 this.validatorType = validatorType;
87 this.pkixParams = params;
88 // create server validator eagerly so that we can conveniently
89 // get the trusted certificates
90 // clients need it anyway eventually, and servers will not mind
91 // the little extra footprint
92 Validator v = getValidator(Validator.VAR_TLS_SERVER);
93 trustedCerts = v.getTrustedCertificates();
94 serverValidator = v;
95 showTrustedCerts();
96 }
97
98 @Override
99 public void checkClientTrusted(X509Certificate chain[], String authType)
100 throws CertificateException {
101 checkTrusted(chain, authType, (Socket)null, true);
102 }
103
104 @Override
105 public void checkServerTrusted(X509Certificate chain[], String authType)
106 throws CertificateException {
107 checkTrusted(chain, authType, (Socket)null, false);
108 }
109
110 @Override
111 public X509Certificate[] getAcceptedIssuers() {
112 X509Certificate[] certsArray = new X509Certificate[trustedCerts.size()];
113 trustedCerts.toArray(certsArray);
114 return certsArray;
115 }
116
117 @Override
118 public void checkClientTrusted(X509Certificate[] chain, String authType,
119 Socket socket) throws CertificateException {
120 checkTrusted(chain, authType, socket, true);
121 }
122
123 @Override
124 public void checkServerTrusted(X509Certificate[] chain, String authType,
125 Socket socket) throws CertificateException {
126 checkTrusted(chain, authType, socket, false);
127 }
128
129 @Override
130 public void checkClientTrusted(X509Certificate[] chain, String authType,
131 SSLEngine engine) throws CertificateException {
132 checkTrusted(chain, authType, engine, true);
133 }
134
135 @Override
136 public void checkServerTrusted(X509Certificate[] chain, String authType,
137 SSLEngine engine) throws CertificateException {
138 checkTrusted(chain, authType, engine, false);
139 }
140
141 private Validator checkTrustedInit(X509Certificate[] chain,
142 String authType, boolean isClient) {
143 if (chain == null || chain.length == 0) {
144 throw new IllegalArgumentException(
145 "null or zero-length certificate chain");
146 }
147
148 if (authType == null || authType.length() == 0) {
149 throw new IllegalArgumentException(
150 "null or zero-length authentication type");
151 }
152
153 Validator v = null;
154 if (isClient) {
155 v = clientValidator;
156 if (v == null) {
157 synchronized (this) {
158 v = clientValidator;
159 if (v == null) {
160 v = getValidator(Validator.VAR_TLS_CLIENT);
161 clientValidator = v;
162 }
163 }
164 }
165 } else {
166 // assume double checked locking with a volatile flag works
167 // (guaranteed under the new Tiger memory model)
168 v = serverValidator;
169 if (v == null) {
170 synchronized (this) {
171 v = serverValidator;
172 if (v == null) {
173 v = getValidator(Validator.VAR_TLS_SERVER);
174 serverValidator = v;
175 }
176 }
177 }
178 }
179
180 return v;
181 }
182
183
184 private void checkTrusted(X509Certificate[] chain, String authType,
185 Socket socket, boolean isClient) throws CertificateException {
186 Validator v = checkTrustedInit(chain, authType, isClient);
187
188 AlgorithmConstraints constraints = null;
189 if ((socket != null) && socket.isConnected() &&
190 (socket instanceof SSLSocket)) {
191
192 SSLSocket sslSocket = (SSLSocket)socket;
193 SSLSession session = sslSocket.getHandshakeSession();
194 if (session == null) {
195 throw new CertificateException("No handshake session");
196 }
197
198 // check endpoint identity
199 String identityAlg = sslSocket.getSSLParameters().
200 getEndpointIdentificationAlgorithm();
201 if (identityAlg != null && identityAlg.length() != 0) {
202 String hostname = session.getPeerHost();
203 checkIdentity(hostname, chain[0], identityAlg);
204 }
205
206 // create the algorithm constraints
207 ProtocolVersion protocolVersion =
208 ProtocolVersion.valueOf(session.getProtocol());
209 if (protocolVersion.v >= ProtocolVersion.TLS12.v) {
210 if (session instanceof ExtendedSSLSession) {
211 ExtendedSSLSession extSession =
212 (ExtendedSSLSession)session;
213 String[] localSupportedSignAlgs =
214 extSession.getLocalSupportedSignatureAlgorithms();
215
216 constraints = new SSLAlgorithmConstraints(
217 sslSocket, localSupportedSignAlgs, false);
218 } else {
219 constraints =
220 new SSLAlgorithmConstraints(sslSocket, false);
221 }
222 } else {
223 constraints = new SSLAlgorithmConstraints(sslSocket, false);
224 }
225 }
226
227 X509Certificate[] trustedChain = null;
228 if (isClient) {
229 trustedChain = validate(v, chain, constraints, null);
230 } else {
231 trustedChain = validate(v, chain, constraints, authType);
232 }
233 if (debug != null && Debug.isOn("trustmanager")) {
234 System.out.println("Found trusted certificate:");
235 System.out.println(trustedChain[trustedChain.length - 1]);
236 }
237 }
238
239 private void checkTrusted(X509Certificate[] chain, String authType,
240 SSLEngine engine, boolean isClient) throws CertificateException {
241 Validator v = checkTrustedInit(chain, authType, isClient);
242
243 AlgorithmConstraints constraints = null;
244 if (engine != null) {
245 SSLSession session = engine.getHandshakeSession();
246 if (session == null) {
247 throw new CertificateException("No handshake session");
248 }
249
250 // check endpoint identity
251 String identityAlg = engine.getSSLParameters().
252 getEndpointIdentificationAlgorithm();
253 if (identityAlg != null && identityAlg.length() != 0) {
254 String hostname = session.getPeerHost();
255 checkIdentity(hostname, chain[0], identityAlg);
256 }
257
258 // create the algorithm constraints
259 ProtocolVersion protocolVersion =
260 ProtocolVersion.valueOf(session.getProtocol());
261 if (protocolVersion.v >= ProtocolVersion.TLS12.v) {
262 if (session instanceof ExtendedSSLSession) {
263 ExtendedSSLSession extSession =
264 (ExtendedSSLSession)session;
265 String[] localSupportedSignAlgs =
266 extSession.getLocalSupportedSignatureAlgorithms();
267
268 constraints = new SSLAlgorithmConstraints(
269 engine, localSupportedSignAlgs, false);
270 } else {
271 constraints =
272 new SSLAlgorithmConstraints(engine, false);
273 }
274 } else {
275 constraints = new SSLAlgorithmConstraints(engine, false);
276 }
277 }
278
279 X509Certificate[] trustedChain = null;
280 if (isClient) {
281 trustedChain = validate(v, chain, constraints, null);
282 } else {
283 trustedChain = validate(v, chain, constraints, authType);
284 }
285 if (debug != null && Debug.isOn("trustmanager")) {
286 System.out.println("Found trusted certificate:");
287 System.out.println(trustedChain[trustedChain.length - 1]);
288 }
289 }
290
291 private void showTrustedCerts() {
292 if (debug != null && Debug.isOn("trustmanager")) {
293 for (X509Certificate cert : trustedCerts) {
294 System.out.println("adding as trusted cert:");
295 System.out.println(" Subject: "
296 + cert.getSubjectX500Principal());
297 System.out.println(" Issuer: "
298 + cert.getIssuerX500Principal());
299 System.out.println(" Algorithm: "
300 + cert.getPublicKey().getAlgorithm()
301 + "; Serial number: 0x"
302 + cert.getSerialNumber().toString(16));
303 System.out.println(" Valid from "
304 + cert.getNotBefore() + " until "
305 + cert.getNotAfter());
306 System.out.println();
307 }
308 }
309 }
310
311 private Validator getValidator(String variant) {
312 Validator v;
313 if (pkixParams == null) {
314 v = Validator.getInstance(validatorType, variant, trustedCerts);
315 } else {
316 v = Validator.getInstance(validatorType, variant, pkixParams);
317 }
318 return v;
319 }
320
321 private static X509Certificate[] validate(Validator v,
322 X509Certificate[] chain, AlgorithmConstraints constraints,
323 String authType) throws CertificateException {
324 Object o = JsseJce.beginFipsProvider();
325 try {
326 return v.validate(chain, null, constraints, authType);
327 } finally {
328 JsseJce.endFipsProvider(o);
329 }
330 }
331
332 /*
333 * Identify the peer by its certificate and hostname.
334 *
335 * Lifted from sun.net.www.protocol.https.HttpsClient.
336 */
337 static void checkIdentity(String hostname, X509Certificate cert,
338 String algorithm) throws CertificateException {
339 if (algorithm != null && algorithm.length() != 0) {
340 // if IPv6 strip off the "[]"
341 if ((hostname != null) && hostname.startsWith("[") &&
342 hostname.endsWith("]")) {
343 hostname = hostname.substring(1, hostname.length() - 1);
344 }
345
346 if (algorithm.equalsIgnoreCase("HTTPS")) {
347 HostnameChecker.getInstance(HostnameChecker.TYPE_TLS).match(
348 hostname, cert);
349 } else if (algorithm.equalsIgnoreCase("LDAP") ||
350 algorithm.equalsIgnoreCase("LDAPS")) {
351 HostnameChecker.getInstance(HostnameChecker.TYPE_LDAP).match(
352 hostname, cert);
353 } else {
354 throw new CertificateException(
355 "Unknown identification algorithm: " + algorithm);
356 }
357 }
358 }
359}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t