Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从/assets/filename公钥加载X509证书不正确_Java_Android_Ssl_Certificate_Assets - Fatal编程技术网

Java 从/assets/filename公钥加载X509证书不正确

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

我有下面的代码在windows上用java运行,它工作起来很有魅力。我正在使用一个带有2048 RSA密钥的证书,该密钥是我用OpenSSL生成的。要查看的重要部分是mserverplickey=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获得了证书的实例。这在安卓上的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");
好好生活,好好学习