2017-03-24 14 views
0

ユーザー認証にTLSクライアント証明書を使用するWebサービスがあります。ここで、サービスが証明書の認証を正しく実装する(「設定されています」)場合、フルスタックテストを作成したいと思います。キー/証明書が一致しない場合のTLS証明書のテスト

特に、提示されたクライアント証明書と一致しないキーで要求を暗号化できるかどうかは疑問です。

理想的には、テストはPythonで書かれていますが、その他の共通言語も同様です。

だから私の最初の試みは、Pythonのrequestsパッケージを使用していた:

requests.post(url, data=payload, cert=(cert_path, key_path), verify=False) 

鍵が証明書と一致した場合、これは動作しますが、不一致の場合には、私はちょうど、クライアントである

requests.exceptions.SSLError: [X509: KEY_VALUES_MISMATCH] key values mismatch (_ssl.c:2718) 

を取得リクエストがサーバーにヒットしないようにします(したがって、何もテストしません)。

私の質問です:それは実際には悪い証明書を提示することは可能ですか、それはプロトコル設計によって不可能ですか?どのようにそのようなテストを実装するためのヒント?

+0

証明書の所有者であることを証明するために、その秘密鍵で作成されたデジタル署名を提示する必要があるため、正しい秘密鍵も持っていない限り、証明書を提示することはできません。私はそれを許可することを認識しているSSL APIはありません。 – EJP

答えて

2

TLSプロトコルでは、含まれている署名がクライアントから送信された証明書と一致しないCertificateVerifyメッセージを送信することができます。したがって、このシグネチャの目的は、クライアントが送信された証明書と一致する秘密鍵にアクセスできることを証明することなので、プロトコル設計によって除外されず、除外することは不可能です。

しかし、requestsを使用すると、あなたは実際に典型的な間違いからあなたを守ろうとする非常に高いレベルでテストを行っています。無効な署名などでテストを行う場合は、たとえば、scapyを使用して独自のTLSハンドシェイクを作成するなど、より低いレベルで作業する必要があります。このようなテストを行うためにTLSがどのように機能するかについて深い知識が必要であることに注意してください。

1

HTTPSを実行していると仮定すると、サーバを拒否するように設定している場合は、「不良」の証明書で基本SSL接続を完了できません。

SSL接続がないため、どのような種類のHTTPリクエストも渡すことはできません。

デザインのポイントは、不要なクライアントを完全に排除することです。