Как создать самоподписанный сертификат для доменного имени для разработки?


123

У меня есть subdomain.example.comто , что я использую в целях разработки. Мое решение для веб-приложений содержит веб-API и т. Д., Которые мне нужно вызывать из внешних систем, поэтому я не использую localhost.

Теперь мне нужно протестировать SSL и получить сертификат для моего subdomain.example.comдоменного имени разработки.

Я попытался создать самозаверяющий сертификат, как описано в http://technet.microsoft.com/en-us/library/cc753127(v=ws.10).aspx , но этот сертификат работает только для localhost. Можно ли использовать этот сертификат для моих целей или мне придется создавать самозаверяющий поддомен для моего поддомена разработки? Если мне нужно создать самозаверяющую сертификацию для моего поддомена разработки, какую утилиту или онлайн-службу (бесплатно) я могу использовать для этого?

Ответы:


133

С помощью функции самозаверяющего сертификата IIS вы не можете установить общее имя (CN) для сертификата и, следовательно, не можете создать сертификат, привязанный к выбранному вами поддомену.

Один из способов решения проблемы - использовать makecert.exe, который входит в комплект SDK .Net 2.0. На моем сервере это:

C:\Program Files\Microsoft.Net\SDK\v2.0 64bit\Bin\makecert.exe

Вы можете создать центр подписи и сохранить его в репозитории сертификатов LocalMachine следующим образом (эти команды необходимо запускать из учетной записи администратора или в командной строке с повышенными привилегиями):

makecert.exe -n "CN=My Company Development Root CA,O=My Company,
 OU=Development,L=Wallkill,S=NY,C=US" -pe -ss Root -sr LocalMachine
 -sky exchange -m 120 -a sha1 -len 2048 -r

Затем вы можете создать сертификат, привязанный к вашему субдомену и подписанный вашим новым органом:

(Обратите внимание, что значение параметра -in должно быть таким же, как значение CN, использованное для создания ваших полномочий выше.)

makecert.exe -n "CN=subdomain.example.com" -pe -ss My -sr LocalMachine
 -sky exchange -m 120 -in "My Company Development Root CA" -is Root
 -ir LocalMachine -a sha1 -eku 1.3.6.1.5.5.7.3.1

Затем ваш сертификат должен появиться в диспетчере IIS, чтобы быть привязанным к вашему сайту, как описано в сообщении Тома Холла.

Вся благодарность за это решение Майку О'Брайену за его отличный пост в блоге на http://www.mikeobrien.net/blog/creating-self-signed-wildcard


8
Мне удалось это сделать. Мне пришлось использовать командную строку Visual Studio 2010, makecert.exeчтобы оказаться на моем пути. Что касается сертификатов, я думал, что буду более безопасным и использую -a SHA512 -len 8192- на создание этого сертификата ушла целая вечность. И, как я и подозревал, это никак не повлияло на уровень шифрования, который использует IIS. По умолчанию IIS использует 128-битный режим, чтобы изменить это , вам нужно выполнить групповую политику . Еще одно замечание для других читателей: не меняйте магические числа после -eku, они необходимы.
BrainSlugs83

3
Выполните все вышеперечисленные команды из командной строки с правами администратора, в противном случае вы получите сообщение «Ошибка: сохранить закодированный сертификат в хранилище не удалось => 0x5».
Giles Roberts

1
Я также хотел бы поделиться отличной ссылкой Создание самоподписанных сертификатов с помощью makecert.exe для разработки . Ссылка объясняет пошаговый подход к созданию корневого сертификата, сертификата сервера и сертификата клиента. Плюс есть сообщение, объясняющее, как их использовать.
Викрам Сингх Шайни

3
Такие браузеры, как Chrome, устарели sha1. Замените -a sha512и подумайте о добавлении -len 2048ко второму makecertвызову, и все должно быть хорошо.
О. Джонс

2
Обратите внимание, что это больше не работает (по крайней мере, как показано выше) в Windows 10. Мне пришлось вместо этого использовать командлет PowerShell, который работал без каких-либо проблем.
DVK

120

Использование PowerShell

