Во-первых, вы можете сгенерировать самоподписанный сертификат (с основными ограничениями CA) для вашего приложения (вы можете сделать так, чтобы ваше приложение генерировало его автоматически) и импортировать этот сертификат в ваш браузер как доверенный CA.
ЗатемВы можете сгенерировать новый сертификат на лету в зависимости от запрошенного имени хоста, выданного вашим ЦС (т. е. подписанного с использованием его закрытого ключа и с использованием DN субъекта СА в качестве DN эмитента нового сертификата).В этом вопросе есть подробности о генерации сертификатов в C #: Можно ли программно сгенерировать сертификат X509, используя только C #?
Этот сертификат должен соответствовать спецификациям HTTP overСпецификация TLS :
Если присутствует расширение subjectAltName типа dNSName, это ДОЛЖНО использоваться в качестве идентификатора.В противном случае ДОЛЖНО использоваться (наиболее определенное) поле общего имени в поле «Тема» сертификата.Хотя использование общего имени является существующей практикой, оно устарело, и сертификационным органам рекомендуется вместо этого использовать dNSName.
[...]
В некоторых случаях указывается URIкак IP-адрес, а не имя хоста.В этом случае iPAddress subjectAltName должно присутствовать в сертификате и должно точно соответствовать IP-адресу в URI.
Короче говоря, если запрошено только имя хоста, вам будет достаточно простоCN=hostname
RDN в Subject DN (хотя было бы лучше Subject Alt Name), но если это IP-адрес, вы должны поместить запись IP Subr альтернативного имени IP-адреса (хотя некоторые браузеры позволят вам избежать использования IP-адресав CN RDN на практике).
Если вам нужен прокси-сервер, который перехватывает TCP-пакеты без указания имени сервера, вам может оказаться очень трудно определить, какое именно имя хоста запрашивается.Я бы предложил выполнить обратный поиск в DNS для IP-адреса (который вы сможете найти) и поместить запись альтернативного имени субъекта DNS для каждой обратной записи DNS, а также запись альтернативного имени субъекта IP для IP-адреса.Это должно охватывать большинство случаев, за исключением тех случаев, когда клиент использует имя хоста, для которого IP-адрес не имеет обратной записи DNS.В противном случае вам просто нужно добавить исключение вручную в браузере (это хорошо, так как вы будете знать, что перехватываете свое собственное сообщение) или настроить его вручную в прокси.
Поиск имени хоста проще с помощью HTTP-прокси, настроенного в браузере, так как вам не нужно угадывать имя хоста, оно будет передано в CONNECT
HTTP-глагол.
(Конечно,Начнем с того, что для конкретного хоста вы можете сгенерировать сертификат с помощью makecert
, а не делать это на лету.)