1

我有一个尝试与网站创建 ssl 握手的 java 代码。当网站的 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

如何让我的 java 代码接受使用自签名和弱 ssl 配置完成握手?

4

1 回答 1

1

这里至少有 3 个可能的问题。削弱 SSL/TLS 配置几乎总是一个坏主意。

  • 首先,您可以启用一些默认未启用的密码套件。Sun Provider 文档中列出了受支持的和默认启用的。您可以setEnabledCipherSuitesSSLSocket/上启用特定密码套件SSLEngine。值得阅读TLS 规范中有关特定密码套件的脚注和注释(特别是匿名密码套件缺乏安全性)。

  • 重新谈判的问题略有不同。您可以使用更新中引入的系统属性sun.security.ssl.allowUnsafeRenegotiation。顾名思义,它是不安全的。

  • 接受任何证书是另一个问题。通常,您应该导入您心目中的特定证书。SSLContext但是,您可以在检查服务器证书时从X509TrustManager不会引发任何异常的情况下构建。此处或其他站点上有许多此类不安全代码的示例。

JSSE 默认行为往往是相当明智的。引入不安全行为应谨慎行事。学习/实验是可以的,但在生产软件(甚至原型)中这样做是有问题的。

于 2012-10-08T00:10:08.340 回答