Суслик, TLS
и лиса-параноик


Олег Неумывакин
тестировщик @ Plesk
oneumyvakin@plesk.com

О себе


- 10+ лет тестирования
- карьерные консультации для тестировщиков
- Plesk > Yandex > Plesk

Энергосбережение в браузере

Тестирование энергопотребления браузера

- берем ноутбук
- отключаем от сети
- выполняем нагрузку в цикле
- ждем разряда батареи
- записываем время

Участники тестирования из требований PM'a

- Яндекс.Браузер
- Chrome

Тестирование энергопотребления

- берем ноутбук
- отключаем от сети
- выполняем нагрузку
- ждём разряда батареи <--- 6 часов
- записываем время

На сцене появляется суслик: WebPageReplay

WebPageReplay: один раз записать архив


{
	"vk.com": {
		"/search": "..."
	},
	"google.com": {
		"/search?q=qwe": "..."
	}
}
					

WebPageReplay: перенаправление запросов

--host-resolver-rules="MAP *:80 127.0.0.1:8080,MAP *:443 127.0.0.1:8081,EXCLUDE localhost"

WebPageReplay: TLS

--ignore-certificate-errors-spki-list=<base64 subject>

WebPageReplay: и это работает

- не нужно больше ходить в сеть
- одинаковые условия для всех браузеров

Изменение требований

Участники тестирования

- Яндекс.Браузер
- Chrome
- Opera
- Firefox
- сделать решение коробочным
и все это за неделю

Проблема

--ignore-certificate-errors-spki-list

Браузер Поддержка
Chrome
Я.Браузер
Opera
Firefox

Нам срочно нужно другое решение!

Firefox

- установим сертификат в хранилище Firefox'a

Firefox

SSL_ERROR_BAD_CERT_DOMAIN

Решение №1

- генерируем сертификаты и ключи на лету


x509.Certificate {		
	NotBefore:    time.Now(),
	NotAfter:     time.Now().Add(365 * 24 * time.Hour),

	SerialNumber: 1,
	Issuer:       caCrt.Subject,

	Subject:      csr.Subject,
	DNSNames:     csr.DNSNames,

	KeyUsage:     x509.KeyUsageDigitalSignature,
	ExtKeyUsage:  []x509.ExtKeyUsage{x509.ExtKeyUsageAny},
}
					

Решение №1

- генерируем сертификаты и ключи на лету


http.Server{
    Addr:      ":443",
    TLSConfig: tlsconfig,
}
					

Решение №1

- генерируем сертификаты и ключи на лету


http.Server{
    Addr:      ":443",
    TLSConfig: tls.Config {
        ...
        GetConfigForClient: func(*ClientHelloInfo) (*Config, error)
        ...
    },
}
					

Решение №1

- генерируем сертификаты и ключи на лету


tls.Config{
    Certificates: []tls.Certificate{
        tls.Certificate{
            Certificate: [][]byte{certBytes},
            PrivateKey:  privateKey,
        }
    },
}
					

Firefox

SEC_ERROR_INADEQUATE_CERT_TYPE

"Неправильный" тип


x509.Certificate{
    ...
    // Key Usage: Any Purpose 
    ExtKeyUsage:  []x509.ExtKeyUsage{x509.ExtKeyUsageAny},
    ...
}
					

"Неправильный" тип: решение


x509.Certificate{
    ...
    // Key Usage: SSL/TLS Web Server Authentication 
    ExtKeyUsage:  []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
    ...
}
					

Firefox

SEC_ERROR_REUSED_ISSUER_AND_SERIAL

Проблема в Решении №1


x509.Certificate{
    ...
    SerialNumber: 1,
    ...
}
					

Решение №2

- пре-генерируем все сертификаты/ключи заранее в виде файлов
- храним SerialNumber персистентно
- кэшируем, чтобы не ходить на диск

Решение №3

- один сертификат/ключ с одним SerialNumber
- все доменные имена добавим в Subject Alt Names

И все счастливы!


Выводы

- Chromium - кастомизируем
- Firefox - параноик
- Go - неожиданно прост:
-- проще чем решать проблемы браузеров
-- просто встроиться в существующий код

Вопросы?

Вопросы?