[〜#〜] iis [〜#〜] を使用しておらず、このコンピューターにもインストールされていません。私もapp.config
ファイルまたはweb.config
ホストされているコンソール内のファイル [〜#〜] wcf [〜#〜][〜#〜] rest [〜#〜] サービス。しかし、ホストコンソールアプリケーションでHTTPSを実行してみたいと思います。
class Program
{
static void Main(string[] args)
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost Host = new ServiceHost(typeof(Service), new Uri(baseAddress));
//WebHttpBinding binding = new WebHttpBinding();
//binding.Security.Mode = WebHttpSecurityMode.Transport;
Host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
Host.Open();
Console.WriteLine("Host opened");
Console.ReadLine();
サービスを [〜#〜] https [〜#〜] で実行する方法はありますか?
ルート権限とHTTPS証明書を作成してインストールします
管理者としてコマンドプロンプトを開きます。
フォルダC:\Certs
を作成し、そのフォルダに移動します。
#Root Authority
makecert.exe -r -pe -n "CN=My Root Authority" -ss CA -sr LocalMachine -a sha1 -sky signature -cy authority -sv CA.pvk CA.cer
#Certificate
makecert.exe -pe -n "CN=localhost" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv server.pvk server.cer
#key
pvk2pfx.exe -pvk server.pvk -spc server.cer -pfx server.pfx
** makecertおよびpvk2pfxのデフォルトの場所はC:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\binです。
証明書をインストールする
コマンドラインから:
certmgr.exe -add CA.cer -r LocalMachine -s CertificateAuthority
certmgr.exe -add server.pfx -r LocalMachine -s My -all
MMCから:
コマンドプロンプトに移動してMMCと入力し、 [〜#〜] mmc [〜#〜] を開きます。これにより、空白のMMCコンソールが開きます。スナップインの追加/削除をクリックします。証明書を追加し、[コンピューターアカウント]/[ローカルコンピューター]を選択します。
中間証明機関/証明書に移動します。右クリックしてインポートを選択します。 CA.cerファイルを作成したフォルダーに移動し、クリックしてインポートします。
[個人/証明書]に移動し、[インポート]を右クリックします。 server.pfxファイルを見つけ(使用可能な拡張子のリストからPFXを選択する必要があります)、このファイルをインポートします。完了したら、ダブルクリックして証明書を開き、[詳細]の下の拇印をメモします。これを メモ帳 に貼り付け、先頭の余分な?
を削除して、スペースを削除します。
サーバー拇印の証明書を取得するには、これを PowerShell で実行できます。
$getThumb = Get-ChildItem -path cert:\LocalMachine\TrustedPeople | where { $_.Subject -match "CN=localhost" }
$getThumb.thumbprint
WCFポートを netsh で登録およびマップします
WCFポートにマップする
netsh http add sslcert ipport=0.0.0.0:8000 certhash=73269e9b554f58d75e77880f5ff72b50c8d724ee appid={e2eaacd9-92e6-43cc-b51c-7a7887149607}
appid - any GUID
certhas - this is the thumb print from the step 2
ホストを設定する
HTTPSに設定し、トランスポートセキュリティを有効にします。
string baseAddress = "https://" + Environment.MachineName + ":8000/Service";
var binding = new WebHttpBinding();
binding.Security.Mode = WebHttpSecurityMode.Transport;
詳細な参照
HTTPおよびHTTPSの構成 (MSDN)
方法:SSL証明書を使用してポートを構成する (MSDN)
また、sslcertの追加で問題が発生した場合:
Stack Overflowの質問SSLとWCFを使用したセルフホスティング-証明書をポートにバインドできません
Stack Overflowの質問netshを使用して、SSL証明書をポート番号にバインドできません
Stack Overflowの質問IISを使用しないWCFサービスの証明書
VS.NET 2010で新しいコンソールアプリプロジェクトを作成します。次に、dllへの参照を追加します。
a. System.ServiceModel
b. System.ServiceModel.Web
c. System.Runtime.Serialization
Program.csMainメソッドのコードは次のとおりです。
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管理コンソールを開き、[ファイル]-> [スナップインの追加と削除]を選択して、証明書を追加します-現在のユーザーと証明書-ローカルマシンストア
[証明書]-[ローカルマシンパーソナルストア]に移動して、作成およびインストールされたlocalhost(自己署名)というサーバー証明書を見つけます。
次に、IISを開き、デフォルトのWebサイトを右クリックして、コンソールアプリ(私の54321の場合)で定義したポート番号と一致するHTTPSバインディングを追加し、証明書を選択します。 「localhost」(上記の手順で作成された証明書)になり、「OK」と「閉じる」をクリックします
次に、コンソールアプリを起動してサービスを実行し、次に示すようにfiddlerを開いて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が存在しない場合は、コマンドプロンプトを開き、コマンドプロンプトで次のように入力して、winvista以降のOSのnetshツールとwinxpのhttpcfgを使用してssl証明書のhttpポートマッピングを実行します。
C:\> netsh http add sslcert ipport=0.0.0.0:54321 certhash=6797aea29440de9389bc636e15a35b741d8c22a3 appid={2e80948d-9ae6-42c9-ad33-294929333965}
certhash-上記で作成した証明書の拇印ID。拇印IDは、Microsoft管理コンソールを開いて取得できます-ローカルマシン上のコンピューターアカウントの証明書ストアのスナップインを追加/削除し、パーソナルストアに移動して証明書を見つけます(上記のようにインストールされている場合)。証明書をダブルクリックし、[詳細]タブに移動して、プロパティの1つとして拇印IDを見つけます(スペースを削除して、上記のnetshコマンドで使用するためにコピーするだけです)。
appid-以下に示すように、プロジェクトプロパティフォルダーのAssembly.csファイルにあるアプリケーションに関連付けられたGUIDです。
次に、証明書をクリーンアップするために、以下のコマンドを使用して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
以下のようにnetshコマンドを使用して、ポートへのssl証明書のマッピングを削除できます。
c:\> netsh http delete sslcert ipport:0.0.0.0:54321