0

JDKのバグが原因ですべての証明書やDeffieHellmanのターンを信頼したい場合は、基本的に切り替えることができるユーティリティSSLSocketFactoryクラスがあります。最近、独自のSSLSocketFactoryを提供するオプションを追加しましたが、何かを忘れているようです

Diffie Hellmanを無効にすることは、ソケットを作成するときにコードを追加するだけで、ファクトリで簡単に実行できます。ただし、すべての証明書を信頼するために、工場を別の証明書に置き換えます

    public UtilSSLSocketFactory trustAllCertificates() {
            if (trustingAllCertificates)
                    //Already doing this, no need to do it again
                    return this;
            trustingAllCertificates = true;
            try {
                    TrustManager[] tm = new TrustManager[]{new TrustingX509TrustManager()};
                    SSLContext context = SSLContext.getInstance("SSL");
                    context.init(new KeyManager[0], tm, new SecureRandom());
                    wrappedFactory = (SSLSocketFactory) context.getSocketFactory();
            } catch (Exception e) {
                    throw new RuntimeException("Can't recreate socket factory that trusts all certificates", e);
            }
            return this;
    }

任意のSSLSocketFactoryに、それを置き換えることなくすべての証明書を信頼するように指示する方法はありますか?

4

3 に答える 3

4

すべての証明書をやみくもに信頼することは一般的に悪い考えであるという事実に加えて (通信を保護するために SSL/TLS を使用したい場合)、使用しているパターンはかなり奇妙に思えます。

SSLContextは のファクトリーでSSLSocketFactoryあり、これは のファクトリーですSSLSocket

必要に応じて、SSLContext(Java 6 以降) を使用してデフォルトを設定できますSSLContext.setDefault(...)。これはデフォルトに影響しますSSLSocketFactoryが、より具体的なものには影響しない可能性があります。

SSLContext既存のSSLSocketFactoryインスタンスで使用されているを変更することはできません。

既存SSLSocketFactoryの実装が特定の設定でデフォルトの実装と異なっていない限り (たとえば、作成されたソケットを返す前に調整するもの)、ここで意図した設計パターンに適合していないようです。

于 2012-05-23T18:24:58.977 に答える
2

すべての証明書を置き換えずに信頼するための任意の SSLSocketFactory

いいえ。独自のカスタム「すべての証明書を信頼する」マネージャーを設定する必要がcacertsあります。そうしないと、JDK インストールに ある Java のデフォルトのトラストストアを「参照」するデフォルトのマネージャーが使用されます。

ただし、セキュリティの観点からは、サーバー認証を使用しない場合は、実際にはセキュリティがまったくないため、プレーン TCP を使用して SSL オーバーヘッドを回避することもできます。

于 2012-05-23T17:24:04.733 に答える
-1

このコードを試してください....それは機能するコードです。このクラスをコードで次のように使用します

HttpClient client = MySSLSocketFactory.getNewHttpClient();

ここにコードがあります

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

public class MySSLSocketFactory extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
       super(truststore);

       TrustManager tm = new X509TrustManager() {
           public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
           }

           public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
           }

           public X509Certificate[] getAcceptedIssuers() {
               return null;
           }
       };

       sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
       return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
       return sslContext.getSocketFactory().createSocket();
    }


public static HttpClient getNewHttpClient() {
    try {
       KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
       trustStore.load(null, null);

       SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
       sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

       HttpParams params = new BasicHttpParams();
       HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
       HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

       SchemeRegistry registry = new SchemeRegistry();
       registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
       registry.register(new Scheme("https", sf, 443));

       ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

       return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
       return new DefaultHttpClient();
    }
}

}
于 2012-05-23T17:51:31.147 に答える