2017-05-16 7 views
0

Ich benutze die Asio C++ Bibliothek. Wenn ich einen SSL-Server-Socket erstelle, habe ich basierend auf dem Beispiel den folgenden Arbeitscode, um die Serverzertifikate anzugeben.Einzelnes Zertifikat für den asio ssl Kontext

http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/ssl/server.cpp

context_.set_options(
    boost::asio::ssl::context::default_workarounds 
    | boost::asio::ssl::context::no_sslv2 
    | boost::asio::ssl::context::single_dh_use); 
    context_.set_password_callback(boost::bind(&server::get_password, this)); 
    context_.use_certificate_chain_file("server.pem"); 
    context_.use_private_key_file("server.pem", boost::asio::ssl::context::pem); 
    context_.use_tmp_dh_file("dh512.pem"); 

Ist es möglich, hier die API irgendwie mit einem einzigen Zertifikat zu verwenden, da, wie oben zu Laden 3 Dateien dagegen?

Antwort

1

Es stellt sich heraus, brauchen Sie nur den privaten Schlüssel in der gleichen Datei wie das Zertifikat zu setzen und die gleiche Datei sowohl

context_.use_certificate_chain_file("server.pem"); 
context_.use_private_key_file("server.pem", boost::asio::ssl::context::pem); 

Die dritte Datei ist nicht notwendig, in meinem Fall passieren.

context_.use_tmp_dh_file("dh512.pem"); 
2

Nein, weil ein SSL-Socket ein Zertifikat und einen privaten Schlüssel haben muss. Sie können nicht einfach ein Zertifikat haben, weil Sie eine Antwort vom Client mit dem privaten Schlüssel entschlüsseln müssen.

Möglicherweise gibt es Möglichkeiten, die DH-Nutzung auf Ihrem Server wegzulassen. Und ein anderer ist, dass Sie den privaten Schlüssel und das Zertifikat in der gleichen Datei haben können, wenn es eine Frage ist, wie viele Dateiöffnungsabfragen an das OS zu tun sind. Ich kann jedoch nicht die Situation darstellen, wo es für den Server wichtig sein kann.

Als Antwort auf den Kommentar, wie Sie eine Datei für den privaten Schlüssel und das Zertifikat verwenden. Es gibt keinen direkten Weg dazu, denn Boost Asio ist keine Krypto-Bibliothek, sondern ein Netzwerk-Framework. Um das zu tun, müssen Sie etwas wie OpenSSL oder ähnliche Bibliotheken und so etwas wie PKCS#12 archive format verwenden, wo Sie mehrere Objekte in einer Datei haben. Verwenden Sie den ehemaligen zu parse the latter. Weiterleiten von Rohdaten aus diesen Objekten an use_private_key und use_certificate_chain über const_buffer, wobei das Format wahrscheinlich auf ASN.1 gesetzt ist. Und voila! Zillionen mal weniger wartbar, schwerer verständlich, unnötig, aber funktioniert. Ein weiterer trivialerweise hacky Ansatz ist, beide Daten in PEM-Bundles (eine Datei mit dem privaten Schlüssel und das Zertifikat PEM-codiert), als manuell PEM-Rüstung (-----BEGIN..., -----END), extrahieren Sie die Objektdaten und übergeben Sie diese an use_private_key, use_certificate_chain entsprechend PEM als Format angeben.

+0

Hallo, ich konnte nicht sehen, wie man die API verwendet, wenn wir den privaten Schlüssel und das Zertifikat in der gleichen Datei haben – tech74