Boostは双方向認証ソリューションを実現します
boost :: asio :: ssl :: context
- OpenSSLとの相互認証を実行するには、クライアント側で使用
SSL_VERIFY_PEER
し、サーバー側で使用する必要がありますSSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT
。サーバー側SSL_VERIFY_PEER
でのみ使用される場合は、証明書要求をクライアントに送信するだけですが、クライアントが証明書を返送しない場合は、サイレントに受け入れます。 - ctx.set_verify_mode(ssl :: verify_peer); // クライアント側
- ctx.set_verify_mode(verify_peer :: ssl | ssl :: verify_fail_if_no_peer_cert); //サーバー側
-サーバー証明書Common Name
はip|域名
同じでした-サーバー
のみがクライアント証明書のルートcaを検出します
set_verify_mode(ssl::verify_peer | ssl::verify_fail_if_no_peer_cert) //配置启用双向认证
// 也能用ssl_socket调用 (typedef ssl::stream<tcp::socket> ssl_socket)
ssl_socket.set_verify_mode(ssl::verify_peer | ssl::verify_fail_if_no_peer_cert) //配置启用双向认证
ssl_socket.set_verify_callback(boost::asio::ssl::rfc2818_verification(url.server)); //验证证书与host是否匹配
load_verify_file(file) //加载信任的根证书 文件
add_certificate_authority(buffer) //加载信任的根证书 内容
use_certificate_chain_file //加载自己的证书 文件
use_private_key_file //加载自己的私钥 文件
openssl
OpenSSLはECDSAを使用してWebブラウザを認証します
openssl s_client -connect wikipedia.org:443
OpenSSLは双方向認証ソリューションを実現します
相互認証のポイントは以下の機能です(サーバーとクライアントは同じです)
SSL_CTX_set_verify ----配置启用双向认证
SSL_CTX_load_verify_locations ----加载信任的根证书
SSL_CTX_use_certificate_file ----加载自己的证书
SSL_CTX_use_PrivateKey_file ----加载自己的私钥
SSL_get_verify_result ----真正进行验证,一定要调用这个函数不然前面四个光配置而已并不会进行双向验证
以下は、SSLハンドシェイクの特定のプロセスです。
(1)クライアントは、独自のSSLバージョン番号、暗号化パラメータ、SSLセッションに関連するデータ、およびその他の必要な情報をサーバーに送信します。
(2)サーバーは、独自のSSLバージョン番号、暗号化パラメーター、SSLセッションに関連するデータ、およびその他の必要な情報をクライアントに送信すると同時に、サーバーの証明書をクライアントに送信します。サーバーがクライアントのIDを確認する必要がある場合、サーバーはクライアントにセキュリティ証明書を提供するように要求します。
(3)クライアントはサーバー証明書を検証します。検証に失敗すると、SSL接続を確立できないというプロンプトが表示されます。成功した場合は、次の手順に進みます。
(4)クライアントは、このSSLセッションのプリマスターシークレットを生成し、サーバーの公開鍵で暗号化して、サーバーに送信します。
(5)サーバーがクライアントのIDの検証を必要とする場合、クライアントは他のデータに署名し、それをクライアント証明書と一緒にサーバーに送信する必要があります。
(6)サーバーがクライアントのIDの検証を必要とする場合、サーバーは、クライアントの証明書に署名したCA(認証局)が信頼できるかどうかをチェックします。信頼リストにない場合は、このセッションを終了します。チェックに合格すると、サーバーは秘密鍵を使用して受信したプリマスターシークレットを復号化し、それを使用していくつかのアルゴリズムを通じてこのセッションのマスターシークレットを生成します。
(7)クライアントとサーバーの両方がこのマスターシークレットを使用して、このセッションのセッションキー(対称キー)を生成します。2者間のSSLハンドシェイクの終了後、送信されるメッセージはすべてこのセッションキーを使用します。これの主な理由は、対称暗号化の計算の複雑さが非対称暗号化の計算の複雑さよりも1桁以上低く、両者の会話の計算速度を大幅に向上させることができるためです。
(8)クライアントは、後で送信されるすべてのメッセージがこのセッションキーで暗号化されていることをサーバーに通知し、クライアントがこのSSLハンドシェイクを完了したことをサーバーに通知します。
(9)サーバーは、後で送信されるすべてのメッセージがこのセッションキーで暗号化されていることをクライアントに通知し、サーバーがこのSSLハンドシェイクを完了したことをクライアントに通知します。
(10)ハンドシェイクプロセスが終了し、SSLセッションが確立されました。次のセッションでは、両方の当事者が同じセッションキーを使用して、送信情報と受信情報をそれぞれ暗号化および復号化します。