2

ドキュメントに署名し、ドキュメント、署名、および証明書をサーバー側に送信するアプレットがあります。サーバー側のポートレットはこれらの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ブロックで例外が発生します

4

2 に答える 2

2

すべての証明書を信頼しないでください。それはとても危険です。その場合、HTTPS を使用せずに HTTP のみを使用することもできます。

于 2015-10-01T17:18:57.547 に答える
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;
}

それでおしまい。:)

于 2012-05-15T05:14:15.217 に答える