@@ -9,6 +9,7 @@ import java.net.URL
99import java .security .KeyStore
1010import java .security .SecureRandom
1111import java .util .Optional
12+ import javax .net .ssl .HostnameVerifier
1213import javax .net .ssl .KeyManagerFactory
1314import javax .net .ssl .TrustManagerFactory
1415
@@ -306,6 +307,7 @@ object SSLLooseConfig {
306307 * @param enabledProtocols If defined, override the platform default protocols.
307308 * @param keyManagerConfig The key manager configuration.
308309 * @param trustManagerConfig The trust manager configuration.
310+ * @param hostnameVerifierClass The hostname verifier class.
309311 * @param secureRandom The SecureRandom instance to use. Let the platform choose if None.
310312 * @param debug The debug config.
311313 * @param loose Loose configuratino parameters
@@ -319,6 +321,7 @@ final class SSLConfigSettings private[sslconfig] (
319321 val enabledProtocols : Option [immutable.Seq [String ]] = Some (List (" TLSv1.3" , " TLSv1.2" )),
320322 val keyManagerConfig : KeyManagerConfig = KeyManagerConfig (),
321323 val trustManagerConfig : TrustManagerConfig = TrustManagerConfig (),
324+ val hostnameVerifierClass : Class [? <: HostnameVerifier ] = classOf [NoopHostnameVerifier ],
322325 val secureRandom : Option [SecureRandom ] = None ,
323326 val debug : SSLDebugConfig = SSLDebugConfig (),
324327 val loose : SSLLooseConfig = SSLLooseConfig ()
@@ -331,6 +334,8 @@ final class SSLConfigSettings private[sslconfig] (
331334 copy(enabledCipherSuites = value)
332335 def withEnabledProtocols (value : Option [scala.collection.immutable.Seq [String ]]): SSLConfigSettings =
333336 copy(enabledProtocols = value)
337+ def withHostnameVerifierClass (value : Class [? <: javax.net.ssl.HostnameVerifier ]): SSLConfigSettings =
338+ copy(hostnameVerifierClass = value)
334339 def withKeyManagerConfig (value : com.typesafe.sslconfig.ssl.KeyManagerConfig ): SSLConfigSettings =
335340 copy(keyManagerConfig = value)
336341 def withLoose (value : com.typesafe.sslconfig.ssl.SSLLooseConfig ): SSLConfigSettings = copy(loose = value)
@@ -347,6 +352,7 @@ final class SSLConfigSettings private[sslconfig] (
347352 default : Boolean = default,
348353 enabledCipherSuites : Option [scala.collection.immutable.Seq [String ]] = enabledCipherSuites,
349354 enabledProtocols : Option [scala.collection.immutable.Seq [String ]] = enabledProtocols,
355+ hostnameVerifierClass : Class [? <: javax.net.ssl.HostnameVerifier ] = hostnameVerifierClass,
350356 keyManagerConfig : com.typesafe.sslconfig.ssl.KeyManagerConfig = keyManagerConfig,
351357 loose : com.typesafe.sslconfig.ssl.SSLLooseConfig = loose,
352358 protocol : String = protocol,
@@ -359,6 +365,7 @@ final class SSLConfigSettings private[sslconfig] (
359365 default = default,
360366 enabledCipherSuites = enabledCipherSuites,
361367 enabledProtocols = enabledProtocols,
368+ hostnameVerifierClass = hostnameVerifierClass,
362369 keyManagerConfig = keyManagerConfig,
363370 loose = loose,
364371 protocol = protocol,
@@ -368,7 +375,7 @@ final class SSLConfigSettings private[sslconfig] (
368375 )
369376
370377 override def toString =
371- s """ SSLConfig( ${checkRevocation}, ${debug}, ${default}, ${enabledCipherSuites}, ${enabledProtocols}, ${keyManagerConfig}, ${loose}, ${protocol}, ${revocationLists}, ${secureRandom}, ${trustManagerConfig}) """
378+ s """ SSLConfig( ${checkRevocation}, ${debug}, ${default}, ${enabledCipherSuites}, ${enabledProtocols}, ${hostnameVerifierClass} , ${ keyManagerConfig}, ${loose}, ${protocol}, ${revocationLists}, ${secureRandom}, ${trustManagerConfig}) """
372379}
373380object SSLConfigSettings {
374381 def apply () = new SSLConfigSettings ()
@@ -419,6 +426,11 @@ class SSLConfigParser(c: EnrichedConfig, classLoader: ClassLoader, loggerFactory
419426 val ciphers = Some (c.getSeq[String ](" enabledCipherSuites" )).filter(_.nonEmpty)
420427 val protocols = Some (c.getSeq[String ](" enabledProtocols" )).filter(_.nonEmpty)
421428
429+ val hostnameVerifierClass = c.getOptional[String ](" hostnameVerifierClass" ) match {
430+ case None => classOf [NoopHostnameVerifier ]
431+ case Some (fqcn) => classLoader.loadClass(fqcn).asSubclass(classOf [HostnameVerifier ])
432+ }
433+
422434 val keyManagers = parseKeyManager(c.get[EnrichedConfig ](" keyManager" ))
423435
424436 val trustManagers = parseTrustManager(c.get[EnrichedConfig ](" trustManager" ))
@@ -431,6 +443,7 @@ class SSLConfigParser(c: EnrichedConfig, classLoader: ClassLoader, loggerFactory
431443 enabledCipherSuites = ciphers,
432444 enabledProtocols = protocols,
433445 keyManagerConfig = keyManagers,
446+ hostnameVerifierClass = hostnameVerifierClass,
434447 trustManagerConfig = trustManagers,
435448 secureRandom = None ,
436449 debug = debug,
0 commit comments