Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
使用http客户端-如何让Java自动下载中间SSL证书_Java_Scala_Https - Fatal编程技术网

使用http客户端-如何让Java自动下载中间SSL证书

使用http客户端-如何让Java自动下载中间SSL证书,java,scala,https,Java,Scala,Https,我正在设置一个HTTPS连接到一个我无法控制的远程服务器。服务器具有由受信任CA生成的SSL证书,但在SSL握手中不包括中间证书 例如。 可信CA证书->中间证书(未提供)->服务器证书(提供) 通常,服务器将提供服务器证书和中间证书。没有中间证书,我的HTTP客户端无法识别SSL证书,SSL连接失败 我正在尝试使用Apache HTTP客户端4.5进行连接: val httpClientBuilder=httpClientBuilder.create() .useSystemPropertie

我正在设置一个HTTPS连接到一个我无法控制的远程服务器。服务器具有由受信任CA生成的SSL证书,但在SSL握手中不包括中间证书

例如。 可信CA证书->中间证书(未提供)->服务器证书(提供)

通常,服务器将提供服务器证书和中间证书。没有中间证书,我的HTTP客户端无法识别SSL证书,SSL连接失败

我正在尝试使用Apache HTTP客户端4.5进行连接:

val httpClientBuilder=httpClientBuilder.create()
.useSystemProperties()
如果我下载证书,将其设置在密钥库中并将其连接到连接,我就可以使事情正常进行:

Security.addProvider(新的BouncyCastleProvider())
val certPem=new-PEMParser(new-PemReader(new-FileReader)(“trust-chain.crt”))
val certHolder=certPem.readObject().asInstanceOf[X509CertificateHolder]
val cert=新的JcaX509CertificateConverter()
.setProvider(“BC”)
.getCertificate(证书持有人)
val keyStore=keyStore.getInstance(keyStore.getDefaultType)
keyStore.load(null)
keyStore.setCertificateEntry(“证书别名”,证书)
val sslContextBuilder=sslContextBuilder.create()
.loadKeyMaterial(密钥库,“changeit”.tocharray)
.loadTrustMaterial(密钥库,空)
val httpClientBuilder=httpClientBuilder.create()
.useSystemProperties()
.setSSLContext(sslContextBuilder.build())
但一旦证书过期,这将立即失效。我还可以启用信任自签名证书,但这会带来很大的安全隐患,我不想这样做:

val sslContextBuilder=sslContextBuilder.create()
.loadKeyMaterial(密钥库,“changeit”.tocharray)
.loadTrustMaterial(密钥库、新TrustSelfSignedStrategy)
如果服务器不提供中间证书(与大多数web浏览器类似),有没有办法设置Apache HTTP客户端(或另一个JVM HTTPS/SSL库)来自动下载这些证书

使用Oracle JRE,您可以使用Java系统属性启用中间证书的自动下载
-Dcom.sun.security.enableaiacasuers=true


为此,服务器的证书必须向中间证书(证书的颁发者)提供URI。

从何处下载它们?@JamesKPolk这是一个好问题-我不完全确定,可能是受信任的CA-我知道ssllabs ssltest()能够从某处获取它们并记录“此服务器的证书链不完整。等级上限为B。“我还可以通过另一个站点下载它们,该站点将整个证书链拉入------BEGIN证书------…”-----结束证书------格式,所以我认为这是一个可以解决的问题。一些CA在其站点的某个地方提供了一些中间根。这不是获得中级证书的可靠或标准的方式。你不需要下载中间证书就知道它们丢失了。我怀疑sslabs是否下载了它们。@JamesKPolk我猜(希望)一定有某种标准方法,因为我能够使用我的web浏览器访问同一台服务器,web浏览器能够提取中间证书并验证站点,我只是希望有一种自动化的方法在JVM中执行同样的操作