1

.p12ファイルがあり、指定されたプロバイダーでキーストアにロードします。エンコードされた証明書を取得してbase64エンコードに変換します。その後、ネットワークを介してサーバー側に渡し、サーバー側でbase64で取得します。フォーマットし、通常にデコードし、証明書タイプに解析しますが、それを使用して署名を確認すると、例外が発生します

javaenter code here.lang.ClassCastException: "myprovider".JCEECPublicKey cannot be cast to java.security.interfaces.RSAPublicKey

この例外を発生させるコード:

Certificate cert = null;
            try {
                cert = CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(cert_array));
            } catch (Exception e) {
                e.printStackTrace();
            }

if (cert != null) {

                boolean ret = false;
                try {
                    //load with specific crypto provider
                    Signature sgn = Signature.getInstance("ECGOST34310", "GAMMA");
                    sgn.initVerify(cert.getPublicKey());
                    sgn.update(textBlob);
                    ret = sgn.verify(sign);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                //signature check
                if (ret) {
                    System.out.println("verify sign OK");
                } else {
                    System.out.println("verify sign FALSE");
                }
            }

証明書を生成するクライアント側のコード:

KeyStore store = loadKeyStorep12(fileName, pass);
            Enumeration en = store.aliases();
            while (en.hasMoreElements()) {
                StoreObjectParam profParam = (StoreObjectParam) en.nextElement();
                System.out.println(profParam);
                aliasKey = profParam.getSn();
            }
            PrivateKey prvKey = (PrivateKey) store.getKey(aliasKey, pass.toCharArray());
            if (prvKey != null) {
                byte[] textBlob = loadDocument(filePath);
                sign = SetSign(textBlob, prvKey);
                Certificate cert = store.getCertificate(aliasKey);
                certificate = cert.getEncoded();

この証明書がサーバー側に送信された後

4

0 に答える 0