Программно импортировать сертификат в IIS? - PullRequest
14 голосов
/ 21 декабря 2010

У меня есть сертификат .pem для SSL, я хочу распространить его вместе с моим веб-приложением в MSI (должен запускаться на компьютерах клиентов). Затем мне нужно импортировать его (в какое-то хранилище учетных данных?) И указать привязкам моего сайта использовать его. Но как я могу сделать это в коде? Я обнаружил Microsoft.Web.Administration, но не уверен, куда идти дальше ...

Это в IIS7, кстати.

РЕДАКТИРОВАТЬ: цель здесь состоит в том, чтобы иметь веб-приложение, которое клиенты могут запускать в своих интрасетях. Он в основном выступает в качестве API для приложения для iPhone. (Может быть, это не лучший дизайн, но мы заперты сейчас.) Таким образом, клиент устанавливает MSI, и вуаля, у них есть веб-сервис. Теперь должна быть аутентификация по паролю между iPhone и веб-сервисом; казалось, что самый простой способ сделать это в https. Поэтому я сделал самоподписанный сертификат.

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

Итак, цель - аутентификация по паролю в веб-приложении интрасети с установкой в ​​один клик (ish). : -D

Ответы [ 2 ]

25 голосов
/ 22 декабря 2010

Ответ, дорогие читатели, таков:

// Assume 'site' is already set to your site via something like 
// Site site = mgr.Sites.Add(siteName, directory, 443);

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);

// Here, directory is my install dir, and (directory)\bin\certificate.pfx is where the cert file is.
// 1234 is the password to the certfile (exported from IIS)
X509Certificate2 certificate = new X509Certificate2(directory + @"\bin\certificate.pfx", "1234");

store.Add(certificate);

var binding = site.Bindings.Add("*:443:", certificate.GetCertHash(), store.Name);
binding.Protocol = "https";
store.Close();

Благодаря этой случайной теме: http://forums.iis.net/t/1163325.aspx

1 голос
/ 21 декабря 2010

Вам нужно сузить свой вопрос. Какой сертификат используется для (точно)?

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

Если вам нужно проверить сертификат сервера (и вы получили сертификат или цепочку сертификатов в вашем файле PEM), тогда это может сработать, но зачем вам устанавливать сертификат в хранилище сертификатов?

Следует отметить, что формат PEM изначально не поддерживается библиотеками Windows или .NET, поэтому перед развертыванием необходимо преобразовать его в PFX, а затем импортировать PFX или просто создать хранилище в памяти на основе PFX (вы найдете много информации, ища PFX или PKCS # 12 в StackOVerflow).

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

...