2017-09-13 10 views
1

私は、SharePointアプリケーションと1つのサービスプロバイダの間で統合サービスを作成することになっていました。私が統合しようとしているサービスプロバイダの要件の1つは、私たち自身の秘密鍵で署名された私の要求を検証するために使用する公開鍵を提供することです。キーセットが存在しない/ r/n

最初に私は証明書ストアを読み込んで、私の要求に署名するのに使う秘密鍵を取得するコンソールアプリケーションを作成しました。コンソールアプリケーションは正常に動作するので、私は今SharePointアプリケーション内でそれを移動することに決めました。残念ながら、このコードの特定の部分で失敗します。

key.FromXmlString(privateCert.PrivateKey.ToXmlString(true)); 

証明書を取得し、署名は以下の見つけることができず、全体のコードスニペット:

 X509Certificate2 privateCert = null; 
     X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.MaxAllowed); 

     var certs = store.Certificates.Find(X509FindType.FindByThumbprint, "thumbprinthere", true); 

     if (certs.Count > 0) 
     { 
      privateCert = certs[0]; 
     } 

     RSACryptoServiceProvider key = new RSACryptoServiceProvider(); 
     key.FromXmlString(privateCert.PrivateKey.ToXmlString(true)); 

     byte[] sig = key.SignData(Encoding.ASCII.GetBytes(data), CryptoConfig.MapNameToOID("SHA256")); 
     string signature = Convert.ToBase64String(sig); 

[UPDATE]

私はこのlinkの手順に従ってみました。私はまずサーバー内の私の秘密鍵をアンインストールしました。その後、証明書ストアにインポートし、Thumbprintプロパティがあることを確認しました。その後、findprivatekey.exeを実行し、MachineKeysフォルダに移動できました。そこから、ネットワークサービス、IIS_IUSRS、そしてSPFarm管理者だけでなくサーバーにログインするために使用したローカルアカウントまでさまざまなユーザーを追加しましたが、引き続きエラーが発生しています。

また、私が追加した鍵がエクスポート可能であることを確認して、アプリケーションが証明書に添付された秘密鍵を抽出する方法が必要であるようにしました。

[UPDATE 2]

それだけ前私は秘密鍵を抽出するために使用した変数に割り当てる1つの証明書を返すように、私は、コードを更新。同じ問題は、certs変数が正確に1つのレコードを返すことがわかっても同じ問題です。

答えて

0

多くのチェックの後、私は上記のメソッドコードブロックを呼び出す際に重要な部分を見逃していました。私はそれを昇格特権ブロックに包んで忘れてしまった。それをした後、コードは私のコンソールアプリと同様に機能しました。

SPSecurity.RunWithElevatedPrivileges(delegate()) 
{ 
    ... 

    X509Certificate2 privateCert = null; 
    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
    store.Open(OpenFlags.MaxAllowed); 

    var certs = store.Certificates.Find(X509FindType.FindByThumbprint, "<thumbprinthere>", true); 

    if (certs.Count > 0) 
    { 
     privateCert = certs[0]; 
    } 

    RSACryptoServiceProvider key = new RSACryptoServiceProvider(); 
    key.FromXmlString(privateCert.PrivateKey.ToXmlString(true)); 

    byte[] sig = key.SignData(Encoding.ASCII.GetBytes(data), CryptoConfig.MapNameToOID("SHA256")); 
    string signature = Convert.ToBase64String(sig); 

    ... 
}); 
+0

もっと説明できますか。ありがとう – aghilpro

+0

私はコードブロックをRunWithElevatedPrivilegesメソッドの中に追加しました。基本的には、ユーザーがフルコントロールを持っていなくてもフルコントロール権限でコードブロックを実行するということです。 MSDNによれば、RunWithElevatedPrivilegesは、アプリケーションプールIDの下に含まれているメソッドを実行します。私はアプリケーションプールに証明書へのアクセス権を与えているので、昇格した権限でコードブロックを実行すると、証明書の秘密鍵にアクセスするのに十分な権利が与えられました。 –

関連する問題