Начиная с Windows 8.1 и Windows Server 2012 R2 (Windows PowerShell 4.0) и выше, вы можете создать самозаверяющий сертификат, используя новый New-SelfSignedCertificate командлета:

Примеры:

New-SelfSignedCertificate -DnsName www.mydomain.com -CertStoreLocation cert:\LocalMachine\My

New-SelfSignedCertificate -DnsName subdomain.mydomain.com -CertStoreLocation cert:\LocalMachine\My

New-SelfSignedCertificate -DnsName *.mydomain.com -CertStoreLocation cert:\LocalMachine\My

Использование диспетчера IIS

  1. Запустите диспетчер IIS
  2. На уровне сервера в разделе IIS выберите Server Certificates.
  3. Справа в разделе Действия выберите Создать самозаверяющий сертификат.
  4. Там, где написано «Укажите понятное имя для сертификата», введите соответствующее имя для справки.
    1. Примеры: www.domain.comилиsubdomain.domain.com
  5. Затем выберите свой веб-сайт из списка слева.
  6. Справа в разделе Действия выберите Привязки.
  7. Добавьте новую привязку HTTPS и выберите сертификат, который вы только что создали (если ваш сертификат является сертификатом с подстановкой, вам необходимо указать имя хоста)
  8. Нажмите ОК и проверьте это.

7
+1 за решение PowerShell. Быстро и легко, и после этого новый сертификат появился в моем диспетчере IIS> Подключения> Сайты> [Мое приложение]> Изменить привязки> Изменить> раскрывающийся список SSL-сертификат.
Джон Шнайдер,

3
Выполнив приведенные выше инструкции, а затем просмотрев сертификат, инструкции не заполняли поле CN, которое все еще имело имя localhost.
daveD

7
Именно. Это не верно! «Дружелюбное имя» не имеет ничего общего с CN. Я не знаю, почему у этого ответа так много голосов?
c00000fd

25
Это вызывает положительные отзывы, потому что метод Powershell действительно работает. (См. Ответ @DivineOps) Вот используемая мною команда: она New-SelfSignedCertificate -FriendlyName *.mydomain.local -DnsName *.mydomain.local, localhost -CertStoreLocation Cert:\LocalMachine\Myсоздает сертификат в личном хранилище. Затем я сначала экспортировал сертификат в файл, а затем повторно импортировал его в IIS через IIS Manager (чтобы использовать его для привязки https), а затем в доверенные корневые центры сертификации через MMC (чтобы избежать предупреждений браузера).
Антон

3
-NotAfterОпция также удобно указать дату истечения срока действия (без него, по умолчанию только 1 год). Пример, который я использовалNew-SelfSignedCertificate -DnsName *.mydomain.com -FriendlyName *.mydomain.com -NotAfter (Get-Date).AddYears(15) -CertStoreLocation cert:\LocalMachine\My
Бен Амада

52

Чтобы создать новый сертификат для вашего конкретного домена:

Откройте Powershell ISE от имени администратора, выполните команду:

New-SelfSignedCertificate -DnsName *.mydomain.com, localhost -CertStoreLocation cert:\LocalMachine\My

Чтобы доверять новому сертификату:

  • Откройте mmc.exe
  • Перейдите в Корень консоли -> Сертификаты (локальный компьютер) -> Личный
  • Выберите сертификат, который вы создали, щелкните правой кнопкой мыши -> Все задачи -> Экспорт и следуйте инструкциям мастера экспорта, чтобы создать файл .pfx.
  • Перейдите в Console Root -> Certificates -> Trusted Root Certification Authorities и импортируйте новый файл .pfx.

Чтобы привязать сертификат к вашему сайту:

  • Откройте диспетчер IIS
  • Выберите свой сайт и выберите Edit Site -> Bindings на правой панели.
  • Добавьте новую привязку https с правильным именем хоста и новым сертификатом

2
Это работает только в Windows 8.1 и Windows Server 2012 R2 (Windows PowerShell 4.0) или более поздней версии, хотя вы можете сгенерировать сертификат в одной из этих ОС и импортировать его позже на другой компьютер (я только что сделал это, чтобы использовать этот сертификат с SSRS. установлен в Windows Server 2008 R2).
mprost

