Преглед изворни кода

Fix bug with BoringSSLError.invalidSNIName exception (#702)

* Fix bug with BoringSSLError.invalidSNIName exception when host in ClientConnection is IP address

* Log message when no TLS SNI extension value set

* Improve log message shown when TLS serverHostname is skipped
Esenbek Kydyr uulu пре 5 година
родитељ
комит
d19ae895b0
1 измењених фајлова са 19 додато и 1 уклоњено
  1. 19 1
      Sources/GRPC/ClientConnection.swift

+ 19 - 1
Sources/GRPC/ClientConnection.swift

@@ -361,7 +361,7 @@ extension ClientConnection {
     logger: Logger
   ) -> ClientBootstrapProtocol {
     // Provide a server hostname if we're using TLS. Prefer the override.
-    let serverHostname: String? = configuration.tls.map {
+    var serverHostname: String? = configuration.tls.map {
       if let hostnameOverride = $0.hostnameOverride {
         logger.debug("using hostname override for TLS", metadata: ["server-hostname": "\(hostnameOverride)"])
         return hostnameOverride
@@ -371,6 +371,11 @@ extension ClientConnection {
         return host
       }
     }
+    
+    if let hostname = serverHostname, hostname.isIPAddress {
+      logger.debug("IP address cannot be used for TLS SNI extension. No host used", metadata: ["server-hostname": "\(hostname)"])
+      serverHostname = nil
+    }
 
     let bootstrap = PlatformSupport.makeClientBootstrap(group: eventLoop)
       // Enable SO_REUSEADDR and TCP_NODELAY.
@@ -576,3 +581,16 @@ extension HTTP2ToHTTP1ClientCodec.HTTPProtocol {
     }
   }
 }
+
+fileprivate extension String {
+  var isIPAddress: Bool {
+    // We need some scratch space to let inet_pton write into.
+    var ipv4Addr = in_addr()
+    var ipv6Addr = in6_addr()
+    
+    return self.withCString { ptr in
+      return inet_pton(AF_INET, ptr, &ipv4Addr) == 1 ||
+        inet_pton(AF_INET6, ptr, &ipv6Addr) == 1
+    }
+  }
+}