当前位置: 首页 > 面试题库 >

接受Java证书

颛孙智勇
2023-03-14
问题内容

我在通过Java与HTTPS站点交互时遇到问题。每次程序运行时,我的程序都使用一个带有不受信任证书的URL。该程序必须在多个系统上运行。目前,我有以下内容:

public class A{
    HostnameVerifier hv = new HostnameVerifier(){
        public boolean verify(String urlHostName, SSLSession session){
            return true;
        }       
    };

    HttpsURLConnection.setDefaultHostnameVerifier(hv);

    javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
    javax.net.ssl.TrustManager tm = new miTM();
    trustAllCerts[0] = tm;
    javax.net.ssl.SSLContext sc = null;
    try {
        sc = javax.net.ssl.SSLContext.getInstance("SSL");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        sc.init(null, trustAllCerts, null);
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }
   javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager{

    public java.security.cert.X509Certificate[] getAcceptedIssuers(){
        return null;
    }

    public boolean isServerTrusted(java.security.cert.X509Certificate[] certs){
        return true;
        }

    public boolean isClientTrusted(java.security.cert.X509Certificate[] certs){
        return true;
    }

    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{
        return;
    }

    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{
        return;
        }
}

使用此代码,我可以执行以下操作:

URL url = new URL(urlString);
URLConnection cnx = url.openConnection();
cnx.connect();

InputStream ins = cnx.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(ins));
String curline;
while( (curline = in.readLine()) != null ) {
     System.out.println(curline);
}

但是,我无法执行以下操作:

httpClient = new HttpClient();
PostMethod postMethod = null;
int intResult = 0;
postMethod = new PostMethod(authURL);
Enumeration emParams = authParams.propertyNames();
while (emParams.hasMoreElements()) {
  String paramName = (String) emParams.nextElement();
  String paramValue = authParams.getProperty(paramName);
     postMethod.addParameter(paramName, paramValue);
}

intResult = httpClient.executeMethod(postMethod);
postMethod.releaseConnection();
ins.close();

当执行executeMethod(postMethod)时,我得到一个SSLHandshakeException,CertPathBuilderException等。

我该怎么办才能补救?我正在考虑接受证书或只是绕过所有证书验证(因为该程序在专用网络内部运行)。

谢谢


问题答案:

看起来您正在使用Apache
HttpClient3。如果确实是版本3,则需要SecureProtocolSocketFactory按照Apache
HttpClient 3
SSL指南

中的说明构建自己的版本。这里有一个例子。

对于Apache HttpClient
4,您应该能够将()传递SSLContext给(HttpClient)的构造函数SSLSocketFactory,如对该问题的答案所述(包括有关主机名验证的注释)所述。

但是,一般来说,不要遵循这种方法。 这样可以有效地完全禁用SSL / TLS连接的身份验证部分,从而使其容易受到MITM攻击。

我正在考虑接受证书或只是绕过所有证书验证(因为该程序在专用网络内部运行)。

您的意思是,您只愿意在专用网络内使用SSL /
TLS进行加密,因为您对信任它的用户的信任度不高,无法查看可能绕过其计算机的流量,但是您也假设这些用户将无法执行MITM攻击。这不太有意义。如果您对它们足够信任,则最好以明文形式发送数据。如果不这样做,则应正确实施SSL
/ TLS,包括身份验证步骤(证书和主机名验证)。



 类似资料:
  • 问题内容: 我在Wildfly 9中配置有效的证书(非自签名!)时遇到了麻烦。我在Wildfly中配置了HTTPS连接器: 安全领域: 并使用以下命令生成密钥库: 现在,当我在浏览器中打开应用程序时,一切正常。浏览器将证书识别为有效证书,而不会提示出现自签名证书中的异常。 但是,当我尝试通过SSLPoke.java连接到相同的URL时,出现以下异常: 如果我在客户端中导入证书,此错误就会消失,但是

  • 我无法配置有效证书(不是自签名的!)在Wildfly 9中。我已经在WildFly中配置了HTTPS连接器: 如果我在客户端中导入证书,这个错误就会消失,但是我认为我不应该这样做,因为这是一个有效的证书。 测试代码如下: 为什么会发生这种情况?设置SSL证书的正确方法是什么?

  • 我没有成功地接受许可证。当我试图运行“C:\Users\Damien\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat--licenses”来接受许可证时,我出现了以下错误:线程“main”java中出现异常。lang.NoClassDefFoundError:javax/xml/bind/annotation/XmlSchema 问题是什么:我

  • 问题内容: 我正在尝试固定服务器的自签名证书。我的OkHttpClient使用两个参数,第一个是ssl Socket Factory: 其次是证书固定器: 注意:如果我不添加certificatePinner,则一切正常。问题是执行请求时,将调用CertificatePinner.check(): 显然,如果我确实设置了一个(非空的)certificatePinner,则该方法不会在那里停止,而是

  • 问题内容: 为什么定义中的所有方法都是隐式的?为什么不允许使用方法? 问题答案: 因为接口应该表示“您可以在课堂外看到的东西”。添加非公共方法是没有意义的。

  • 使用Git,有没有办法告诉它接受自签名证书? 我使用https服务器来托管git服务器,但目前证书是自签名的。 当我第一次尝试在那里创建回购时: 我得到的错误: