Назад | Перейти на главную страницу

Разрешение для 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.

ДОБАВЛЕНО

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

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

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

ДОБАВЛЕНО

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

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

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

Спасибо вам обоим. Это был ДОЛГОЙ трудный труд.

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

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


Как начать

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

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

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

2) Импорт сертификата в 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, но вам может потребоваться использовать «СЕТЕВОЙ СЕРВИС» в зависимости от точного контекста, в котором работает ваше приложение CGI. Вам потребуется перезапустить IIS, чтобы изменения вступили в силу. В документация для WinHttpCertCfg охватывает то, что он делает.

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

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


Изменить 2:

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

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

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

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

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

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

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

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