从/ assets / filename公钥加载X509Certificate不正确

我在Windows上的java中运行以下代码,它就像一个魅力。 我使用的是带有OpenSSL生成的2048 RSA密钥的证书。 要看的重要部分是mServerPublicKey = cert.getPublicKey(); 我的用例需要公钥。

String serverCertFile = "C:\\Users\\Me\\Documents\\cert.pem"; CertificateFactory certFactory; FileInputStream inStream; try { certFactory = CertificateFactory .getInstance("X.509"); inStream = new FileInputStream (serverCertFile); X509Certificate cer = (X509Certificate) certFactory.generateCertificate(inStream); mServerPublicKey = cer.getPublicKey(); inStream.close(); } catch (CertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.d("SERVER CERTIFICATE","Unable to load certificate " + e.getMessage()); } catch (FileNotFoundException e){ e.printStackTrace(); Log.d("SERVER CERTIFICATE","Server certificate file missing " + e.getMessage()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

它加载我的证书,我可以使用公钥加密到我的服务器的短消息。 但是,android上的等效项不会返回正确的公钥。 有人看过这个吗?

  try { CertificateFactory certFactory; certFactory = CertificateFactory.getInstance("X.509"); InputStream inputStream = getClass().getResourceAsStream( "/assets/cert.pem"); X509Certificate cert = (X509Certificate) certFactory .generateCertificate(inputStream); mServerPublicKey = cer.getPublicKey(); } 

在Android上,证书加载,其中包含所有正确的字段,具有正确的值,除了公钥在android上不正确。 只是浪费了两天试图弄清楚这个。 我注意到两个平台上的提供商不同。 我在Windows上从Sun获得了证书的实例,在android上获得了BouncyCastle / spongycastle的证书。 这在Android上的BC被打破了吗?

我还确认,当我只公开公钥时,问题就存在了

—– BEGIN PUBLIC KEY —– MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAszxAbWjxIJHIxs / 5DNJ3 oNa8mYz9hdr0SZJaQDhaNsjS + R3RCO4CUAmCZUvGEaMyHfW78ykC26ssExlxSCju uoeHGGthM6 + oSmlDFPDTItC3g4teEI8hyyRfyfN771CXi8DIKP12MN75jkYQoF3 + YrW4lIs1X0GMt2Fi6JxFnHvrhxWZLWrnabMxOyhYDXsvqVwWUx8w1I5dwep6aCb4 Km9gkOJKXs4 + 3nKjuUREydsXgZ1SEq7 / vHWH3yiR4bIvsyqMSD0ndfBmbk + 0 + + ML5 + 9Gsv0 lg6d2cQRmbqh9qK6slYrBLKbZvwnBVn4iXNk / ZOVpN + TjZzKPfD3Q4grO QwIDAQAB —– END PUBLIC键 – —-

然后只需使用以下代码加载它。 没有错误被抛出但是公钥在windows和android之间不匹配。 真的不知道我做错了什么。

  InputStream inputStream2 = getClass().getResourceAsStream( "/assets/certpk.pem"); InputStreamReader reader = new InputStreamReader(inputStream2); BufferedReader br = new BufferedReader(reader); StringBuffer sb = new StringBuffer(); String line; while ((line = br.readLine()) != null) { sb.append(line); } String pk = sb.toString(); String publicKeyPEM = pk.replace("-----BEGIN PUBLIC KEY-----", ""); publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", ""); byte[] decoded = Base64.decode(publicKeyPEM, Base64.DEFAULT); KeyFactory kf = KeyFactory.getInstance("RSA"); RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new X509EncodedKeySpec(decoded)); mServerPublicKey = pubKey; 

我还使用.der文件测试了证书加载代码并得到了相同的结果。

好的,我上面使用的所有代码都是正确的。 这是您加载密钥和证书的方式。 我的问题在其他地方。 我也误解了我在调试器中看到的内容。 我的问题是当我创建加密密码时。 我正在使用它来创建密码对象

 Cipher c = Cipher.getInstance("RSA"); 

我应该使用:

 Cipher c = Cipher.getInstance("RSA/None/PKCS1Padding"); 

好好生活和学习。