Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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 当我尝试用证书转换字符串时,会引发异常_Java_Security_Applet_Certificate_X509certificate - Fatal编程技术网

Java 当我尝试用证书转换字符串时,会引发异常

Java 当我尝试用证书转换字符串时,会引发异常,java,security,applet,certificate,x509certificate,Java,Security,Applet,Certificate,X509certificate,我有一个小程序,它对文档进行签名,并将文档、签名和证书发送到服务器端。在服务器端portlet接收这3个文件时,所有文件都以base64格式存储,但当我尝试获取证书时,它会引发异常 java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Empty input at sun.security.provider.X509Factory.engineGenerateCerti

我有一个小程序,它对文档进行签名,并将文档、签名和证书发送到服务器端。在服务器端portlet接收这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();

此时,在try块中,异常被引发

好的,@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;
}

就这样。:)

永远不要信任所有证书。这是非常危险的。如果您这样做,您也可以不使用HTTPS,而只使用HTTP

您是否检查了该请求。getParameter(“cert”)返回正确的数据?是的,我检查了它,它返回了什么?它返回了什么?如果您在独立程序中运行代码,它会工作吗?如果是,那么我猜在某些情况下request.getParameter(“cert”)实际上不会返回正确的数据。我创建了独立的程序,并且有相同的异常经常出现,但我不需要ssl连接,我的任务是使用证书验证已签名的文档考虑公钥证书的好方法类似于passport系统。证书用于以一种很难伪造的方式确定有关该信息持有人的信息。这就是为什么证书验证如此重要:接受任何证书都意味着攻击者的证书将被盲目接受。就像在护照检查站故意接受假护照一样。毫无意义。这并不能回答这个问题。要评论或要求作者澄清,请在其帖子下方留下评论-你可以随时在自己的帖子上发表评论,一旦你有足够的评论,你就可以发表评论。即使没有提供答案,也要知道“接受的答案”是错的,确实是危险的。其他盲目复制该代码的人应该知道这一点。如果你对其他人的问题或答案有评论,那么你就发表评论。如果你有一个真实的答案,那么发布一个答案——这是一个相当简单的概念。如果您没有足够的代表发表评论,请将问题线程标记为收藏夹,然后用有用的答案和问题参与,直到您有足够的代表。然后您可以在收藏夹中找到该线程并发表评论。
    @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;
}