WCF+WS-Securityを使って、WCFクライアントから送信されるUserName,Passwordを元に認証後提供するWCFサービスを作っています。それにはサーバ証明書が必要なのですが、やっかいだったのでメモ。
(あくまでもテスト用です。運用環境では、ちゃんと証明書を購入すべきです。)
- (オレオレな)証明書をサーバ証明書として利用する場合
- (オレオレな)証明書を信頼されたルート証明機関に登録し、そのルート証明機関から発行した証明書をサーバ証明書として利用する場合
個々に書かれている通りでできました。
まず、ここにある方法で証明書を発行しました。
すると、WCFクライアントで
「このプロセスにはこの秘密キーに対するアクセス権が必要です。」のようなことを言われてしまいます。
とか言われてしまいます。どうも、
makecert -sk SignedByCA -iv TempCA.pvk -n "CN=SignedByCA" -ic TempCA.cer SignedByCA.cer -sr currentuser -ss My
とする際に、
makecert -sk SignedByCA -iv TempCA.pvk -n "CN=SignedByCA" -ic TempCA.cer SignedByCA.cer -sr currentuser -ss My -pe -sky exchange
としないといけないようです。
しかし、上記コマンドを実行すると
Error:Can't create the key of the subject ('SignedByCA')
と怒られてしまいます。
いろいろやってみたら、
makecert - -iv TempCA.pvk -n "CN=SignedByCA" -ic TempCA.cer SignedByCA.cer -sr LocalMachine -ss My -sky exchange
-pe と -sk SignedByCA のオプションをなくすとうまくいけたようです。なぜ?
また、
WCFクライアントを起動すると今度は、
X.509 証明書 CN=SignedByCA のチェーンを構築できませんでした。使用された証明書には、確認できない信頼チェーンが含まれています。証明書を交換するか、certificateValidationMode を変更してください。失効の関数は証明書の失効を確認できませんでした。
と怒られます。
certificateValidationMode はPeerOrChainTrustを指定していましたが、これをNoneとかにしてしまったら、何のためにルート証明機関を登録したかわかりません。
「失効の関数は証明書の失効を確認できませんでした。」がくさかったので調べてみると
みたいに、RevocationModeをNoCheckにすればいけるのではというので、WCFクライアントのApp.configを
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
</serviceCertificate>
としたがうまくいかず。
ところが、コード上で直接プロパティをセットするとうまくいくようになりました。??
ServiceReference.ServiceClient service = new TestClient.ServiceReference.ServiceClient();
service.ClientCredentials.ServiceCertificate.Authentication.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck;
でも、失効リスト無視したらあまりテストにならないか





