web-dev-qa-db-ja.com

X509Certificate.CreateFromCertFile-指定されたネットワークパスワードが正しくありません

SSLを呼び出すクライアントとして使用したい.NETアプリケーションがありますSOAP Webサービス。foo.pfxという有効なクライアント証明書が提供されています。証明書自体のパスワード。

証明書は次の場所にあります: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の新しいインスタンスを作成する静的メソッドです。このメソッドはオーバーライドされず、引数はパスのみです。

例外を調べたところ、次のことがわかりました。

_COMPlusExceptionCode = -532459699
Source=mscorlib

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

23
p.campbell

.cerファイルではなく.pfxから証明書を作成しようとしたことがわかりました。

学んだ教訓...

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

代わりに、_X509KeyStorageFlags.MachineKeySet_のパラメーターを使用してX509Certificate2()を使用する必要がある場合があります。これにより、同様の問題が修正されました。これを示唆した元のウェブサイトへのクレジット: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in -production /

引用:

原因

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

ソリューション

あなたが試すことができる1つのことは、アカウントにログインして証明書をそのパーソナルストアにインポートすることによってユーザーキーストアを作成することです(そしてそれを再び削除します)。

別の解決策は、コンストラクターに追加のパラメーターを渡すことです–秘密鍵がローカルコンピューターに格納されている(想定されている)ことを示すフラグ– X509KeyStorageFlags.MachineKeySet、このように:var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

パスワードのないPFXの場合、パスワードは_string.Empty_として指定できます。

参照 https://stackoverflow.com/a/8291956/130352

11
Chris J

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

私は同じようなプロジェクトのためにこれをしなければならなかった、そしてそれがどのようにそれが達成されたかについての私のメモはここにある。

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

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

    C:\ Program Files\Windows Resource Kits\Tools> winhttpcertcfg -i(pfxファイルへのパス、たとえばe:\ Certs\Foo.pfx)-c LOCAL_MACHINE\My -a IIS_WPG -p(pfxファイルのパスワード)

  • 主要な情報を吐き出し、特権を与える

    アカウントに秘密鍵アクセスを許可:

    (SERVERNAME)\IIS_WPG
    

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

証明書構成の使用方法の詳細については、 ここ を参照してください。

次に、証明書のプッシュの実行方法に戻ります。

//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);

これは私が証明書を渡した方法ですが、あなたがあなたの証明書で何をする必要があるか正確にはわかりませんので、これはあなたにとって同じではないかもしれません。

7
benjamin

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

6
Douwe

私の場合、プライベートアプリケーションモードで実行しようとしていて、同じエラーが発生しました。

指定されたネットワークパスワードが正しくありません

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

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

次に、パスワードを使用するオーバーロードメソッドを使用するようにインポートを変更しました。

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

X509KeyStorageFlags.MachineKeySetが必要になる場合があります。

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

1
ABB

私の場合、アプリケーションプールでIDをNetworkServiceに変更すると、この問題が解決しました。

0
Peska