Skip to content

Commit 4e3f764

Browse files
committed
fix(client-certificates): errors during http2 TLS handshake
1 parent e3480d1 commit 4e3f764

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

packages/playwright-core/src/server/socksClientCertificatesInterceptor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ class SocksProxyConnection {
211211
secureContext: this.socksProxy.secureContextMap.get(new URL(`https://${this.host}:${this.port}`).origin),
212212
});
213213

214-
targetTLS.once('secureConnect', () => {
214+
targetTLS.once('session', () => {
215215
internalTLS.pipe(targetTLS);
216216
targetTLS.pipe(internalTLS);
217217
});

tests/library/client-certificates.spec.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ test.describe('browser', () => {
461461
});
462462

463463
await new Promise<void>(resolve => server.listen(0, 'localhost', resolve));
464-
const port = (server.address() as import('net').AddressInfo).port;
464+
const port = (server.address() as net.AddressInfo).port;
465465
const origin = 'https://' + (browserName === 'webkit' && platform === 'darwin' ? 'local.playwright' : 'localhost');
466466
const serverUrl = `${origin}:${port}`;
467467

@@ -671,6 +671,43 @@ test.describe('browser', () => {
671671
await page.close();
672672
});
673673

674+
test.only('should handle TLS renegotiation error with HTTP/2 and TLS 1.2', async ({ browser, asset, browserName, platform }) => {
675+
const server: http2.Http2SecureServer = createHttp2Server({
676+
key: fs.readFileSync(asset('client-certificates/server/server_key.pem')),
677+
cert: fs.readFileSync(asset('client-certificates/server/server_cert.pem')),
678+
ca: [fs.readFileSync(asset('client-certificates/server/server_cert.pem'))],
679+
requestCert: true,
680+
}, async (req: http2.Http2ServerRequest, res: http2.Http2ServerResponse) => {
681+
res.writeHead(200, { 'Content-Type': 'text/html' });
682+
res.end('Hello world');
683+
});
684+
685+
await new Promise<void>(resolve => server.listen(0, 'localhost', resolve));
686+
const port = (server.address() as net.AddressInfo).port;
687+
const serverUrl = 'https://' + (browserName === 'webkit' && platform === 'darwin' ? 'local.playwright' : 'localhost') + ':' + port;
688+
689+
const context = await browser.newContext({
690+
ignoreHTTPSErrors: true,
691+
clientCertificates: [{
692+
origin: 'https://just-there-that-the-client-certificates-proxy-server-is-getting-launched.com',
693+
certPath: asset('client-certificates/client/trusted/cert.pem'),
694+
keyPath: asset('client-certificates/client/trusted/key.pem'),
695+
}],
696+
});
697+
698+
const page = await context.newPage();
699+
700+
const response = await page.goto(serverUrl);
701+
expect(response.status()).toBe(503);
702+
703+
const responseText = await response.text();
704+
expect(responseText).toContain('Playwright client-certificate error');
705+
expect(responseText).toContain('alert certificate required');
706+
707+
await context.close();
708+
await new Promise<void>(resolve => server.close(() => resolve()));
709+
});
710+
674711
test.describe('persistentContext', () => {
675712
test('validate input', async ({ launchPersistent }) => {
676713
test.slow();

0 commit comments

Comments
 (0)