плохой base64 в андроиде - PullRequest
       3

плохой base64 в андроиде

0 голосов
/ 08 марта 2012

Привет! Я использую следующий код для разбора информации о сертификате. Все хорошо, за исключением небольшой проблемы, упомянутой ниже.

package android.net.http;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.security.cert.Certif`enter code here`icate;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateParsingException;
import java.security.cert.X509Certificate;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Base64;
import android.util.Base64InputStream;
import android.util.Log;

 public class SslCertificate1Activity extends Activity
 {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

try  {
String text = "-----BEGIN CERTIFICATE-----\n"+
    "MIIC/TCCAmagAwIBAgIBKjANBgkqhkiG9w0BAQQFADCBqDEiMCAGA1UEAxMZeG1sZ2F0ZXdheS5p\n"+
    "dHMudXRleGFzLmVkdTEoMCYGA1UECxMfSW5mb3JtYXRpb24gVGVjaG5vbG9neSBTZXJ2aWNlczEq\n"+
    "MCgGA1UEChMhVGhlIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgQXVzdGluMQ8wDQYDVQQHEwZBdXN0\n"+
    "aW4xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzAeFw0wNDA1MDkwNTMwMTBaFw0wNTA1MDQw\n"+
    "NTMwMTBaMIGAMQswCQYDVQQGEwJVUzEOMAwGA1UECBMFVGV4YXMxDzANBgNVBAcTBkF1c3RpbjEq\n"+
    "MCgGA1UEChMhVGhlIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgQXVzdGluMRMwEQYDVQQLEwpUb29s\n"+
    "cyBUZWFtMQ8wDQYDVQQDEwZDbGllbnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ6PABjb\n"+
    "zXUkgo29S4uv1Qz9reo1/tP4pkQTGAldSbtA4hVtA/3sjw2+u3kgxYruAi2cXV2k0RPZhsUZjlDk\n"+
    "jMPb/dlY81bD8gqe3lu3ezugJrlArlpfWN6PlufbTjxHSqIA0XD9R5/ZECaUV9dD43K5KdWUCy99\n"+
    "YKDiSwVPO9F5AgMBAAGjXTBbMB0GA1UdDgQWBBRkCCpscEXxXu8Ba67p6zdh13ypjzAfBgNVHSME\n"+
    "GDAWgBR2RsZH2kSY782kBROo92FAWS6sADAJBgNVHRMEAjAAMA4GA1UdDwQHAwUBEiRIkDANBgkq\n"+
    "hkiG9w0BAQQFAAOBgQCtV1NzpdVBs5vyb8yLXNA3hA1LsmE/2QanXG4T3UN93BI4HQzx0idnkN1Y\n"+
    "0RAQ1rjGeQ1pk3l2DWsPi9mTkCGmYs/EMLkKOBee9ad3BIG6sKwXgbgLyNLgda+Y1bo+SIomq/a7\n"+
    "yP92UHMFEegfS/ssECA+Q3hHuU6in3AqLfWH1w==\n"+
    "-----END CERTIFICATE-----";
int startIndex = 0;
String cert = text.substring(startIndex,text.length()); 
    byte[] certBytes = cert.getBytes();
    InputStream in = new Base64InputStream(new ByteArrayInputStream(
            certBytes), 0);
CertificateFactory certFact = CertificateFactory.getInstance ("X.509");
    Certificate certGen = certFact.generateCertificate(in); 
    X509Certificate x509 = (X509Certificate) certGen; 
     Log.i("","certificate details:"+x509);
    } 
    catch (Exception e)  
    {
        Log.e("testapp", "exception: " + e.getMessage()); 
    }  
}
 }

и я получаю android.util.BASE64DataException: неверное base-64 на следующей строке, когда я запустил отладчик: -

Certificate certGen = certFact.generateCertificate(in);

Похоже, что с Base64InputStream что-то не так. Пожалуйста, помогите исправить исключение. Заранее спасибо

1 Ответ

6 голосов
/ 08 марта 2012

Нет, с Base64InputStream все в порядке.Если вы сомневаетесь, вы должны подозревать, что ваш собственный код неверен, а не все остальные.

Неправильно то, что вы предоставляете данные Base64InputStream, заканчивающиеся на "----- ENDСЕРТИФИКАТ ----- " после заполнителя.

Вы должны передавать только бит между " ----- НАЧАТЬ СЕРТИФИКАТ ---- "и" ----- КОНЕЦ СЕРТИФИКАТА ----- ".

Похоже, вы начали думать об этом уже здесь:

int startIndex = 0;
String cert = text.substring(startIndex,text.length()); 

...но этот код ничего не сделает - когда startIndex равен 0, substring собирается вернуть всю строку ...

Лично я бы подумал сначала о преобразовании Base64 с использованием класса Base64 для преобразования части base64 строки (вам все еще нужно получить подстроку) в byte[], а затем создайте вокруг нее ByteArrayInputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...