2
Вместо экспорта и импорта, чтобы скопировать его в доверенные корневые
центры

Копирование / вставка работает только на одном сервере. Вы также можете перетащить сертификат из личной папки в доверенные корневые центры сертификации на том же сервере, удерживая нажатой клавишу Ctrl. Если вы хотите, чтобы другой хост мог получить доступ к сайту без предупреждений, вам необходимо экспортировать его и попросить их импортировать сертификат в свой локальный TRCA (вам не нужно включать закрытый ключ).
jessewolfe

41

Мне пришлось ломать голову над самозаверяющими сертификатами в Windows, комбинируя кусочки из предоставленных ответов и дополнительных ресурсов. Вот мой собственный (и, надеюсь, полный) обзор. Надеюсь, это избавит вас от моей болезненной кривой обучения. Он также содержит информацию по связанным темам, которая рано или поздно появится, когда вы создадите свои собственные сертификаты.

Создайте самозаверяющий сертификат в Windows 10 и ниже

Не используйте makecert.exe. Microsoft устарела.
Современный способ использует команду Powershell.

Windows 10:

Откройте Powershell с правами администратора:

New-SelfSignedCertificate  -DnsName "*.dev.local", "dev.local", "localhost"  -CertStoreLocation cert:\LocalMachine\My  -FriendlyName "Dev Cert *.dev.local, dev.local, localhost"  -NotAfter (Get-Date).AddYears(15)

Windows 8, Windows Server 2012 R2:

В Powershell в этих системах параметры -FriendlyName и -NotAfter не существуют. Просто удалите их из командной строки выше.
Откройте Powershell с правами администратора:

New-SelfSignedCertificate  -DnsName "*.dev.local", "dev.local", "localhost"  -CertStoreLocation cert:\LocalMachine\My

Альтернативой является использование метода для более старой версии Windows ниже, который позволяет использовать все функции Win 10 для создания сертификатов ...

Старые версии Windows:

Моя рекомендация для более старых версий Windows - создать сертификат на машине Win 10, экспортировать его в файл .PFX с помощью экземпляра mmc (см. «Доверять сертификату» ниже) и импортировать его в хранилище сертификатов на целевой машине с старая ОС Windows. Чтобы импортировать сертификат, НЕ щелкайте его правой кнопкой мыши. Хотя в контекстном меню есть пункт «Импортировать сертификат», все мои попытки использовать его на Win Server 2008 не удалось. Вместо этого откройте другой экземпляр mmc на целевом компьютере, перейдите в «Сертификаты (локальный компьютер) / Персональные / Сертификаты» щелкните правой кнопкой мыши среднюю панель и выберите Все задачи → Импорт.

Полученный сертификат

Обе приведенные выше команды создают сертификат для доменов localhostи *.dev.local.
Версия Win10 дополнительно имеет срок жизни 15 лет и читаемое отображаемое имя «Dev Cert * .dev.local, dev.local, localhost».

Обновление: если вы укажете несколько записей имени хоста в параметре -DnsName(как показано выше), первая из этих записей станет субъектом домена (AKA Common Name). Полный список всех записей имен хостов будет храниться в поле Subject Alternative Name (SAN) сертификата. (Спасибо @BenSewards за указание на это.)

После создания сертификат будет сразу доступен в любых HTTPS-привязках IIS (инструкции ниже).

Доверяйте сертификату

Новый сертификат не является частью какой-либо цепочки доверия и поэтому не считается заслуживающим доверия ни одним браузером. Чтобы изменить это, мы скопируем сертификат в хранилище сертификатов для доверенных корневых центров сертификации на вашем компьютере:

Откройте mmc.exe, Файл → Добавить / удалить оснастку → выберите «Сертификаты» в левом столбце → Добавить → выберите «Учетная запись компьютера» → Далее → «Локальный компьютер ...» → Готово → ОК

В левом столбце выберите «Сертификаты (локальный компьютер) / Личный / Сертификаты».
Найдите только что созданный сертификат (в Win 10 может помочь столбец «Понятное имя»).
Выберите этот сертификат и нажмите Ctrl-C, чтобы скопировать его в буфер обмена.

