.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();
この証明書がサーバー側に送信された後