Разрешение для IUSR на CertOpenSystemStore()

Разрешение для IUSR на CertOpenSystemStore()

Мое CGI-приложение пытается использовать SSPI Schannel для создания TLS-соединения с другим сервером. http://www.coastrd.com/c-schannel-smtp

Процесс установления связи начинается с проверки наличия сертификата в хранилище сертификатов «MY». http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx

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

ДОБАВЛЕН

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

Сертификаты машины доступны для чтения всем, но для доступа к закрытому ключу требуются права администратора (или локального пользователя), если вы не настроите ACL.

ДОБАВЛЕН

В этой ситуации ограничений на сертификаты нет, но «МОЁ» хранилище сертификатов пусто, и я не хочу покупать сертификат только ради этого.

В настоящее время я использую WS2003. Сервер, к которому я подключаюсь, — gmail.com, чтобы отправлять письма с использованием TLS. Мой код может искать сертификат, но у меня его нет. Из прочитанного мной, кажется, что получить сертификат — это огромная головная боль, с регистрацией, покупкой и установкой, в противном случае вы получаете просто временное решение, которое не помогает. Если вы не знаете простого способа получить сертификат, это гораздо сложнее, чем я хочу просто отправить письмо из приложения CGI. Есть ли КАКОЙ-ЛИБО другой способ?

Я ОЧЕНЬ ценю твою помощь, Джо, но $30/год x nServers — это просто не вариант. Интересно, есть ли способ передать задачу другому процессу, который работает с привилегиями администратора, например, службе? Я мог бы даже создать приложение, которое будет считывать данные из указанной папки и отправлять любые найденные там письма. Кроме этого, мне придется попытаться повысить права приложения CGI до администратора.

ДОБАВЛЕН

Goyuix, спасибо за предложения. Задача состоит в том, чтобы предоставить автономное решение, не прибегая к другим библиотекам, таким как .NET (60 МБ) или ASP с сопутствующими проблемами.

Вы правы, мне нужна только аутентификация сервера. Я не знал, что можно аутентифицировать только одну сторону. Ваше утверждение: «Отсутствие клиентского сертификата не должно помешать вам установить безопасный канал для SMTP. Вам может просто понадобиться закодировать эту часть рукопожатия». оказалось решением.

Это напоминает мне старый анекдот про сантехника. Сантехника вызывают, чтобы прочистить канализацию. Он смотрит один раз, достает молоток и ударяет по трубе один раз. Он просит 180 долларов за 5 минут работы, перечисленных как: 30 долларов за вызов и 150 долларов за то, чтобы узнать, где ударить по трубе.

Спасибо вам обоим. Это был ДОЛГИЙ и тяжелый путь.

решение1

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

Если вам также необходима аутентификация клиента, то вам, вероятно, придется сделать следующее:

  • повысить уровень учетной записи IUSR и установить сертификат в хранилище машины
  • измените пул приложений для запуска от имени другого пользователя и сразитесь с ним

Что касается исправления связанного кода... ну, я бы предложил попробовать код SmtpClient, который идет с .NET Framework, если это вариант. Он поддерживает зашифрованные коммуникации и, теоретически, должен "просто работать". Является ли управляемый C++ вообще вариантом? Или, еще лучше, просто написать обработчик ASP.NET для этого?

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx

Вы также можете попробовать задать некоторые вопросы по коду наStackOverflow.com, возможно, люди там тоже смогут помочь.

решение2

Лучший вариантясм., это использовать сертификат машины и предоставить разрешение учетной записи IUSR на чтение закрытого ключа сертификата. Это ручной шаг, но очень простой, который нужно сделать всего один раз.

Существуют ли в вашей ситуации другие требования, которые могут помешать изменению разрешений сертификата?


Инструкции по началу работы

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

Я буду предполагать, что вы используете Windows Server 2003, если вы не укажете иное.

1) Установите сертификат в хранилище машины. Перейдите в Пуск | Выполнить и войдите в MMC, чтобы получить пустую консоль MMC. Перейдите в Файл | Добавить/удалить оснастку. Нажмите кнопку Добавить, чтобы выбрать оснастку. Выберите Сертификаты из списка и нажмите Добавить. Выберите опцию Учетная запись компьютера, затем Далее, Готово, Закрыть и, наконец, ОК.

2) Импорт сертификата в Machine Store. Разверните дерево и выберите папку Personal. Щелкните правой кнопкой мыши на Personal и выберите All Tasks, Import. Следуйте указаниям мастера, чтобы завершить процесс. Теперь сертификат должен быть в machine store.

3) Настройка разрешений закрытого ключа. В Windows 2008 это добавляется в графический интерфейс диспетчера сертификатов. В Windows 2003 вам нужно будет загрузитьИнструменты набора ресурсов Windows Server 2003. Для установки разрешений используйте следующий формат команды:

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

Где 'LOCAL_MACHINE\My' — хранилище персональных сертификатов на локальном компьютере, 'mycert' — имя вашего сертификата, а USER_ACCOUNT — учетная запись, которой будут предоставлены разрешения на чтение закрытого ключа. Вы можете попробовать учетную запись IUSR, но вам может потребоваться использовать 'NETWORK SERVICE' в зависимости от точного контекста, в котором работает ваше приложение CGI. Вам потребуется перезапустить IIS, чтобы изменения вступили в силу.документация для WinHttpCertCfgохватывает то, что он делает.

Теперь у вас должны быть разрешения на доступ к закрытому ключу. Вы по-прежнему будете использовать CertOpenSystemStore с флагом MY.

Надеюсь, это поможет.


Редактировать 2:

Простым местом для получения сертификата от признанного органа является GoDaddy. Вы можете получить SSL-сертификат, действительный в течение 1 года, за 30 долларов. Есть и другие места, которые могут быть дешевле, если немного поискать. Это не так уж и сложно сделать. Большинство сайтов очень удобны для пользователя и позволяют легко купить сертификат.

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

Связанный контент