Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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 httpcleint使用X.509证书发送SSL请求_Java_Ssl_Https_Httpclient - Fatal编程技术网

Java httpcleint使用X.509证书发送SSL请求

Java httpcleint使用X.509证书发送SSL请求,java,ssl,https,httpclient,Java,Ssl,Https,Httpclient,我将请求发送给他们提供给我的私人服务.crt,在此之前,我已经生成了.csr和我的私钥。 因此,通过使用我的私钥和.crt证书,邮递员可以向服务发送请求。 但在我的代码中,我得到了SSl握手异常,我使用的是JDK 11。这段代码正在创建http客户端。 那么,我应该对证书执行任何其他步骤吗 private static final TrustManager[] tmgs = new TrustManager[]{new X509TrustManager() { @Override

我将请求发送给他们提供给我的私人服务.crt,在此之前,我已经生成了.csr和我的私钥。 因此,通过使用我的私钥和.crt证书,邮递员可以向服务发送请求。 但在我的代码中,我得到了SSl握手异常,我使用的是JDK 11。这段代码正在创建http客户端。 那么,我应该对证书执行任何其他步骤吗

   private static final TrustManager[] tmgs = new TrustManager[]{new X509TrustManager() {
    @Override
    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {

    }

    @Override
    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {

    }

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

static CloseableHttpClient httpsSSLClient(Env env) {
    try {
        var certificateFactory = CertificateFactory.getInstance("X.509");
        var x509Certificate = (X509Certificate) certificateFactory.generateCertificate(new FileInputStream("C:\\Users\\cert.crt"));
        var keyStore = KeyStore.getInstance("JKS");
        keyStore.load(null, "".toCharArray());
        var trustedCertificateEntry = new KeyStore.TrustedCertificateEntry(x509Certificate);
        keyStore.setEntry("", trustedCertificateEntry, (KeyStore.ProtectionParameter) null);
        var managerFactory = KeyManagerFactory.getInstance("SunX509");
        managerFactory.init(keyStore, "".toCharArray());
        var sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(managerFactory.getKeyManagers(), tmgs, null);

        return env.clientBuilder.setSSLContext(sslContext).build();
    } catch (Exception e) {
        throw new RuntimeException("Failed to create httpClient", e);
    }
}

首先,请发布完整的异常/堆栈跟踪

然后我会说,您不会“导入(或)使用”系统或java的信任库

class TrustedCAsByOperatingSystem extends AbstractCaLoader implements Supplier<Collection<X509Certificate>> {
  protected Logger log = LoggerFactory.getLogger(this.getClass());
  private static String[] linuxTrustStoreLocation = {"/etc/pki/java/cacerts"};

  @Override
  public Collection<X509Certificate> get() {
    final Collection<X509Certificate> retval = new ArrayList<>();
    this.log.trace("Operating System " + OsUtils.runningOS + " determined.");
    try {
      final TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
      switch (OsUtils.runningOS) {
        case WIN:
          try {
            this.log.info("Trying to load Trusted CAs from Windows Truststore.");
            final KeyStore ks = KeyStore.getInstance("Windows-ROOT");
            ks.load(null); // You don't need the KeyStore instance to come from a file.
            tmf.init(ks);
            retval.addAll(this.getTrustedCAs(tmf));
          } catch (final Exception e) {
            this.log.warn("Error while loading Trusted CAs from Windows Truststore.", e);
          }
        case UNIX: {
          try {
            FileInputStream myKeys = null;
            for (final String location : TrustedCAsByOperatingSystem.linuxTrustStoreLocation)
              try {
                myKeys = FileUtils.openInputStream(new File(location));
                this.log.info("Trying to load Trusted CAs from Linux Truststore [" + location + "].");
              } catch (final Exception e) {
              }
            if (myKeys != null) {
              final KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
              ks.load(myKeys, "changeit".toCharArray());
              myKeys.close();
              tmf.init(ks);
              retval.addAll(this.getTrustedCAs(tmf));
            }
          } catch (final Exception e) {
            this.log.warn("Error while loading Trusted CAs from Linux Truststore.", e);
          }
        }
        default:
          break;
      }
    } catch (final Exception e) {
      this.log.warn("Error while loading Trusted CAs.", e);
    }
    return this.interceptCa(retval, "OS:" + OsUtils.runningOS);
  }


}
类TrustedCAsByOperatingSystem扩展抽象装载机实现供应商{
受保护的记录器日志=LoggerFactory.getLogger(this.getClass());
私有静态字符串[]linuxTrustStoreLocation={“/etc/pki/java/cacerts”};
@凌驾
公共集合get(){
最终集合retval=new ArrayList();
this.log.trace(“操作系统”+OsUtils.runningOS+“已确定”);
试一试{
final TrustManagerFactory tmf=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
交换机(OsUtils.runningOS){
成功案例:
试一试{
this.log.info(“试图从Windows信任库加载受信任的CA”);
final KeyStore ks=KeyStore.getInstance(“Windows根目录”);
load(null);//您不需要密钥库实例来自文件。
tmf.init(ks);
retval.addAll(this.getrustedcas(tmf));
}捕获(最终异常e){
this.log.warn(“从Windows信任库加载受信任CA时出错。”,e);
}
案例UNIX:{
试一试{
FileInputStream myKeys=null;
for(最终字符串位置:TrustedCAsByOperatingSystem.linuxTrustStoreLocation)
试一试{
myKeys=FileUtils.openInputStream(新文件(位置));
this.log.info(“试图从Linux信任库[“+location+”])加载受信任的CA;
}捕获(最终异常e){
}
if(myKeys!=null){
final KeyStore ks=KeyStore.getInstance(KeyStore.getDefaultType());
加载(mykey,“changeit.tocharray());
myKeys.close();
tmf.init(ks);
retval.addAll(this.getrustedcas(tmf));
}
}捕获(最终异常e){
this.log.warn(“从Linux信任库加载受信任CA时出错。”,e);
}
}
违约:
打破
}
}捕获(最终异常e){
this.log.warn(“加载受信任CA时出错。”,e);
}
返回这个.interceptCa(retval,“OS:+OsUtils.runningOS);
}
}

javax.net.ssl.SSLHandshakeException:java.base/sun.security.ssl.alert.createSSLException(alert.java:131)java.base/sun.security.ssl.alert.createSSLException(alert.java:117)java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:314)接收到致命警报:握手失败在java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:293)中,atIt看起来像是Alert$AlertConsumer.consume(Alert.java:293)中的响应无法使用,因为无法验证远程证书(链)。我将从java.base/sun.security.ssl.alert.createSSLException(alert.java:131)的java.base/sun.security.ssl.alert.createSSLException(alert.java:117)的java.base/sun.security.ssl.createSSLException(alert.java:117)中导入信任库位于java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:293)的java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:18