Вопрос по security, applet, java, certificate, x509certificate – Когда я пытаюсь преобразовать строку с сертификатом, возникает исключение

1

У меня есть апплет, который подписывает документ и отправляет документ, подпись и сертификат на сторону сервера. На стороне сервера портлет получает эти 3 файла, все файлы хранятся в формате base64, но когда я пытаюсь получить сертификат, возникает исключение

java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Empty input
at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:104)

код стороны апплета:

public static byte[] certificate;

public static String getCertificateString() {
        String str = "";
        byte[] result = null;
        result = Base64.encode(certificate);
        for (int i = 0; i < result.length; i++) {
            str += (char) (result[i]);
        }
        return str;
    }

    //initialization of certificate from the store
    Certificate cert = store.getCertificate(aliasKey);
    certificate = cert.toString().getBytes();

после этого я отправляю сертификат в портлет, где нужно проверить подпись. Но преобразование сертификата не удалось.

код портлета:

String certificate = request.getParameter("cert");
byte[] cert_array = Base64.decode(certificate.getBytes());
try {
    cert = CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(cert_array));
}catch(Exception e){
    e.printStackTrace();
}

И в этот момент в блоке try возникает исключение

Да, я проверяю, и он возвращает test1604
Сертификат в формате base64 test1604
Ну, что именно он возвращает? Thomas Mueller
Вы проверяли, что request.getParameter ("cert") возвращает правильные данные? Thomas Mueller
Если вы запускаете код в автономной программе, он работает? Если да, то я думаю, что в некоторых случаях request.getParameter ("cert") фактически не возвращает правильные данные. Thomas Mueller

Ваш Ответ

2   ответа
0

@ test1604 вы пытаетесь что-то вроде этого, реализует класс X509TrustManager, хорошо, мы идем:

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class YouNameClass implements X509TrustManager {... 
   public YouNameClass() {
      super();
   }
}

И добавь этот метод,

private static void trustAllHttpsCertificates() throws Exception {
//  Create a trust manager that does not validate certificate chains:
    javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
    javax.net.ssl.TrustManager tm = new YouNameClass();
    trustAllCerts[0] = tm; 
    javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, null);
    javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}

и переопределение методов:

    @Override
     public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
       return;
}

    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
       return;
}

    @Override
    public X509Certificate[] getAcceptedIssuers() {
       return null;
}

Это оно. :)

Большое спасибо, но мне не нужно ssl-соединение, моя задача - проверить подписанный документ с помощью сертификата test1604
0

аете это, вы также можете не использовать HTTPS и просто использовать HTTP

Хороший способ думать о сертификатах открытых ключей сродни паспортной системе. Сертификаты используются для установления информации о владельце этой информации способом, который очень трудно подделать. Вот почему проверка сертификата так важна: принятие любого сертификата означает, что сертификат злоумышленника будет приниматься вслепую. Точно так же, как запуск контрольного пункта паспорта, где вы сознательно принимаете поддельные паспорта Скорее бессмысленно. skanga
Даже если он не дает ответа, важно знать, что «принятый ответ» является неправильным, и INDEED он ОПАСНЫЙ. Другие, кто слепо копирует этот код, должны это знать. skanga
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под его постом - вы всегда можете комментировать свои собственные посты, и как только у вас будет достаточно Репутации Вы будете в состоянии комментарий к любому посту. MarsAtomic
Если у вас есть комментарий относительно чужого вопроса или ответа, вы отправляетекомментари. Если у вас есть фактический ответ, то отправьтеотве - это довольно простая концепция. Если у вас недостаточно представителей, чтобы комментировать, пометьте ветку вопросов как избранную, а затем участвуйте в SO с полезными ответами и вопросами, пока у вас не будет достаточно представителей. Затем вы можете найти ветку в избранном и комментировать. MarsAtomic

Похожие вопросы