2017-05-16 5 views
0

asio C++ 라이브러리를 사용하고 있습니다. SSL 서버 소켓을 만들 때 서버 인증서를 지정하기 위해 샘플을 기반으로 아래 작업 코드가 있습니다.asio ssl 컨텍스트와 함께 사용하기위한 단일 인증서

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"); 

는 위와 같이로드 3 개 파일을 대조적으로, 여기에 하나의 인증서로 어떻게 든 API를 사용할 수 있습니까?

답변

1

그것은 당신이 단지 모두

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"); 
2

아니요, SSL 소켓에 인증서와 개인 키가 있어야하기 때문입니다. 개인 키를 사용하여 클라이언트의 응답을 해독해야하기 때문에 인증서 만 가질 수는 없습니다.

서버에서 DH 사용을 생략 할 수 있습니다. 또 하나는 OS에 대한 파일 열기 쿼리 수에 대한 질문 인 경우 개인 키와 인증서를 같은 파일에 둘 수 있다는 것입니다. 그러나 서버 문제가 될 수있는 상황을 이미지 할 수는 없습니다.

개인 키와 인증서에 대해 하나의 파일을 사용하는 방법에 관한 의견에 대한 답변으로. Boost Asio는 암호화 라이브러리가 아니기 때문에 네트워크 프레임 워크가 아니기 때문에 직접 할 수있는 방법은 없습니다. 이를 수행하려면 OpenSSL 또는 유사한 라이브러리와 PKCS#12 archive format과 같은 것을 사용해야합니다. 여기에는 하나의 파일에 여러 객체가 있습니다. 전자는 parse the latter까지 사용하십시오. 해당 오브젝트에서 원시 데이터를 use_private_keyuse_certificate_chain에서 const_buffer으로 전달하고 형식을 ASN.1으로 설정하십시오. 그리고 짜잔! 수십 배 덜 유지 보수 가능하고, 더 이해하기 쉽고, 불필요하지만 작동합니다. 또 다른 해킹 방법은 수동으로 PEM 방어구 (-----BEGIN..., -----END)를 찾아서이 데이터를 추출하여 use_private_key, use_certificate_chain으로 전달하는 것보다 PEM 번들 (개인 키와 인증서 PEM으로 인코딩 된 파일 한 개)에 두 데이터를 넣는 것입니다. 이에 따라 PEM을 형식으로 지정합니다.

+0

안녕하세요, 개인 키와 인증서가 동일한 파일에있는 경우 API를 사용하는 방법을 볼 수 없습니다. – tech74