Java 从/assets/filename公钥加载X509证书不正确
我有下面的代码在windows上用java运行,它工作起来很有魅力。我正在使用一个带有2048 RSA密钥的证书,该密钥是我用OpenSSL生成的。要查看的重要部分是mserverplickey=cert.getPublicKey();我需要我的用例的公钥Java 从/assets/filename公钥加载X509证书不正确,java,android,ssl,certificate,assets,Java,Android,Ssl,Certificate,Assets,我有下面的代码在windows上用java运行,它工作起来很有魅力。我正在使用一个带有2048 RSA密钥的证书,该密钥是我用OpenSSL生成的。要查看的重要部分是mserverplickey=cert.getPublicKey();我需要我的用例的公钥 String serverCertFile = "C:\\Users\\Me\\Documents\\cert.pem"; CertificateFactory certFactory; FileInputStream
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获得了证书的实例。这在安卓上的BC中被破坏了吗
我还确认,当我只提取公钥时,问题就存在了
-----开始公钥-----
MiibijanbgKQHKIG9W0BaqefaaoCaq8AmiIBCGKCAQEASZXABWJXIJHS/5DNJ3
oNa8mYz9hdr0SZJaQDhaNsjS+R3RCO4CUAmCZUvGEaMyHfW78ykC26ssExlxSCju
UoEhGthM6+OSMLDFPDTITC3G4TEEI8YYRFYFN771CXI8DIKP12MN75JKYQOF3+
YRW4LIS1X0GMT2FI6JXFNHVRHXWZLWRNABMXYHYDXSVQVWWUX8W1I5DWEP6ACB4
Km9gkOJKXs4+3KJUREYDSXGZ1SEQ7/vHWH3yiR4bIvsyqMSD0ndfBmbk+0+ml5
+9Gsv0+LG6D2CQRMBQH9QK6SLYRBLKBZVWNWNBN4IXNK/ZOVpN+TjZzKPfD3Q4grO
QwIDAQAB
-----结束公钥-----
然后使用下面的代码加载它。不会抛出任何错误,但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");
好好生活,好好学习