1

OpenSSLライブラリ(total newb)の使用方法を学習しようとしていますが、クライアントが正しい証明書を使用してサーバーに接続する方法を理解するのに少し問題があり、証明書が正しくない場合は失敗します。私のユースケースは、中央CAを使用せずにp2pアプリケーションを構築することであるため、CA証明書に依存することはできません。具体的には、サーバーには通常どおり証明書/キーがあり、クライアントは他のp2pノードに投票を依頼することでサーバーの証明書を決定します。

私は2つの特定の質問があります:

  • 以下のコードスニペットでは、「暗号リスト」の下の選択をコメントアウトすると、クライアントが接続しないことを期待しています。それはまだ動作します!何かが足りないですよね?
  • クライアントにサーバー証明書を使用させる方法はありますか?それで接続を開くのに十分ですか?つまり、キーもCAもありませんか?

クライアント:

ctx = SSL_CTX_new(DTLSv1_client_method());
SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:!aNULL@STRENGTH");

// If I comment out below stuff, client still connects happily!?
if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM))
    printf("\nERROR: no certificate found!");

if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM))
    printf("\nERROR: no private key found!");

if (!SSL_CTX_check_private_key (ctx))
    printf("\nERROR: invalid private key!");

サーバ:

SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:!aNULL@STRENGTH"); // high strength ciphers
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);

if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM))
    printf("\nERROR: no certificate found!");

if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM))
    printf("\nERROR: no private key found!");

if (!SSL_CTX_check_private_key (ctx))
    printf("\nERROR: invalid private key!");

私のコードはhttps://github.com/a34729t/exp/tree/master/tun2udp/dtlsにあります; これは、RobinSeggelmannのDTLSの例で構成されています。具体的には、server3_oo.cを使用しています。

4

1 に答える 1

1

SSL/TLS はさまざまなモードで動作できます。最も一般的なモードはサーバー認証のみで、サーバーのみが証明書とキーを持っています。次に、クライアント認証とも呼ばれる相互認証モードがあり、クライアントにも (クライアント) 証明書とキーがあります。そして、サーバーもクライアントも自分自身を認証せず、証明書と鍵も必要としない完全匿名モードがあります。

特にOpenSSLを指定しない限り、サーバー認証のみのモードで動作します。このモードでは、クライアントで次の行が表示されます。

if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM))
    printf("\nERROR: no certificate found!");
if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM))
    printf("\nERROR: no private key found!");

クライアントにクライアント証明書をロードさせます(ところで、クライアントにサーバー証明書とキーをロードする必要はありません)。ただし、サーバーはクライアントに証明書を要求しないため、クライアントが証明書を提示することはありません。これらの行をコメントアウトすると、クライアントはクライアント証明書をロードしなくなりますが、クライアント証明書は使用されていないため、違いはありません。

サーバーがクライアントに証明書を要求し、何も提示されていない場合はサーバーが接続を拒否するようにするには、サーバーに次のように伝える必要があります (エラー処理は省略されています)。

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);

SSL_VERIFY_PEERサーバーにクライアント証明書を要求させ、クライアントが証明書をSSL_VERIFY_FAIL_IF_NO_PEER_CERT提示しない場合はサーバーに接続を中止させます (ドキュメントを参照)。後者のオプションを使用しない場合は、クライアントがSSL_get_peer_certificate関数を使用して証明書を送信したかどうかを自分で確認できます。

于 2013-01-22T00:24:58.410 に答える