首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.security.NoSuchAlgorithmException: X509 KeyManagerFactory不可用

java.security.NoSuchAlgorithmException: X509 KeyManagerFactory不可用
EN

Stack Overflow用户
提问于 2016-03-23 05:22:39
回答 3查看 20.2K关注 0票数 2

我想要创建SSL连接。我创建了密钥存储库。并试图使用x509。

代码语言:javascript
复制
 final KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");

但是在运行完之后,我在控制台上得到了异常。

sun.security.jca.GetInstance.getInstance(Unknown java.security.NoSuchAlgorithmException: X509 KeyManagerFactory (在javax.net.ssl.KeyManagerFactory.getInstance(Unknown Source) ) SSLContext sc = SSLContext.getInstance(connectionType);final char[] keyPassPhrase = "changeit".toCharArray();//String [] array = Security.getProviders();final KeyStore ks = KeyStore.getInstance("jks");

代码语言:javascript
复制
        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
EN

回答 3

Stack Overflow用户

发布于 2016-03-23 05:39:24

算法提供程序无法识别您使用的X509参数。

正如所描述的getInstance(字符串算法),原因是明确的。

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

标准算法被描述为这里

我想他们支持PKIX, SunX509KeyManagerFactory中的这两种算法

因此,您必须使用SunX509而不是X509

看这里的桌子

票数 7
EN

Stack Overflow用户

发布于 2016-03-23 05:33:54

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

java.security.NoSuchAlgorithmException: X509 KeyManagerFactory不可用

您正在使用的安全提供程序无法使用X509算法。但是,下面的代码应该适用于您:

代码语言:javascript
复制
final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

请看一下这个代码牧场文章,它讨论了您的问题,并展示了如何从您的提供者那里找到哪些安全算法。

票数 3
EN

Stack Overflow用户

发布于 2018-12-12 07:48:40

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

代码语言:javascript
复制
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

默认算法由<JRE_HOME>/lib/security/java.security中的安全属性"SunX509“定义,默认情况下,在Oracle中为”SunX509“,在IBM中为"IbmX509”(至少对于Java8)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36170406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档