Laden von X509Certificate aus / assets / filename öffentlicher Schlüssel ist nicht korrekt

Ich habe den folgenden Code in Java unter Windows ausgeführt und es funktioniert wie ein Zauber. Ich verwende ein Zertifikat mit einem 2048 RSA-Schlüssel, den ich mit OpenSSL generiert habe. Das wichtigste Teil, das Sie sich ansehen sollten, ist der mServerPublicKey = cert.getPublicKey (); Ich benötige den öffentlichen Schlüssel für meinen Anwendungsfall.

    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();
    }

Es lädt mein Zertifikat und ich kann den öffentlichen Schlüssel verwenden, um eine Kurznachricht an meinen Server zu verschlüsseln. Das Gegenstück auf Android gibt jedoch nicht den richtigen öffentlichen Schlüssel zurück. Hat jemand das schon mal gesehen?

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

uf Android wird das Zertifikat geladen und enthält alle richtigen Felder mit den richtigen Werten, mit der Ausnahme, dass der öffentliche Schlüssel auf Android nicht richtig ist. Ich habe gerade zwei Tage damit verbracht, dies herauszufinden. Mir ist aufgefallen, dass die Anbieter auf beiden Plattformen unterschiedlich sind. Ich habe eine Instanz des Zertifikats von Sun auf Windows und von BouncyCastle / Spongycastle auf Android erhalten. Ist das in BC auf Android kaputt?

Ich habe auch bestätigt, dass das Problem besteht, wenn ich nur den öffentlichen Schlüssel extrahiere

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

Verwenden Sie dann einfach den folgenden Code, um ihn zu laden. Es werden keine Fehler ausgegeben, aber der öffentliche Schlüssel stimmt nicht mit dem von Windows und Android überein. Ich weiß wirklich nicht, was ich falsch mache.

        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;

Ich habe auch den Code zum Laden des Zertifikats mit .der-Dateien getestet und die gleichen Ergebnisse erzielt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage