提交 63aae8a1 编写于 作者: X xuelei

7115524: sun.security.provider.certpath.ssl.SSLServerCertStore no longer works

Reviewed-by: weijun
上级 b16829c9
...@@ -44,12 +44,16 @@ import java.security.cert.CertStoreSpi; ...@@ -44,12 +44,16 @@ import java.security.cert.CertStoreSpi;
import java.security.cert.CRLSelector; import java.security.cert.CRLSelector;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.security.cert.X509CRL; import java.security.cert.X509CRL;
import java.net.Socket;
import java.net.URLConnection;
import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; import javax.net.ssl.X509ExtendedTrustManager;
/** /**
* A CertStore that retrieves an SSL server's certificate chain. * A CertStore that retrieves an SSL server's certificate chain.
...@@ -57,32 +61,75 @@ import javax.net.ssl.X509TrustManager; ...@@ -57,32 +61,75 @@ import javax.net.ssl.X509TrustManager;
public final class SSLServerCertStore extends CertStoreSpi { public final class SSLServerCertStore extends CertStoreSpi {
private final URI uri; private final URI uri;
private final static GetChainTrustManager trustManager;
private final static SSLSocketFactory socketFactory;
private final static HostnameVerifier hostnameVerifier;
static {
trustManager = new GetChainTrustManager();
hostnameVerifier = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
SSLSocketFactory tempFactory;
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, new TrustManager[] { trustManager }, null);
tempFactory = context.getSocketFactory();
} catch (GeneralSecurityException gse) {
tempFactory = null;
}
socketFactory = tempFactory;
}
SSLServerCertStore(URI uri) throws InvalidAlgorithmParameterException { SSLServerCertStore(URI uri) throws InvalidAlgorithmParameterException {
super(null); super(null);
this.uri = uri; this.uri = uri;
} }
public synchronized Collection<X509Certificate> engineGetCertificates public Collection<X509Certificate> engineGetCertificates
(CertSelector selector) throws CertStoreException (CertSelector selector) throws CertStoreException {
{
try { try {
SSLContext sc = SSLContext.getInstance("SSL"); URLConnection urlConn = uri.toURL().openConnection();
GetChainTrustManager xtm = new GetChainTrustManager(); if (urlConn instanceof HttpsURLConnection) {
sc.init(null, new TrustManager[] { xtm }, null); if (socketFactory == null) {
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); throw new CertStoreException(
HttpsURLConnection.setDefaultHostnameVerifier( "No initialized SSLSocketFactory");
new HostnameVerifier() { }
public boolean verify(String hostname, SSLSession session) {
return true; HttpsURLConnection https = (HttpsURLConnection)urlConn;
https.setSSLSocketFactory(socketFactory);
https.setHostnameVerifier(hostnameVerifier);
synchronized (trustManager) {
try {
https.connect();
return getMatchingCerts(
trustManager.serverChain, selector);
} catch (IOException ioe) {
// If the server certificate has already been
// retrieved, don't mind the connection state.
if (trustManager.exchangedServerCerts) {
return getMatchingCerts(
trustManager.serverChain, selector);
} }
});
uri.toURL().openConnection().connect(); // otherwise, rethrow the exception
return getMatchingCerts(xtm.serverChain, selector); throw ioe;
} catch (GeneralSecurityException | IOException e) { } finally {
throw new CertStoreException(e); trustManager.cleanup();
} }
} }
}
} catch (IOException ioe) {
throw new CertStoreException(ioe);
}
return Collections.<X509Certificate>emptySet();
}
private static List<X509Certificate> getMatchingCerts private static List<X509Certificate> getMatchingCerts
(List<X509Certificate> certs, CertSelector selector) (List<X509Certificate> certs, CertSelector selector)
...@@ -106,37 +153,77 @@ public final class SSLServerCertStore extends CertStoreSpi { ...@@ -106,37 +153,77 @@ public final class SSLServerCertStore extends CertStoreSpi {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
static synchronized CertStore getInstance(URI uri) static CertStore getInstance(URI uri)
throws InvalidAlgorithmParameterException throws InvalidAlgorithmParameterException
{ {
return new CS(new SSLServerCertStore(uri), null, "SSLServer", null); return new CS(new SSLServerCertStore(uri), null, "SSLServer", null);
} }
/* /*
* An X509TrustManager that simply stores a reference to the server's * An X509ExtendedTrustManager that ignores the server certificate
* certificate chain. * validation.
*/ */
private static class GetChainTrustManager implements X509TrustManager { private static class GetChainTrustManager
private List<X509Certificate> serverChain; extends X509ExtendedTrustManager {
private List<X509Certificate> serverChain =
Collections.<X509Certificate>emptyList();
private boolean exchangedServerCerts = false;
@Override
public X509Certificate[] getAcceptedIssuers() { public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException(); return new X509Certificate[0];
} }
@Override
public void checkClientTrusted(X509Certificate[] chain, public void checkClientTrusted(X509Certificate[] chain,
String authType) String authType) throws CertificateException {
throws CertificateException
{ throw new UnsupportedOperationException();
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType,
Socket socket) throws CertificateException {
throw new UnsupportedOperationException();
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType,
SSLEngine engine) throws CertificateException {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public void checkServerTrusted(X509Certificate[] chain, public void checkServerTrusted(X509Certificate[] chain,
String authType) String authType) throws CertificateException {
throws CertificateException
{ exchangedServerCerts = true;
this.serverChain = (chain == null) this.serverChain = (chain == null)
? Collections.<X509Certificate>emptyList() ? Collections.<X509Certificate>emptyList()
: Arrays.asList(chain); : Arrays.<X509Certificate>asList(chain);
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType,
Socket socket) throws CertificateException {
checkServerTrusted(chain, authType);
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType,
SSLEngine engine) throws CertificateException {
checkServerTrusted(chain, authType);
}
void cleanup() {
exchangedServerCerts = false;
serverChain = Collections.<X509Certificate>emptyList();
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册