2009-05-22 80 views
16

SSL SOAP Webサービスを呼び出すクライアントとして使用する.NETアプリケーションがあります。 foo.pfxという有効なクライアント証明書が提供されています。証明書自体にはパスワードがあります。X509Certificate.CreateFromCertFile - 指定されたネットワークパスワードが正しくありません。

私は次の場所に証明書を設置しました:C:\certs\foo.pfx

をWebサービスを呼び出すために、私は、クライアント証明書を添付する必要があります。コードは次のとおりです。

public X509Certificate GetCertificateFromDisk(){ 
    try{    

     string certPath = ConfigurationManager.AppSettings["MyCertPath"].ToString(); 
     //this evaluates to "c:\\certs\\foo.pfx". So far so good. 

     X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath); 
     // exception is raised here! "The specified network password is not correct" 

     return cert; 

    } 
    catch (Exception ex){  
     throw; 
    } 
} 

例外として、.NETアプリケーションがディスクを読み込もうとしているようです。メソッドCreateFromCertFileは静的メソッドで、X509Certificateの新しいインスタンスを作成する必要があります。このメソッドはオーバーライドされず、パスも1つだけです。私は例外を検査する場合

、私はこれを見つける:

_COMPlusExceptionCode = -532459699 
Source=mscorlib 

質問:誰が例外の原因は、「指定されたネットワークパスワードが正しくありません」何を知っているのですか?

答えて

25

.cerファイルの代わりに.pfxから証明書を作成しようとしていたことがわかりました。

レッスンを学んだ...

  • .cerのファイルはバイナリ形式でX.509証明書です。彼らはDER encodedです。
  • .pfxファイルは、コンテナファイルです。 DERもコード化されています。証明書だけでなく、暗号化された形式の秘密鍵も含んでいます。
+2

あなたの情報は私に保存されました – user217648

+0

@ p.campellはローカルディレクトリから.pfx証明書をアップロードし、その証明書の拇印を得ることができますか? – drgmak

6

場合によっては、.cerファイルをエクスポートする前に、信頼レベルを上げるために、まずサーバーに証明書をインストールする必要があります。

私は同様のプロジェクトでこれを行う必要がありました。ここでは、それがどのように達成されたかについてのメモがありました。

Foo.cerを、サーバーにインストールされている証明書のエクスポートに置き換えます。 (pfxファイルから証明書をインストールし、cerファイルにエクスポートします。)

  • IIS6は、証明書のキーにIIS_WPGグループへのアクセスを許可するためのコマンド。 winhttpcertcfgをインストールする必要があります(下のリンクをクリックして自分のコピーを入手できます)。

    C:¥Program Files¥Windowsリソースキット¥Tools> winhttpcertcfg -i(e:¥Certs¥Fooなどのpfxファイルへのパス)。PFXファイルのPFX)-c LOCAL_MACHINE \マイ-a IIS_WPG -p(パスワード)

  • は、鍵情報を出してくれると権限

    アカウントの秘密キーのアクセス権を付与する付与:

    (SERVERNAME)\IIS_WPG 
    

ダウンロードするWinHttpCertCfg.msihere exeをインストールします。

cert設定の使用方法の詳細はhereです。

次に、あなたのcert pushをやっているところに戻ってきます。私は、証明書を渡されていますが、これはあなたのために同じではないかもしれませんので、あなたの証明書をどうする必要がされている正確にわからないどのように

//Cert Challenge URL 
Uri requestURI = new Uri("https://someurl"); 

//Create the Request Object 
HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(requestURI); 

//After installing the cert on the server export a client cert to the working directory as Foo.cer 
string certFile = MapPath("Foo.cer"); 
X509Certificate cert = X509Certificate.CreateFromCertFile(certFile); 


//Set the Request Object parameters 
pageRequest.ContentType = "application/x-www-form-urlencoded"; 
pageRequest.Method = "POST"; 
pageRequest.AllowWriteStreamBuffering = false; 
pageRequest.AllowAutoRedirect = false; 
pageRequest.ClientCertificates.Add(cert); 

これを。

5

OSストアの1つでインポートしようとしている証明書がすでにそのストアに存在する場合、「指定されたネットワークパスワードが正しくありません」というエラーメッセージが返されます。

6

ユーザーX509Certificate2()には、X509KeyStorageFlags.MachineKeySetの代わりにユーザーが必要な場合があります。これにより、私たちが持っていた同様の問題が修正されたこのことを示唆したオリジナルのウェブサイトへのクレジット:http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production/

が引用:

原因

を問題の原因は、 エラーメッセージで行うことが多くを持っていないようです。なんらかの理由で、コンストラクタは秘密鍵が開かれているファイルの に格納されていますが、 を秘密鍵ストアにアクセスしようとしています。デフォルトでは、ユーザーキーストアが使用されていますが、 ASP.NET(おそらく非対話型のWindowsサービスの場合もあります)は でオープンできません。選択したアカウント のユーザーキーストアが存在しない可能性もあります。あなたが試みることができる

ソリューション

ことの一つは、(再びそれを削除し、 ) にアカウントをログインすることで、ユーザのキーストアを作成し、その個人ストアに証明書をインポートしています。 var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

: - に格納された(されるはず)である秘密鍵を示すフラグローカルコンピュータ - X509KeyStorageFlags.MachineKeySet、このような

別の解決策は、コンストラクタ に追加のパラメータを渡すことですパスワードのないPFXの場合、パスワードはstring.Emptyと指定できます。

は、私がプライベートアプリケーションモードで実行しようとしていたと私は同じエラーを得た私の場合もhttps://stackoverflow.com/a/8291956/130352

2

参照してください。

指定されたネットワークパスワードが正しい

ではありません(Xero.Api.Example.Applications.Private中)PrivateAuthenticatorコンストラクタは、証明書の作成中に定義されたパスワードがないと仮定すると、証明書をインポートしようとしていました。

_certificate = new X509Certificate2(); 
_certificate.Import(certificatePath); 

は、その後、私はあなたがX509KeyStorageFlags.MachineKeySetする必要があるかもしれません

_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet); 
0

、パスワードを使用して、過負荷メソッドを使用してインポートを変更しました。

ウェブジョブの証明書を使用しています。