1

Web サイトとの SSL ハンドシェイクを作成しようとする Java コードがあります。Web サイトの SSL 証明書が自己署名されているか、安全でないオプションを使用している場合、エラーが発生し、コードで証明書を抽出できません。

SSLSocket socket=null;
SSLSocketFactory factory=null;
factory = HttpsURLConnection.getDefaultSSLSocketFactory();

try{
    socket = (SSLSocket) factory.createSocket(host, port);          
    System.out.println("listen on port "+port+" for host "+host);

    } //end try

    catch (IOException ex)
        {
            //remote host is not listening on port 443
            System.out.println("Can not listen on port "+port+" of host"+host);
        } //end catch

        System.out.println("Creating a SSL Socket For "+host+" on port "+port);
        SSLSession ss = socket.getSession();
        socket.startHandshake(); // start the handshake
        System.out.println("Handshake Done");

例として、次のエラーが表示されます。

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Insecure renegotiation is not allowed

自己署名および弱い ssl 構成での完全なハンドシェイクを Java コードが受け入れるようにするにはどうすればよいですか?

4

1 に答える 1

1

ここには、少なくとも 3 つの問題が考えられます。SSL/TLS 構成を弱体化することは、ほとんどの場合、悪い考えです。

  • 最初に、デフォルトでは有効になっていないいくつかの暗号スイートを有効にできます。サポートされているものとデフォルトで有効になっているものは、Sun Provider のドキュメントに一覧表示されています。/で使用setEnabledCipherSuitesして、特定の暗号スイートを有効にすることができます。脚注と、TLS 仕様の特定の暗号スイートに関する注記を読む価値があります(特に、匿名暗号スイートによって提供されるセキュリティの欠如)。SSLSocketSSLEngine

  • 再交渉の問題は少し異なります。更新で導入されたシステム プロパティを使用できますsun.security.ssl.allowUnsafeRenegotiation。名前が示すように、安全ではありません。

  • 証明書を受け入れることは別の問題です。一般に、念頭に置いている特定の証明書をインポートする必要があります。ただし、サーバー証明書をチェックするときに例外をスローしないSSLContextからを構築できます。X509TrustManagerこの安全でないコードの例は、ここや他のサイトにたくさんあります。

JSSE のデフォルトの動作は、かなり賢明な傾向があります。安全でない動作の導入は慎重に行う必要があります。学習/実験は問題ありませんが、実稼働ソフトウェア (またはプロトタイプ) でそれを行うことは疑わしいものです。

于 2012-10-08T00:10:08.340 に答える