2

私は現在、実質的にチャットサーバーとは何かをいじっています。ユーザーをあまり公開したくないので、OpenSSL ライブラリの LibreSSL のフォークを使用して TLS 暗号化を追加しました。コードの残りの部分は正常に動作しているように見えますが、証明書を正しく処理していないと思います。

通信を暗号化するためだけでなく、サーバーが本当にクライアントが話したい相手であることを確認するために使用する必要があるプライベート/パブリック証明書をサーバー上に持っています。そして、それは私が理解できない部分です:

  1. サーバーの公開鍵をクライアントに渡すにはどうすればよいですか? 正しいサーバーと通信していることを確認するために必要です。それとも、ルート CA の証明書を含めて何か別のことをする必要がありますか? それを提供するAPIはありますか?公開鍵を実行可能ファイルと一緒に としてパッケージ化できますが.pem、クライアント要求に使用する公開サーバー鍵またはルート CA について OpenSSL に伝える API が見つかりません。

  2. クライアント用のシステム証明書を取得するにはどうすればよいですか? 今は.pemファイルに作成したばかりですが、クライアントをダウンロードするすべてのユーザーに対して一意の証明書を使用して新しいダウンロードを作成する必要はありません。確かに、「現在のユーザーの証明書」を取得する方法、またはOpenSSL APIを介してこの使用のために自動生成する方法はありますか?

誰かが使用する適切な API を教えてくれたら、それは素晴らしいことです! また、手がかり、SOに関する同様の質問へのリンク、チュートリアル、OpenSSL暗号初心者向けの書籍へのポインタ、回答、またはサンプルコードも取得します。

現在、クライアント プログラムとサーバー プログラムの両方で証明書を設定するためにSSL_CTX_use_certificate_file()との両方を使用しています。SSL_CTX_use_PrivateKey_file()上記のリンク先の Github チャット サーバー リポジトリでコードを確認できます。eleven_session.cpp

4

2 に答える 2

1

この問題について私を助けてくれたSteffenUllrichschacker22に感謝します。私が彼らのガイダンスと一緒に石畳にした解決策は次のとおりです。

接続後、クライアントは を使用して PEM ファイルからサーバーの公開証明書をロードし、 を使用して返された証明書とBIO_new(BIO_s_file())比較BIO_read_filename()します。0 が返されない場合、クライアントは正しいサーバーと通信していないため、接続を中止します。PEM_read_bio_X509_AUX()SSL_get_peer_certificate()X509_cmp()

サーバーのみが証明書を取得します。これは、SSL_CTX_use_certificate_file()(公開)を使用して設定しSSL_CTX_use_PrivateKey_file()、公開鍵と秘密鍵の両方を含む同じ PEM ファイルを指すように設定します。

既存の証明書検証を置き換えるため、検証コールバックを使用しないことにしたので、その部分も行う必要があります。load_cert()LibreSSL のファイルの関数はapps.c、証明書をロードする方法を理解する上で非常に役立ちました。

最終的なソース コードに興味がある場合は、11 チャット サーバーとクライアントの Git リポジトリから公開されています。

SSL ソケットを使用するのはこれが初めてなので、ここで何か問題を見つけた場合はお知らせください。この演習の要点は、それを正しく行う方法を学ぶことです。

于 2014-11-21T08:49:08.327 に答える