TLSを使用してクライアント/サーバーアプリケーションを開発しています。私のアイデアは、サーバーで認証されるようにクライアントで証明書を使用することです。また、サーバー上の別の証明書により、クライアントは適切なサーバーに接続していることも認証できます。
最初にopenssl s_serverとopenssl s_clientをテストして使用し、提案を検証します。
これまで、サーバー上にCA秘密鍵を作成し、ルート証明書を作成しました。ルート証明書を使用して2つのCSRに署名したため、サーバー用に1つの証明書とクライアント用に1つの証明書を取得します。
クライアント証明書とルート証明書をクライアントにインストールし、サーバー証明書とルート証明書をサーバーにインストールしました。
Openssl s_serverとopenssl s_clientの間に接続を確立して、両者が相互に認証されることを確認したいと思いますが、その方法をドキュメントで説明することはできません。それに関するヘルプやガイドはありますか?
設定が完了したら、次のステップは、開発したクライアントをそのサーバーに対してテストし、開発したサーバーをs_clientに対してテストすることです。それをテストに使用できますか?
ありがとう
テスト用に(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.c
とs_server.c
を見ることができます。それらは<openssl dir>/apps
にあります。ただし、コードは時々読みにくい場合があります。