サーバー証明書とクライアント証明書の両方の方法で、ssl (トランスポートセキュリティ) を使用して wcf クライアントとサーバー (自己ホスト型) を作成しようとしています。
Windows XP ではすべてが機能しますが、Windows 7 ではクライアント証明書で失敗しました。サーバーが winXp 上にあり、クライアントが win7 上にある場合は動作しますが、逆に動作しません。
サーバーの app.config は次のとおりです。
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
</behavior>
<behavior name="NewBehavior1">
<serviceMetadata httpsGetEnabled="true"/>
<serviceCredentials>
<serviceCertificate findValue="ServerCert" storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck" trustedStoreLocation="LocalMachine" />
</clientCertificate>
<windowsAuthentication allowAnonymousLogons="True"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="Binding1">
<security mode="Transport">
<transport clientCredentialType="Certificate" proxyCredentialType="None" realm=""/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="NewBehavior1"
name="Service.Calc">
<endpoint
address="https://172.18.96.116:8413/MyCalcService1"
binding="basicHttpBinding"
bindingConfiguration="Binding1"
name="TestWCFService.Http"
contract="Contarcts.ICalc" />
<host>
<baseAddresses>
<add baseAddress="https://172.18.96.116:8413/MyCalcService1" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
クライアント:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="clientBehavior1">
<clientCredentials>
<clientCertificate findValue="ClientCert"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="TestWCFService.Http1">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://172.18.96.116:8413/MyCalcService1"
binding="basicHttpBinding"
bindingConfiguration="TestWCFService.Http1"
contract="CalcProxy.ICalc"
name="TestWCFService.WSHttp1"
behaviorConfiguration="clientBehavior1"
/>
</client>
</system.serviceModel>
サーバーのコード:
ServiceHost calcHost = new ServiceHost(typeof(Calc));
calcHost.Open();
クライアントのコード:
System.Net.ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
CalcClient proxy = new CalcClient();
int res = proxy.Add(2, 4);
私のmakecertコマンドは次のとおりです。
makecert -sv SignRoot.pvk -cy authority -r MyCA.cer -a sha1 -n "CN=MyCA" -ss my -sr localmachine
makecert -iv SignRoot.pvk -ic MyCA.cer -cy end -pe -n CN="ClientCert" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12
makecert -iv SignRoot.pvk -ic MyCA.cer -cy end -pe -n CN="ServerCert" -eku 1.3.6.1.5.5.7.3.2 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12
また、CA が正しい場所 (ローカル コンピューター - 信頼されたルート CA) にあり、サーバー/クライアント証明書も正しい場所 (ローカル コンピューター - 個人) にあることを確認しました。
秘密鍵はエクスポート可能であり、「Everyone」が秘密鍵 (C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys) へのアクセス許可を持っていることを確認しました。
フィドラー経由で動作します。
SvcTraceViewer から得られるエラー:
クライアント側 -クライアント認証方式「匿名」で HTTP 要求が禁止されました。
サーバー側 -クライアント証明書が必要です。要求に証明書が見つかりませんでした。
HTTP トレースからのエラー:サーバー アプリケーションによるクライアント証明書の受信の試行が、次の状態で失敗しました: 0xC0000225。
私が見つけた同様の問題ですが、それでも立ち往生しています .NETアプリケーションがクライアント証明書の送信に失敗しました - Win 7 vs Win XP?
Windows 7 で動作させるにはどうすればよいですか?
ありがとう。