java.security.NoSuchAlgorithmException:X509 KeyManagerFactory 不可用

问题描述 投票:0回答:4

我想创建 SSL 连接。我创建了密钥库。并尝试使用 x509。

 final KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");

但是运行后我在控制台上遇到以下异常。

java.security.NoSuchAlgorithmException:X509 KeyManagerFactory 不可用 在 sun.security.jca.GetInstance.getInstance(来源未知) 在 javax.net.ssl.KeyManagerFactory.getInstance(来源未知) SSLContext sc = SSLContext.getInstance(connectionType); 最终 char[] keyPassPhrase = "changeit".toCharArray(); //String[]数组 = Security.getProviders(); 最终 KeyStore ks = KeyStore.getInstance("jks");

        ks.load(new FileInputStream("ClientKeyStore"), keyPassPhrase);
        provider();
        final KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509"); // this line is problem

        // SunX509 : supporting only: [TLSv1, TLSv1.1, TLSv1.2]
        kmf.init(ks, keyPassPhrase);

        sc.init(kmf.getKeyManagers(), new TrustManager[] {
                new X509TrustManager(){
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    @Override
                    public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                            throws CertificateException {

                    }
                    public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                            throws CertificateException {
                    }
                }
        },new SecureRandom());
        SSLSocketFactory factory = sc.getSocketFactory();
        SSLSocket socket=null;
        try{
            //socket = (SSLSocket) factory.createSocket("XXXX",xxxx);/
            socket = (SSLSocket) factory.createSocket(ipAddress, Integer.parseInt(ports[portIndex]));

            //convert to array
            String[] cipherSelectedArray;
            if(isSupported == 1 ) {
                cipherSelectedArray = new String[] {msupportedcipherList.get(cipherIndex).trim()};
            }
            else {
                cipherSelectedArray = new String[] {mnotSupportedcipherList.get(cipherIndex).trim()};
            }

            String []mselectedSSLOrTLSVersionArrray = new String[] {mselectedSSLOrTLSVersion};   // if passing these --> getting connection timeout

            socket.setEnabledProtocols(mselectedSSLOrTLSVersionArrray);
            socket.setEnabledCipherSuites(cipherSelectedArray);
            for(int i = 0; i<cipherSelectedArray.length ; i++) {
                //System.out.println("ciphers are :" +  cipherSelectedArray[i]);
            }


            socket.setSoTimeout(15000);

            socket.addHandshakeCompletedListener(new HandshakeCompletedListener() {

                @Override
                public void handshakeCompleted(HandshakeCompletedEvent event) {
                    ////System.out.println("completed");

                }
            });



            socket.startHandshake(); //handshake                                            as "SunX509" does not support SSL. I need to create above one. Can someone help.   And also with "SunX509" i am getting                                              java.lang.IllegalArgumentException: Cannot support TLS_RSA_WITH_AES_256_CBC_SHA with currently installed providers problem with some ciphers. please help
java ssl cryptography
4个回答
8
投票

您使用的参数

X509
算法提供商无法识别。

正如描述的getInstance(String算法)原因很清楚。

NoSuchAlgorithmException - 如果没有提供者支持指定算法的 KeyManagerFactorySpi 实现。

标准算法描述于here

我猜他们支持

PKIX, SunX509
这两种算法
KeyManagerFactory

所以你必须使用

SunX509
而不是
X509

请参阅此处的表格


3
投票

阅读堆栈跟踪告诉您的内容:

java.security.NoSuchAlgorithmException:X509 KeyManagerFactory 不可用

您使用的安全提供商无法提供

X509
算法。但是,以下代码应该适合您:

final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

请查看这篇 Code Ranch 文章,其中讨论了您的问题,并展示了如何找出您的提供商提供了哪些安全算法。


3
投票

使用“SunX509”的问题是它特定于 Oracle JRE,在 IBM JRE 中不起作用,IBM JRE 的默认值为“IbmX509”。与供应商无关的更好解决方案是:

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

默认算法由

<JRE_HOME>/lib/security/java.security
中的安全属性“ssl.keyManagerFactory.algorithm”定义,在 Oracle 中默认为“SunX509”,在 IBM JRE 中默认为“IbmX509”(至少对于 Java 8)。


0
投票

क्या माथा पच्ची हे यार... टेंशनमतलोयेतोरोजकारंडीरोनाहे!

अवार्ड अंशुमान就像:अब्भी ठीक कर के देता हु

首先检查JDK jre的java.security中是否有需要的算法 就我而言,我只是更改了算法的顺序,并在 Java.security 中添加了一个安全提供程序,它就起作用了。

  1. 增加的安全性提供:

security.provider.12=sun.x.rsa.SunRsaSign

  1. 改变了算法顺序:

来自:

ssl.KeyManagerFactory.algorithm=SunX509

ssl.TrustManagerFactory.algorithm=PKIX

ssl.TrustManagerFactory.algorithm=PKIX

ssl.KeyManagerFactory.algorithm=SunX509

java.security路径:\jdk1.7.0_25\jre\lib\security\java.security

© www.soinside.com 2019 - 2024. All rights reserved.