Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Connecting to WSS: Unable to complete SSL/TLS handshake #53

Closed
JimmyPruitt opened this issue Aug 23, 2017 · 7 comments
Closed

Connecting to WSS: Unable to complete SSL/TLS handshake #53

JimmyPruitt opened this issue Aug 23, 2017 · 7 comments

Comments

@JimmyPruitt
Copy link

I have a Websocket server that is running behind Apache that I'm able to connect to using Chrome, Safari, and Telnet just fine. However, when attempting to connect to that same server from PHP using Pawl, it's throwing an exception during the handshake:

Unable to complete SSL/TLS handshake: stream_socket_enable_crypto(): Peer certificate CN='*.foo.bar' did not match expected CN='local.blah.foo.bar'.

Here's my client code:

\Ratchet\Client\connect('wss://' . WEBSOCKET_SERVER_HOST . ':' . WEBSOCKET_SERVER_PORT)
    ->then(
          function ($conn) use ($message) {
              $conn->send($message);
          },
          function ($e) {
              echo $e;
          }
    );
@cboden
Copy link
Member

cboden commented Aug 23, 2017

Take a look at previous issues about ssl. It looks like you're using a self signed certificate? In that case you need to pass SSL context options to the Connector.

@JimmyPruitt
Copy link
Author

JimmyPruitt commented Aug 23, 2017

It's working now, thank you.

$loop = \React\EventLoop\Factory::create();
$wsClient = new \Ratchet\Client\Connector($loop, null, ['verify_peer_name' => false, 'allow_self_signed' => true]);
$wsClient('wss://' . WEBSOCKET_SERVER_IP . ':' . WEBSOCKET_SERVER_PORT)->then(
      function ($conn) use ($message) {
          $conn->send($message);
          $conn->close();
      }
);

$loop->run();

Follow up question: this only appears to work by using the IP address in the URL. Is there a way to use the host name instead?

@mbonneau mbonneau closed this as completed Oct 3, 2017
@mbonneau
Copy link
Member

mbonneau commented Oct 3, 2017

I didn't see the follow up question - reopening...

@mbonneau mbonneau reopened this Oct 3, 2017
@mbonneau
Copy link
Member

mbonneau commented Oct 3, 2017

@JimmyPruitt - On your follow-up question - do you know if the name is able to be resolved? By default the resolver in Pawl uses 8.8.8.8.

@clue
Copy link
Member

clue commented Oct 3, 2017

Unable to complete SSL/TLS handshake: stream_socket_enable_crypto(): Peer certificate CN='*.foo.bar' did not match expected CN='local.blah.foo.bar'.

This error looks correct to me, as wildcard SSL certificates should only work one level below the root domain, perhaps https://stackoverflow.com/questions/2115611/wildcard-ssl-on-sub-subdomain could help here?

Other than that, you may also pass the peer_name context option to set the expected peer name for your remote host. This parameter should have preference over the implicit domain name from the connection URI.

@mbonneau
Copy link
Member

Closing this issue - please feel free to comment if your issue is not fixed.

@Aymkdn
Copy link

Aymkdn commented Mar 16, 2021

Since 2017, the way to do it changed, and I think it should now be:

require __DIR__ . '/vendor/autoload.php';

$loop = \React\EventLoop\Factory::create();
$connector = new \React\Socket\Connector($loop, [
  'timeout' => 20,
  'tls' => [ // here we define the SSL Context options (https://www.php.net/manual/en/context.ssl.php)
    'verify_peer' => false,
    'verify_peer_name' => false,
    'allow_self_signed' => true
  ]
]);
$wsClient = new \Ratchet\Client\Connector($loop, $connector);
$wsClient('wss://IP:PORT')->then(function($conn) {
    $conn->on('message', function($msg) use ($conn) {
        echo "Received: {$msg}\n";
        $conn->close();
    });

    $conn->send('Hello World!');
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});

$loop->run();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants