【问题标题】:java.security.InvalidKeyException: PBES2 AlgorithmParameters not availablejava.security.InvalidKeyException:PBES2 算法参数不可用
【发布时间】:2014-03-12 20:21:02
【问题描述】:

尝试在客户端和服务器之间进行 TLS 握手。但是,它未能通过更改密码规范步骤。同样在客户端收到如下所述的异常:我无法理解为什么我会收到如下所示的奇怪异常。

这是什么意思?有关如何解决此问题的任何想法?

我在 Java 7 下运行它。

java.security.NoSuchAlgorithmException: PBES2 AlgorithmParameters not 可在 sun.security.jca.GetInstance.getInstance(GetInstance.java:159) 在 java.security.Security.getImpl(Security.java:695) 在 java.security.AlgorithmParameters.getInstance(AlgorithmParameters.java:146) 在 com.certicom.security.pkcs.pkcs5.g.(未知来源)在 com.certicom.security.pkcs.pkcs5.i.a(未知来源)在 com.certicom.security.sslplus.b.a(未知来源)在 com.certicom.security.cert.internal.x509.PKCS8.decrypt(未知来源) 在 com.certicom.security.cert.internal.x509.SSLPlusSupport.getLocalIdentity(未知 来源)在 com.certicom.tls.cert.CertLoader.loadLocalIdentity(未知 来源)在 com.certicom.tls.interfaceimpl.i.a(未知来源)在 com.certicom.tls.TLSContext.loadLocalIdentity(未知来源)在 com.onstar.emxp.util.TLSClient.loadCert(TLSClient.java:66) 在 com.onstar.adc.pd.connection.TLSContextLoader.getTLSContext(TLSContextLoader.java:27) 在 com.onstar.adc.pd.PacketClient.run(PacketClient.java:74)

java.security.InvalidKeyException: PBES2 AlgorithmParameters not 可在 com.certicom.security.pkcs.pkcs5.g.(未知 来源)在 com.certicom.security.pkcs.pkcs5.i.a(未知来源)在 com.certicom.security.sslplus.b.a(未知来源)在 com.certicom.security.cert.internal.x509.PKCS8.decrypt(未知来源) 在 com.certicom.security.cert.internal.x509.SSLPlusSupport.getLocalIdentity(未知 来源)在 com.certicom.tls.cert.CertLoader.loadLocalIdentity(未知 来源)在 com.certicom.tls.interfaceimpl.i.a(未知来源)在 com.certicom.tls.TLSContext.loadLocalIdentity(未知来源)在 com.onstar.emxp.util.TLSClient.loadCert(TLSClient.java:66) 在 com.onstar.adc.pd.connection.TLSContextLoader.getTLSContext(TLSContextLoader.java:27) 在 com.onstar.adc.pd.PacketClient.run(PacketClient.java:74)

java.security.KeyManagementException 在 com.certicom.security.cert.internal.x509.SSLPlusSupport.getLocalIdentity(未知 来源)在 com.certicom.tls.cert.CertLoader.loadLocalIdentity(未知 来源)在 com.certicom.tls.interfaceimpl.i.a(未知来源)在 com.certicom.tls.TLSContext.loadLocalIdentity(未知来源)在 com.onstar.emxp.util.TLSClient.loadCert(TLSClient.java:66) 在 com.onstar.adc.pd.connection.TLSContextLoader.getTLSContext(TLSContextLoader.java:27) 在 com.onstar.adc.pd.PacketClient.run(PacketClient.java:74) 警告: 无法加载证书数据包服务器 java.security.KeyManagementException

执行 tls 握手的客户端代码:

    socket = new Socket(host, port);
    InputSSLIOStream inputStream = new InputSSLIOStream(
    socket.getInputStream());
    OutputSSLIOStream outputStream = new OutputSSLIOStream(
    socket.getOutputStream());
    TLSConnection tlsConnection = tlsContextLoader.getTLSContext()
                    .getClientConnection(inputStream, outputStream, "server");
    tlsConnection.startHandshake();
    socket.setSoTimeout(30000);
    OutputStream tlsOutputStream = tlsConnection.getOutputStream();
    InputStream tlsInputStream = tlsConnection.getInputStream();

我的 TLS 上下文加载器:

public class TLSContextLoader
{
    public TLSContext getTLSContext()
            throws Exception
    {
        TLSContext localTLSContext = new TLSContext();
        localTLSContext.setIsStrongCipherSuiteLimited(false);
        localTLSContext.setHelloProtocol("TLS1-ONLY");
        localTLSContext.setEllipticCurves(new String[] { "secp256r1" });
        localTLSContext.setClientAuthModes(new String[] { "ECDSA_SIGN" });
        localTLSContext.setDebugFlag();
        localTLSContext.setEccDraftCompatibility(-1);
        localTLSContext.setX509BasicConstraintBug(true);
        TLSClient.loadCert(localTLSContext, "packetserver");
        localTLSContext.setPSKParam(new byte[] { 49 });
        localTLSContext.loadTrustedCertificates(KeyLoader.getTrustedStream("rootca"));

        localTLSContext.setRNG(new SecureRandom(generateSeed()));
        LocalTrustManager localLocalTrustManager = new LocalTrustManager();
        localTLSContext.setTrustManager(localLocalTrustManager);
        localTLSContext.setEnabledCipherSuites(EMXPArrays.csvToArray("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"));

        localTLSContext.setNeedClientAuth(false);
        return localTLSContext;
    }

    private byte[] generateSeed() {
        String str = new String();
        str = str + "IDH" + System.identityHashCode(str);
        Runtime localRuntime = Runtime.getRuntime();
        str = str + "FM" + localRuntime.freeMemory();
        str = str + "CT" + System.currentTimeMillis();
        Properties localProperties = System.getProperties();
        Enumeration localEnumeration = localProperties.elements();
        while (localEnumeration.hasMoreElements()) {
            str = str + localEnumeration.nextElement();
        }
        str = str + "VHC" + str.hashCode();
        return str.getBytes();
    }
}

【问题讨论】:

    标签: java security ssl


    【解决方案1】:

    上述问题已解决。在客户端使用 certicom 库以确保安全,在服务器端使用 JDK 7 。当客户端和服务器都基于 JDK 7 安全库时,客户端能够与服务器通信并协商握手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2011-02-11
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多