一般用户证书和加密数据是一起发放到客户端的,但是使用用户证书的公钥解密数据前需要验证用户证书是否可信,即从源头来说是否由根证书签发的,按证书链去认证。使用根证书验证用户证书可信并解密的Java实现如下:
1.读取根证书文件初始化根证书对象,并获取根证书中的公钥
1 2 3
| CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); Certificate rootCert = certificateFactory.generateCertificate(new FileInputStream(rootCertPath)); PublicKey rootCertPublicKey = rootCert.getPublicKey();
|
2.使用用户证书byte数组数据初始化用户证书对象
1 2
| X509Certificate userCert = (X509Certificate)certificateFactory.generateCertificate( new ByteArrayInputStream(userCertByteArray));
|
3.使用用户证书验证根证书的公钥,如果验证通过(即不抛出Exception)说明这个用户证书是这个根证书签发的,同时检查用户证书是否有效
1 2 3 4 5 6 7 8
| try { userCert.verify(rootCertPublicKey); userCert.checkValidity(); Log.d(TAG,"------------- 工作证书验证成功 -----------"); }catch (Exception e) { Log.d(TAG,"------------- 工作证书验证失败 -----------"); }
|
4.最后使用用户证书的公钥进行解密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| try { Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, userCert); byte[] output = cipher.doFinal(cipherData); return output; } catch (NoSuchAlgorithmException e) { throw new Exception("无此解密算法"); } catch (NoSuchPaddingException e) { e.printStackTrace(); return null; } catch (InvalidKeyException e) { throw new Exception("解密公钥非法,请检查"); } catch (IllegalBlockSizeException e) { throw new Exception("密文长度非法"); } catch (BadPaddingException e) { throw new Exception("密文数据已损坏"); }
|