В левом столбце выберите «Сертификаты (локальный компьютер) / Доверенные корневые центры сертификации / Сертификаты».
Нажмите Ctrl-V, чтобы вставить сертификат в это хранилище.
Сертификат должен появиться в списке доверенных корневых центров и теперь считается заслуживающим доверия.

Использование в IIS

Теперь вы можете перейти в диспетчер IIS, выбрать привязки локального веб-сайта → Добавить → https → ввести имя хоста формы myname.dev.local(ваш сертификат действителен только для *.dev.local) и выбрать новый сертификат → ОК.

Добавить в хосты

Также добавьте имя вашего хоста в C: \ Windows \ System32 \ drivers \ etc \ hosts:

127.0.0.1  myname.dev.local

Счастливый

Теперь Chrome и IE должны рассматривать сертификат как заслуживающий доверия и загружать ваш веб-сайт при открытии https://myname.dev.local.

Firefox поддерживает собственное хранилище сертификатов. Чтобы добавить сюда свой сертификат, вы должны открыть свой веб-сайт в FF и добавить его в исключения, когда FF предупреждает вас о сертификате.

Для браузера Edge могут потребоваться дополнительные действия (см. Далее).

Проверить сертификат

Firefox - лучший выбор для проверки ваших сертификатов. (Поверьте, я сам фанат Chrome, но в данном случае FF лучше.)

Вот причины:

  • Firefox использует свой собственный кеш SSL, который очищается при смене-перезагрузке. Таким образом, любые изменения сертификатов ваших локальных веб-сайтов будут немедленно отражены в предупреждениях FF, в то время как другим браузерам может потребоваться перезагрузка или ручная очистка кеша SSL Windows.
  • Также FF дает вам несколько ценных советов для проверки действительности вашего сертификата: нажмите «Дополнительно», когда FF покажет предупреждение о сертификате. FF покажет вам короткий текстовый блок с одним или несколькими возможными предупреждениями в центральных строках текстового блока:

Сертификат не является доверенным, поскольку он самоподписанный.

Это предупреждение верно! Как отмечалось выше, Firefox не использует хранилище сертификатов Windows и будет доверять этому сертификату только в том случае, если вы добавите для него исключение. Кнопка для этого находится прямо под предупреждениями.

Сертификат недействителен на имя ...

Это предупреждение показывает, что вы сделали что-то не так. Домен (подстановочный знак) вашего сертификата не соответствует домену вашего веб-сайта. Проблема должна быть решена либо путем изменения (под) домена вашего веб-сайта, либо путем выпуска нового сертификата, который соответствует. Фактически вы можете добавить исключение в FF, даже если сертификат не соответствует, но вы никогда не получите зеленый символ замка в Chrome с такой комбинацией.

Firefox может отображать множество других приятных и понятных предупреждений о сертификатах в этом месте, например, сертификаты с истекшим сроком действия, сертификаты с устаревшими алгоритмами подписи и т. Д. Я не нашел другого браузера, который дал бы мне такой уровень обратной связи, чтобы решить какие-либо проблемы.

Какой шаблон (под) домена мне выбрать для разработки?

В приведенной выше команде New-SelfSignedCertificate мы использовали подстановочный домен *.dev.local.

Вы можете подумать: а почему бы не использовать *.local?

Простая причина: это незаконный домен с подстановочными знаками.
Сертификаты с подстановочными знаками должны содержать как минимум доменное имя второго уровня.

Итак, домены формы *.localудобны для разработки веб-сайтов HTTP. Но не так много для HTTPS, потому что вам придется выдавать новый соответствующий сертификат для каждого нового проекта, который вы запускаете.

