Ответ 2
Создайте новый проект консольного приложения в VS.NET 2010. Теперь добавьте ссылку на dll
a. System.ServiceModel
b. System.ServiceModel.Web
c. System.Runtime.Serialization
Основной метод Program.cs имеет следующий код
public class Program
{
public static void Main(string[] args)
{
Uri baseAddress = new Uri("https://"+Environment.MachineName+":54321/hello");
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
WebHttpBinding web = new WebHttpBinding();
web.Security.Mode = WebHttpSecurityMode.Transport;
host.AddServiceEndpoint(typeof(IHelloWorldService), web, "").Behaviors.Add(new WebHttpBehavior());
host.Credentials.ServiceCertificate.Certificate = (X509Certificate2)GetX509Certificate();
host.Open();
Console.WriteLine("The service is ready at {0}", baseAddress);
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
host.Close();
}
}
private static X509Certificate GetX509Certificate()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);
X509Certificate certificate = null;
X509Certificate2Collection cers = store.Certificates.Find(X509FindType.FindBySubjectName, "localhost", false);
if (cers.Count > 0)
{
certificate = cers[0];
}
store.Close();
return certificate;
}
}
[ServiceContract]
public interface IHelloWorldService
{
[WebGet(UriTemplate="SayHello/{name}")]
string SayHello(string name);
}
public class HelloWorldService : IHelloWorldService
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
}
}
Теперь мы создаем сертификат, создавая пакетный файл следующих команд (взятых из MSDN) и выполняя его из командной строки VS.NET:
echo off
setlocal
call :setscriptvariables %1
IF NOT DEFINED SUPPORTED_MODE call :displayusage
IF DEFINED SUPPORTED_MODE call :cleancerts
IF DEFINED SETUP_SERVICE call :setupservice
IF DEFINED SETUP_CLIENT call :setupclient
GOTO end
:cleancerts
REM cleans up certs from previous runs.
certmgr.exe -del -r CurrentUser -s My -c -n %CLIENT_NAME%
certmgr.exe -del -r CurrentUser -s TrustedPeople -c -n localhost
certmgr.exe -del -r LocalMachine -s My -c -n localhost
certmgr.exe -del -r LocalMachine -s TrustedPeople -c -n %CLIENT_NAME%
certmgr.exe -put -r LocalMachine -s My -c -n %COMPUTER_NAME% computer.cer
IF %ERRORLEVEL% EQU 0 (
DEL computer.cer
pause
certmgr.exe -del -r LocalMachine -s My -c -n %COMPUTER_NAME%
)
:cleanupcompleted
GOTO :EOF
:setupclient
makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
IF DEFINED EXPORT_CLIENT (
certmgr.exe -put -r CurrentUser -s My -c -n %CLIENT_NAME% client.cer
) ELSE (
certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeople
)
GOTO :EOF
:setupservice
makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
IF DEFINED EXPORT_SERVICE (
certmgr.exe -put -r LocalMachine -s My -c -n %SERVER_NAME% service.cer
) ELSE (
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
)
GOTO :EOF
:setscriptvariables
REM Parses the input to determine if we are setting this up for a single machine, client, or server
REM sets the appropriate name variables
call :setcomputername
IF [%1]==[] CALL :singlemachine
IF [%1]==[service] CALL :service
IF [%1]==[client] CALL :client
set CLIENT_NAME=client.com
GOTO :EOF
:singlemachine
SET SUPPORTED_MODE=1
SET SETUP_CLIENT=1
SET SETUP_SERVICE=1
SET SERVER_NAME=localhost
GOTO :EOF
:service
SET SUPPORTED_MODE=1
SET SETUP_SERVICE=1
SET EXPORT_SERVICE=1
SET SERVER_NAME=%COMPUTER_NAME%
GOTO :EOF
:client
SET SUPPORTED_MODE=1
SET SETUP_CLIENT=1
SET EXPORT_CLIENT=1
GOTO :EOF
:setcomputername
REM Puts the Fully Qualified Name of the Computer into a variable named COMPUTER_NAME
for /F "delims=" %%i in ('cscript /nologo GetComputerName.vbs') do set COMPUTER_NAME=%%i
GOTO :EOF
:displayusage
ECHO Correct usage:
ECHO Single Machine - Setup.bat
ECHO Client Machine - Setup.bat client
ECHO Service Machine - Setup.bat service
:end
Теперь откройте консоль Microsoft Management Console и выберите "Файл" → "Добавить/удалить оснастку", чтобы добавить сертификаты - "Текущий пользователь и сертификат" - "Локальные компьютеры".
Перейдите в "Сертификат" - "Личный магазин локальной машины", чтобы найти созданный и установленный сертификат сервера localhost (self signed).
Теперь откройте свой IIS и щелкните правой кнопкой мыши на веб-сайте по умолчанию, чтобы добавить к нему привязку HTTPS с соответствующим номером вашего порта, который вы определили в своем консольном приложении (для моего 54321), и выберите сертификат как "localhost" ( сертификат, который был создан в вышеуказанных шагах) и нажмите "ОК" и "Закрыть"
![enter image description here]()
Теперь запустите приложение "Консоль", чтобы запустить свою службу, и теперь откройте скрипт и выполните запрос GET, как показано:
GET https://rajeshwin7:54321/hello/sayhello/rajesh HTTP/1.1
User-Agent: Fiddler
Host: rajeshwin7:54321
Теперь вы получите ответ, как показано ниже:
HTTP/1.1 200 OK
Content-Length: 90
Content-Type: application/xml; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 04 May 2012 14:51:25 GMT
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello, rajesh</string>
Если IIS не присутствует, откройте командную строку и введите в командной строке следующую команду для сопоставления портов http для сертификата ssl с помощью инструмента netsh в winvista и выше ОС и httpcfg для winxp.
C:\> netsh http add sslcert ipport=0.0.0.0:54321 certhash=6797aea29440de9389bc636e15a35b741d8c22a3 appid={2e80948d-9ae6-42c9-ad33-294929333965}
certhash - идентификатор отпечатка сертификата, созданного выше. Идентификатор отпечатка пальца можно получить, открыв консоль управления Microsoft - добавьте/удалите привязку для хранилища сертификатов учетной записи компьютера на локальном компьютере, а затем перейдите в личный магазин, чтобы найти сертификат (при условии, что он был установлен как указано выше), а затем дважды щелкните по сертификату и перейдите на вкладку сведений, чтобы найти идентификатор отпечатка в качестве одного из свойств (просто скопируйте его для использования в приведенной выше команде netsh, удалив пробелы)
appid - это руководство, связанное с вашим приложением, которое можно найти в файле assembly.cs в папке свойств проекта, как показано ниже:
![enter image description here]()
Теперь, чтобы очистить сертификат, создайте файл bathc с приведенными ниже командами и выполните его с помощью командной строки Vs.NET:
echo off
setlocal
set CLIENT_NAME=client.com
call :setcomputername
call :cleancerts
DEL client.cer > NUL 2>&1
DEL service.cer > NUL 2>&1
GOTO end
:cleancerts
REM cleans up certs from previous runs.
certmgr.exe -del -r CurrentUser -s My -c -n %CLIENT_NAME%
certmgr.exe -del -r CurrentUser -s TrustedPeople -c -n localhost
certmgr.exe -del -r LocalMachine -s My -c -n localhost
certmgr.exe -del -r LocalMachine -s TrustedPeople -c -n %CLIENT_NAME%
certmgr.exe -put -r LocalMachine -s My -c -n %COMPUTER_NAME% computer.cer
IF %ERRORLEVEL% EQU 0 (
DEL computer.cer
pause
certmgr.exe -del -r LocalMachine -s My -c -n %COMPUTER_NAME%
)
:cleanupcompleted
GOTO :EOF
:setcomputername
REM Puts the Fully Qualified Name of the Computer into a variable named COMPUTER_NAME
for /F "delims=" %%i in ('cscript /nologo GetComputerName.vbs') do set COMPUTER_NAME=%%i
GOTO :EOF
:end
Вы можете удалить сопоставление сертификатов ssl на порт с помощью команды netsh, как показано ниже:
c:\> netsh http delete sslcert ipport:0.0.0.0:54321