web-dev-qa-db-ja.com

秘密鍵を公開せずにクライアント証明書を配布する方法は?

WCFに基づいてB2B Webサービスを設計しています。クライアントの数は比較的少なく、セキュリティが優先されるため、クライアント認証にX509クライアント証明書を使用することを選択しました。

私は自分の自己署名CA(もちろん安全に保管されています)を使用してクライアント証明書に署名しています。また、セットアップがローカルコンピュータセットで機能していることも確認しました。

1つの問題は私を悩ませ続けます。証明書を「物理的」に引き渡すことができる限り、問題はありません。しかし、クライアント証明書を実際のクライアントに安全に転送するための解決策を見つけることができないようです。これらは私がこれまでに思いついたオプションです:

1)PFX形式の対称暗号化を使用して証明書を暗号化します。次に、証明書を電子メールで送信し、古き良きカタツムリメール(つまり、物理的な手紙)で証明書を復号化するためのキーを送信します

2)クライアントが一時的なURL(電子メールアドレスに送信される資格情報)を使用してログインできるようにする簡単なWebサイトを作成し、証明書をダウンロードします。サイトはHTTPSを使用して保護されます。次に、セキュリティはクライアントの電子メールのセキュリティに完全に依存し、誰も電子メールからURLを取得しません。

私はオプション1)を好む傾向があります。実際の手紙から実際にキーを盗むのは誰かのための唯一のセキュリティ上の欠陥だからです。しかし、物理的な手紙を使うのは少し退屈なようです。

私が見落としているこの問題を解決するための事実上の標準は、合理的なセキュリティを提供しますか?

10
Henrikmh

証明書を作成する「通常の」方法は、秘密鍵がクライアントシステムから出ることは決してないということです。次のようになります。

  • 秘密鍵と公開鍵のペアがクライアントシステムで生成されます。
  • 公開キーは、証明書要求(通常はPKCS#10形式)の一部としてCAに送信されます。
  • CAは証明書を作成して署名し、証明書はクライアントに送り返されます。

重要な部分は、CAが発行時に適切なクライアントと通信していることを確認することです。しかし、少なくとも、公開データのみが転送されるため、物事はより簡単になります。

emailではなく、より伝統的な紙ベースのメールで、見込み顧客にワンタイムパスワードをメールで送信することをお勧めします。次に、それを使用してCAに登録します(もちろんHTTPS内)。人生を楽にします:必要なソフトウェアとプロセスが すでに含まれています であるCA製品を使用します。

15
Thomas Pornin

クライアントに証明書署名要求を生成させ、それをCAが署名するようにあなたに送信することができます。クライアントでCSRを生成すると、公開/秘密鍵ペアが作成され、CSRには公開鍵とID情報のみが含まれます。これにより、秘密鍵がネットワーク上で転送されることはありません。

これだけを行う製品があり、多要素認証が統合されています。それらを探す必要があります。

上記をコード化したい場合、MSシステムはActiveXを使用し、html5には上記で説明したことを実行するkeygen関数があります。

3
Fearmonger

問題の分析には、無限の時間枠という考えが含まれているようです。

HTTPSを介して証明書を送信し、バックエンドで証明書を1回だけ転送できるようにすることを検討してください。転送接続自体がMITMである場合を除き、顧客は他の誰も持っていない証明書を持っているか、他の誰かがそれを取得したことを知っています。顧客が再発行を要求すると、顧客が保存できないなどの理由で、無視できない金額の証明書を失効することになりますが、証明書は1人だけが受け入れたか、無効にする必要があることがわかります。

2
Jeff Ferland