Важные примечания:

  • Допустимые домены хоста могут содержать ТОЛЬКО буквы от a до z, цифры, дефисы и точки. Знаки подчеркивания запрещены! Некоторые браузеры действительно придирчивы об этом подробно и могут дать вам трудное время , когда они упорно отказываются соответствовать своему домену motör_head.dev.localк вашему шаблону шаблону *.dev.local. Они подчинятся, когда вы переключитесь на motoer-head.dev.local.
  • Подстановочный знак в сертификате будет соответствовать только ОДНОЙ метке (= разделу между двумя точками) в домене, никогда больше. *.dev.local совпадает, myname.dev.local но НЕ other.myname.dev.local!
  • В *.*.dev.localсертификатах НЕЛЬЗЯ использовать многоуровневые подстановочные знаки ( ). Так other.myname.dev.localможет быть покрыт только подстановочным знаком формы *.myname.dev.local. В результате лучше не использовать доменную часть четвертого уровня. Поместите все свои вариации в часть третьего уровня. Таким образом, вы получите единый сертификат для всех ваших сайтов разработчиков.

Проблема с Edge

На самом деле это не касается самозаверяющих сертификатов, но все же связано со всем процессом:
после выполнения вышеуказанных шагов Edge может не отображать какой-либо контент при открытии myname.dev.local.
Причина - характерная особенность сетевого управления Windows 10 для современных приложений, называемая «Изоляция сети».

Чтобы решить эту проблему, откройте командную строку с правами администратора и один раз введите следующую команду:

CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe

Более подробную информацию о Edge и Network Isolation можно найти здесь: https://blogs.msdn.microsoft.com/msgulfcommunity/2015/07/01/how-to-debug-localhost-on-microsoft-edge/


2
Я хотел бы отметить здесь, что первое DNS-имя также сохраняется как имя субъекта, которое вы, возможно, не захотите использовать в качестве подстановочного знака.
Бен Сьюардс,

@BenSewards: Спасибо, что указали на это, Бен. Я обновил ответ, включив в него сведения о теме / поле SAN. Видите ли вы какие-либо проблемы с использованием подстановочного имени хоста в поле Тема вместо поля SAN?
Jpsy

@Jpsy - это работает для меня локально на сервере, где был создан самозаверяющий сертификат, но не в Firefox или Chrome на моих (клиентских) машинах. Я получаю, appname.dev has a security policy called HTTP Strict Transport Security (HSTS), which means that Firefox can only connect to it securely. You can’t add an exception to visit this site.что, как говорится, не позволяет вам добавить исключение клиента, вопреки вашей инструкции. Является ли это неправильной конфигурацией в самом IIS в отношении параметров SSL, Требовать SSL и клиентских сертификатов?
Code Maverick

@CodeMaverick: Может ли ваша проблема быть связана с каким-нибудь блокировщиком рекламы или антивирусным ПО? Другой вариант может заключаться в том, что сертификат не соответствует используемому вами доменному имени. Помните, что * в сертификате CN или SAN может представлять только один сегмент в доменном имени ( не содержащий точек). Таким образом, CN *.mydomain.comможет быть действительным сертификатом для, me.mydomain.comно не для me.at.mydomain.com.
Jpsy

14

Я столкнулся с той же проблемой, когда хотел включить SSL для проекта, размещенного на IIS 8. Наконец , после многих дней борьбы с командами makecert я использовал OpenSSL. Сертификат создается в Debian, но я мог легко импортировать его в IIS 7 и 8.

Загрузите OpenSSL совместимый с вашей ОС, и этот файл конфигурации. Установите файл конфигурации как конфигурацию по умолчанию OpenSSL.

Сначала мы сгенерируем закрытый ключ и сертификат центра сертификации (CA). Этот сертификат предназначен для подписи запроса на сертификат (CSR).

Вы должны заполнить все поля, которые требуются в этом процессе.

  1. openssl req -new -x509 -days 3650 -extensions v3_ca -keyout root-cakey.pem -out root-cacert.pem -newkey rsa:4096

Вы можете создать файл конфигурации с настройками по умолчанию следующим образом: Теперь мы сгенерируем запрос сертификата, который является файлом, который отправляется в центры сертификации.

В качестве общего имени необходимо указать домен вашего сайта, например: public.organization.com .

  1. openssl req -new -nodes -out server-csr.pem -keyout server-key.pem -newkey rsa:4096

