web-dev-qa-db-ja.com

OpenSSLを使用したSSL / TLSクライアント認証のテスト

TLSを使用してクライアント/サーバーアプリケーションを開発しています。私のアイデアは、サーバーで認証されるようにクライアントで証明書を使用することです。また、サーバー上の別の証明書により、クライアントは適切なサーバーに接続していることも認証できます。

最初にopenssl s_serverとopenssl s_clientをテストして使用し、提案を検証します。

これまで、サーバー上にCA秘密鍵を作成し、ルート証明書を作成しました。ルート証明書を使用して2つのCSRに署名したため、サーバー用に1つの証明書とクライアント用に1つの証明書を取得します。

クライアント証明書とルート証明書をクライアントにインストールし、サーバー証明書とルート証明書をサーバーにインストールしました。

Openssl s_serverとopenssl s_clientの間に接続を確立して、両者が相互に認証されることを確認したいと思いますが、その方法をドキュメントで説明することはできません。それに関するヘルプやガイドはありますか?

設定が完了したら、次のステップは、開発したクライアントをそのサーバーに対してテストし、開発したサーバーをs_clientに対してテストすることです。それをテストに使用できますか?

ありがとう

14
fazineroso

テスト用に(1)s_clientおよびs_serverで信頼のルートを設定しようとしているようです。 (2)OpenSSLを使用してプログラム内でコード内で。


openssl s_client(またはopenssl s_server)がルートを使用するようにするには、次のオプションを使用します。

  • ルートを指定する-CAfileオプション
  • -cert使用する証明書のオプション
  • -key証明書の秘密キーのオプション

詳細については、 s_client(1) および s_server(1) のドキュメントを参照してください。


クライアント上で同じことをプログラムで行うには、次を使用します。

  • SSL_CTX_load_verify_locationsは信頼されたルートをロードします
  • SSL_CTX_use_certificateはクライアント証明書を指定します
  • SSL_CTX_use_PrivateKeyは、クライアント証明書の秘密鍵をロードします

サーバー上で同じことをプログラムで行うには、次を使用します。

  • SSL_CTX_load_verify_locationsは信頼されたルートをロードします
  • SSL_CTX_use_certificate_chain_fileはサーバー証明書を指定します
  • SSL_CTX_use_PrivateKeyは、サーバー証明書の秘密鍵をロードします
  • SSL_CTX_set_client_CA_listは、クライアントにクライアント証明書を送信するように指示します

すべての接続(つまり、共通のコンテキスト)にパラメーターを使用したくない場合は、たとえば、SSL_use_certificateおよびSSL_use_PrivateKeyを使用して、SSL接続ごとにパラメーターを設定します。

SSL_CTX_set_client_CA_listで多くのことが行われています。 (1)サーバーがクライアントを検証するために使用するCAをロードする、(2)サーバーがクライアントを検証するときに受け入れるCAのリストを送信する、(3)ClientCertificateメッセージをトリガーするクライアントがサーバーの受け入れられたCAリストを満たす証明書を持っている場合、クライアントで。

また、 SSL_CTX_load_verify_locations(3)SSL_CTX_use_certificate(3)SSL_CTX_set_client_CA_list および友人に関するドキュメントも参照してください。


使用する最も簡単な証明書とキーの形式はPEMです。 PEMは、たとえば----- BEGIN CERTIFICATE -----を使用するものです。サーバー証明書については、ファイルがサーバーの証明書と、クライアントがチェーンを構築するために必要な中間体の連結であることを確認してください。

サーバーに必要なすべての証明書を送信させることは、「どのディレクトリ」問題として知られる問題の標準的な方法です。これはPKIでよく知られている問題であり、本質的には、クライアントが不足している中間証明書を取得する場所を知らないという問題です。


一般に、使用する必要のある機能はこれでわかりました。 nginx のような小さなサーバーをダウンロードし、運用サーバーが実際にそれらをどのように使用しているかを確認します。 SSL/TLSサーバーをセットアップするため、 Postgres のようなSQLサーバーを使用することもできます。ソースファイルでSSL_CTX_load_verify_locationsまたはSSL_load_verify_locationsを検索するだけで、適切な場所が見つかります。

推奨しませんが、s_client.cs_server.cを見ることができます。それらは<openssl dir>/appsにあります。ただし、コードは時々読みにくい場合があります。

27
jww