Nikos, I'm attempting to get the Cisco AnyConnect client to create tunnel to the server. For testing, I disabled user authentication (there is only one cert in this CA). My --debug log is below. I added a an fprintf into the do..while loop in tls_read(). It looks like the client is closing the stream. Before I go wandering down the wrong path, can you check my attached config to make sure I'm not missing anything simple? listening (TCP) on [0.0.0.0]:443... listening (UDP) on [0.0.0.0]:443... ocserv[4732]: [main] processed 1 CA certificate(s). ocserv[4735]: [X.X.X.116]:54332 accepted connection ocserv[4735]: [X.X.X.116]:54332 client certificate verification succeeded ocserv[4735]: [X.X.X.116]:54332 TLS handshake completed gnutls_record_recv returned 898 ocserv[4735]: [X.X.X.116]:54332 HTTP: User-Agent: AnyConnect AppleSSLVPN_Darwin_ARM (iPhone) 3.0.09115 ocserv[4735]: [X.X.X.116]:54332 HTTP: Host: lakedaemon.net ocserv[4735]: [X.X.X.116]:54332 HTTP: Accept: */* ocserv[4735]: [X.X.X.116]:54332 HTTP: Accept-Encoding: identity ocserv[4735]: [X.X.X.116]:54332 HTTP: X-Transcend-Version: 1 ocserv[4735]: [X.X.X.116]:54332 HTTP: X-Transcend-Version: 1 ocserv[4735]: [X.X.X.116]:54332 HTTP: X-AnyConnect-Identifier-ClientVersion: 3.0.09115 ocserv[4735]: [X.X.X.116]:54332 HTTP: X-AnyConnect-Identifier-Platform: apple-ios ocserv[4735]: [X.X.X.116]:54332 HTTP: X-AnyConnect-Identifier-PlatformVersion: 6.1.2 ocserv[4735]: [X.X.X.116]:54332 HTTP: X-AnyConnect-Identifier-DeviceType: iPhone4,1 ocserv[4735]: [X.X.X.116]:54332 HTTP: X-AnyConnect-Identifier-Device-UniqueID: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY ocserv[4735]: [X.X.X.116]:54332 HTTP: X-Aggregate-Auth: 1 ocserv[4735]: [X.X.X.116]:54332 HTTP: Connection: close ocserv[4735]: [X.X.X.116]:54332 HTTP: Content-Length: 320 ocserv[4735]: [X.X.X.116]:54332 HTTP: Content-Type: application/x-www-form-urlencoded ocserv[4735]: [X.X.X.116]:54332 sending authentication request ocserv[4732]: [main] assigning tun device vpn0 ocserv[4732]: [X.X.X.116]:54332 user 'C=US,O=Home,CN=jason_iphone' of group '[unknown]' authenticated ocserv[4735]: [X.X.X.116]:54332 User 'C=US,O=Home,CN=jason_iphone' logged in gnutls_record_recv returned 0 ocserv[4735]: [X.X.X.116]:54332 error receiving client data (0) And, my sample.config: ### begin ############################################################ # User authentication method. Could be set multiple times and in that # case # all should succeed. # Options: certificate, pam. auth = "certificate" #auth = "pam" # Use listen-host to limit to specific IPs or to the IPs of a provided # hostname. #listen-host = [IP|HOSTNAME] # Limit the number of clients. Unset or set to zero for unlimited. #max-clients = 1024 max-clients = 16 # Limit the number of identical clients (i.e., users connecting multiple # times) # Unset or set to zero for unlimited. max-same-clients = 2 # TCP and UDP port number tcp-port = 443 udp-port = 443 # Keepalive in seconds keepalive = 32400 # Dead peer detection in seconds dpd = 440 # MTU discovery (DPD must be enabled) try-mtu-discovery = false # The key and the certificates of the server # The key may be a file, or any URL supported by GnuTLS (e.g., # tpmkey:uuid=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx;storage=user # or pkcs11:object=my-vpn-key;object-type=private) server-cert = ./server.crt server-key = ./server.key # In case PKCS #11 or TPM keys are used the PINs should be available # in files. The srk-pin-file is applicable to TPM keys only (It's the # storage # root key). #pin-file = /path/to/pin.txt #srk-pin-file = /path/to/srkpin.txt # The Certificate Authority that will be used # to verify clients if certificate authentication # is set. #ca-cert = /path/to/ca.pem ca-cert = ./home_ca.crt # The object identifier that will be used to read the user ID in the # client certificate. # The object identifier should be part of the certificate's DN # Useful OIDs are: # CN = 2.5.4.3, UID = 0.9.2342.19200300.100.1.1 #cert-user-oid = 0.9.2342.19200300.100.1.1 # The object identifier that will be used to read the user group in the # client # certificate. The object identifier should be part of the certificate's # DN # Useful OIDs are: # OU (organizational unit) = 2.5.4.11 #cert-group-oid = 2.5.4.11 # A revocation list of ca-cert is set #crl = /path/to/crl.pem # GnuTLS priority string tls-priorities = "PERFORMANCE:%SERVER_PRECEDENCE" # The default server directory #chroot-dir = /path/to/chroot # The time (in seconds) that a client is allowed to stay connected prior # to authentication auth-timeout = 40 # Cookie validity time (in seconds) # Once a client is authenticated he's provided a cookie with # which he can reconnect. This option sets the maximum lifetime # of that cookie. cookie-validity = 172800 # A cookie database. If not set cookies are stored in memory and # server restarts won't preserve them. #cookie-db = /var/tmp/cookies.db # Script to call when a client connects and obtains an IP # Parameters are passed on the environment. # USERNAME, GROUPNAME, HOSTNAME (the hostname selected by client), # DEVICE, IP_REAL (the real IP of the client), IP_LOCAL (the local IP # in the P-t-P connect), IP_REMOTE (the VPN IP of the client). #connect-script = /usr/bin/myscript #disconnect-script = /usr/bin/myscript # UTMP use-utmp = true # PID file pid-file = /var/run/ocserv.pid run-as-user = nobody run-as-group = nogroup # Network settings device = vpn ipv4-network = Z.Z.Z.0 ipv4-netmask = 255.255.255.0 # Use the keywork local to advertize the local P-t-P address as DNS # server # ipv4-dns = 192.168.2.1 ipv4-dns = X.X.X.3 #ipv6-address = #ipv6-mask = #ipv6-dns = # Leave empty to assign the default MTU of the device # mtu = route = Z.Z.Z.0/255.255.255.0 route = X.X.X.0/255.255.255.0 #route = 192.168.5.0/255.255.255.0 ###### end ################################################## thx, Jason.