Теперь запрос на сертификат подписан сгенерированным сертификатом CA.

  1. openssl x509 -req -days 365 -CA root-cacert.pem -CAkey root-cakey.pem -CAcreateserial -in server-csr.pem -out server-cert.pem

Сгенерированный сертификат необходимо экспортировать в файл .pfx, который можно импортировать в IIS.

  1. openssl pkcs12 -export -out server-cert.pfx -inkey server-key.pem -in server-cert.pem -certfile root-cacert.pem -name "Self Signed Server Certificate"

На этом этапе мы импортируем сертификат CA.

  1. На вашем сервере необходимо импортировать сертификат CA в доверенные корневые центры сертификации, чтобы IIS мог доверять импортируемому сертификату. Помните, что сертификат, который нужно импортировать в IIS, был подписан сертификатом ЦС.

    • Откройте командную строку и введите mmc .
    • Щелкните Файл .
    • Выберите Добавить / Удалить оснастку в ... .
    • Дважды щелкните Сертификаты .
    • Выберите Учетная запись компьютера и Далее -> .
    • Выберите " Локальный компьютер" и " Готово" .
    • Хорошо .
    • Перейдите в Сертификаты -> Доверенные корневые центры сертификации -> Сертификаты , щелкните Сертификаты и выберите Все задачи -> Импорт ...

введите описание изображения здесь

  • Выберите Далее -> Обзор ...
  • Вы должны выбрать Все файлы, чтобы просмотреть расположение файла root-cacert.pem .
  • Нажмите Далее и выберите Поместить все сертификаты в следующее хранилище : Доверенные корневые центры сертификации .
  • Щелкните Далее и Готово .

введите описание изображения здесь

На этом этапе IIS доверяет подлинности нашего сертификата.

  1. На последнем этапе мы импортируем сертификат в IIS и добавим сайт привязки.

    • Откройте диспетчер информационных служб Интернета (IIS) или введите inetmgr в командной строке и перейдите в раздел « Сертификаты сервера». .
    • Щелкните Импорт ... .
    • Задайте путь к файлу .pfx, парольную фразу и выберите хранилище сертификатов на веб-хостинге .

введите описание изображения здесь

  • Нажмите ОК .
  • Теперь перейдите на свой сайт в диспетчере IIS и выберите Bindings ... и добавьте новую привязку.

  • Выберите https в качестве типа привязки, и вы сможете увидеть импортированный сертификат.

  • Нажмите ОК, и все готово.

введите описание изображения здесь


Я хотел иметь более длительный срок действия с самоподписанным сертификатом, а Windows SDK с makecert.exe не был доступен на узле Windows. Хост Linux и этот ответ предоставили решение.
Richk

Я рад, что мой ответ оказался для вас полезным.
Джозеф

Куда поместить этот "public.organization.com" в команду openssl?
The One

2

Другой вариант - создать самозаверяющий сертификат, который позволяет указать доменное имя для каждого веб-сайта. Это означает, что вы можете использовать его во многих доменных именах.

В диспетчере IIS

  1. Щелкните узел имени машины
  2. Открытые сертификаты сервера
  3. На панели «Действия» выберите «Создать самозаверяющий сертификат».
  4. В поле «Укажите понятное имя ...» назовите его * Dev (выберите «Личный» из списка типов)
  5. Сохранить

Теперь на вашем сайте в IIS ...

  1. Управляйте привязками
  2. Создать новую привязку для Https
  3. Выберите свой самоподписанный сертификат из списка
  4. После выбора поле имени домена станет активным, и вы сможете ввести свое доменное имя.

введите описание изображения здесь


Спасибо за самый полезный ответ. По крайней мере, для использования в разработке это быстро.
cabaji99

0

Еще один простой способ создать самоподписанный сертификат - использовать Jexus Manager,

Jexus Manager

  1. Выберите узел сервера на панели Connections.
  2. На средней панели щелкните значок Сертификаты сервера, чтобы открыть страницу управления.
  3. На панели «Действия» выберите пункт меню «Создать самоподписанный сертификат ...».

https://www.jexusmanager.com/en/latest/tutorials/self-signed.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.