Skip to content

Commit 44db885

Browse files
committed
example server listens on https ports too
1 parent d5b9e70 commit 44db885

File tree

4 files changed

+333
-28
lines changed

4 files changed

+333
-28
lines changed

example/server/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,11 @@ endif()
3333
if (TARGET Boost::http_brotli)
3434
target_link_libraries(beast2_server_example Boost::http_brotli)
3535
endif()
36+
37+
if (TARGET Boost::corosio_openssl)
38+
target_link_libraries(beast2_server_example Boost::corosio_openssl)
39+
endif()
40+
41+
if (TARGET Boost::corosio_wolfssl)
42+
target_link_libraries(beast2_server_example Boost::corosio_wolfssl)
43+
endif()

example/server/certificate.cpp

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
//
2+
// Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
3+
//
4+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6+
//
7+
// Official repository: https://github.com/cppalliance/beast2
8+
//
9+
10+
#include "certificate.hpp"
11+
#include <string>
12+
#include <utility>
13+
14+
namespace boost {
15+
namespace beast2 {
16+
17+
void
18+
load_server_certificate(
19+
corosio::tls_context ctx)
20+
{
21+
/*
22+
Using Windows with OpenSSL version "1.1.1s 1 Nov 2022"
23+
24+
1. Generate a Root CA
25+
26+
openssl genrsa -out rootCA.key 4096
27+
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 10000 -out rootCA.pem -subj "//CN=Boost Test Root CA"
28+
29+
2. Create a Server Key
30+
31+
openssl genrsa -out server.key 2048
32+
*/
33+
using keypair = std::pair<std::string, std::string>;
34+
35+
// certificates for SSL listening ports
36+
keypair const certs[] = {
37+
{
38+
/* Create a Signed Server Certificate with the Test Root CA
39+
40+
openssl req -new -key server.key -out server.csr -subj "//CN=localhost"
41+
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 10000 -sha256 -extfile san.cnf
42+
*/
43+
"-----BEGIN CERTIFICATE-----\n"
44+
"MIID2TCCAcGgAwIBAgIURQ6waOrVlt/YykIgwb+46o0UtCUwDQYJKoZIhvcNAQEL\n"
45+
"BQAwHTEbMBkGA1UEAwwSQm9vc3QgVGVzdCBSb290IENBMCAXDTI1MTAxMjAxMjIx\n"
46+
"N1oYDzIwNTMwMjI3MDEyMjE3WjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0G\n"
47+
"CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkHGuSplDQrW5f0JJwUK9UivHZMkE5\n"
48+
"CDEThsUwjrqubofLpR49EzfAcBRWWQ1R0QmzK2sKnKQnku4IliFyitw/OAHsJrr4\n"
49+
"c3OHXfpOOwtd4Kg3BP3P3oeAsO+IELrQIsJp/mrjOJKtBVTZ8kl5ZYrf94fEMivn\n"
50+
"JnZ+neb2kPiSPTnAtFSBVSQc9aHU7Wg1gtQkUuEIkjUBvPzxGKi0m3nuZfUDJpev\n"
51+
"2OB7fRftIPjiqZ/1n1k2CYLqLMBIXAeeYAjBgzM0x4UG3SW7jlPeoDI34XQ7dYxQ\n"
52+
"K5jjs3OhoLs5x0za1sZ7MXkDRAqO5Cgeg3kNb5VlhjVzR8Njtapx4mXtAgMBAAGj\n"
53+
"GDAWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAgEAjEHn\n"
54+
"AIfxiYXWBsVPtYsRbHzWYoNSIWGkzwauMaDPDGzeMV1ajKV1dBp8NHKBg/jlKdaQ\n"
55+
"vGiKHLlPwSGRlDIyyglG1qsH7unQHV0w+cCh19Uoc0gtv9q4zTUuyDhk8eufIdEr\n"
56+
"1SPNMIqJQ47A2KrYo31rd+HxnyoCit1fM8SUWwM0tLaoEM3iTF33LI5CBkT2VPbv\n"
57+
"qJL/68qQFDeTIUGQJjPK9rs/cElqsweVfWF+O2Mn9wA9aJyc5+0jsOGrfADO/cI1\n"
58+
"OA1HXgawSQjXKST74aprd0gBxACXrG+wA1G6NNsawp80xjADSTyCfNxtQVvY1W2n\n"
59+
"9kJuionCnDUnhqEOnhnZdq1XikoOYMRJP0BxFHX8SNbxmJouJRWvusmh91lAgbQv\n"
60+
"JVXlHcEQGYMIYIr5y6dLlZ55SamC9aK3vO+q8s9AEYZO4OTUi2WQ2bfrxcn3vI/0\n"
61+
"UzLh8LzE1A2OT5Gin0jWKbeKpqXH2RAfgaEAf1bzDA92xMEjVGBrBoXagvUOGzMG\n"
62+
"cDcj4WHzcO6BWENPkRZ2JNNIxIZRK/wr9Mw/q/Yu9iDNVw4XOEx+iGjh1cRHy1FH\n"
63+
"VuS/N5CQCBnmhDKYrZ3Lz+D/l0CGc30A1jjfvlrDiE4k9NyrV8wVHqmO73vivAvW\n"
64+
"hYG9wLo13LnWG9JrtT8Drl/H0YbuL4C46n/mua8=\n"
65+
"-----END CERTIFICATE-----\n",
66+
67+
"-----BEGIN RSA PRIVATE KEY-----\n"
68+
"MIIEpgIBAAKCAQEA5BxrkqZQ0K1uX9CScFCvVIrx2TJBOQgxE4bFMI66rm6Hy6Ue\n"
69+
"PRM3wHAUVlkNUdEJsytrCpykJ5LuCJYhcorcPzgB7Ca6+HNzh136TjsLXeCoNwT9\n"
70+
"z96HgLDviBC60CLCaf5q4ziSrQVU2fJJeWWK3/eHxDIr5yZ2fp3m9pD4kj05wLRU\n"
71+
"gVUkHPWh1O1oNYLUJFLhCJI1Abz88RiotJt57mX1AyaXr9jge30X7SD44qmf9Z9Z\n"
72+
"NgmC6izASFwHnmAIwYMzNMeFBt0lu45T3qAyN+F0O3WMUCuY47NzoaC7OcdM2tbG\n"
73+
"ezF5A0QKjuQoHoN5DW+VZYY1c0fDY7WqceJl7QIDAQABAoIBAQCfXyvZPdHgugsP\n"
74+
"bk2hov2cd6cZNH9VNV/0YIiMsGvFSvwdT7OcwDyHesb6vSUNMJsyTvduZppZ+9HK\n"
75+
"tfmQaWwPzzWopDalNyRUQ1iKJ759TGS6bAZYoQTS6MuxqN6cZGyoWVScg/4WXE84\n"
76+
"JosnAcbRS8PTU6pQyRKoy/F9+zNwF30B0GwQpNwEZMX7QvPQPoUIcurE8HmP7NhB\n"
77+
"fuZn/af6q9N+D56fOaD7Rg4kdtBMa0cv4mKojaq3ymx5RK8ccPTDiXC0idg7uRVC\n"
78+
"13sFf9H46Z7kIimyhPUrwTapMyrx1kjQNZa97YYBAHGfLwRoYsGu5XMWIXKDkZHz\n"
79+
"Bt2U92iBAoGBAPJRdRqoHdZIe42rq1kEpIis4Eitn4idjuW6D8kgzPU8IT7UreT/\n"
80+
"eS5c7ThnbwI3B966pHWzAPMiktc3sXQUIXlBy1vu1A6paqU+HpA9pbwB3tHfLsgm\n"
81+
"akabqfv/nWpzKJt5kLlbNOkkCvJ8FvotyeCCrdCeip+q6d8NZc7s9YQZAoGBAPD9\n"
82+
"m5nUHKR7tcE8SNc9pcBp1AoILuhp9XbUgP2YkePO8KfnHPUSU5LIT0c1sasm1k/w\n"
83+
"ehpaqirjSAjYkjKQTfwj4SVP9LAlCb5kz0rhZJqdiQUtSK3oPIDzcXfutgZjRbyX\n"
84+
"vR9r3a2DLoYJ/IxuajyvICImKSMHEySnCoxaEgr1AoGBALI2VGC5edAp2Kx1r/w1\n"
85+
"HOjj88Of5a+s6PZtY8SxGevWQEEcW5QKi84cS97qu0quvFwDeoaRksY+DC66aAkN\n"
86+
"8Rxj1jMTr+Pkl2lWCVZd8HEYEw7ZDGfpUMoDG/4YnWY3sYq+2kBoIr7AYki6GJAA\n"
87+
"cvNqSHkg0KTjJ0ODb/fCcEKpAoGBALUX3rXaDywLSqnLA3G7gbL108E2JQnBlhOV\n"
88+
"3Ni0rezitTV3FuuSufqzS9/XGYvjw2iO7TKgrv9Li/YZyML2baPr0mSXkOhM7OWG\n"
89+
"G7/JYDBP8YdSYCtPOSgtyDa3y1FBiEYQQK48AHlC+tL+7ikZT/wKHbuLsZ4A0wHY\n"
90+
"BLUzehuBAoGBAMC9mGnaYU4D9PjCqC96MyEnZjdpf5eGByx5GhV6O6kEx0wJbjPc\n"
91+
"kq+QAn1cp1tVjPcNfOK62LxV5E5t4eCv/Su5dmQHWGVDZBrdug5osyLFaFZA8Lw/\n"
92+
"GKCs22hqgjPqSrGnCXMV6bZkwvy3cmxNkWuEiiA67PYyc6aFpTcOj8fi\n"
93+
"-----END RSA PRIVATE KEY-----\n"
94+
}
95+
};
96+
97+
/* More secure Diffie-Helman parameters
98+
99+
openssl dhparam -out dh.pem 2048
100+
*/
101+
std::string const dh =
102+
"-----BEGIN DH PARAMETERS-----\n"
103+
"MIIBCAKCAQEAu7R9qRNtiuayUH9FLFIIQJ9GmhKpdL/gcLG8+5/6x+RN+cgPwQgQ\n"
104+
"FYqTtIHRgINxtxdZqUxnrcg6jbW13r7b8A7uWURsrW5T3Hy68v4SFY5F+c/a97m+\n"
105+
"LyUHW12iwCqZPlwdl4Zvb/uAtrn3xjvl3Buea4nGPAlTlHVKR1OH8IuWPnxUvjXp\n"
106+
"slcI5c20LQ3Z2znM3csLNGkgiGKIPLCb9Sq8Zx1+gCDQk9DjDC4K8ELDqvbwDz8m\n"
107+
"760pgC5eQ0z1lgmxvRVgPZOx9twwO1/VhpISpGnb7vihEb+06jQtXZIC3LrANfhe\n"
108+
"bnbac08nYv9yt7Caf2Zfy1UDvkeLtPYs2wIBAg==\n"
109+
"-----END DH PARAMETERS-----\n";
110+
111+
ctx.set_password_callback(
112+
[]( std::size_t,
113+
corosio::tls_password_purpose)
114+
{
115+
return "test";
116+
});
117+
118+
/*
119+
ctx.set_options(
120+
asio::ssl::context::default_workarounds |
121+
asio::ssl::context::no_sslv2 |
122+
asio::ssl::context::single_dh_use);
123+
*/
124+
125+
for(auto const& t : certs)
126+
{
127+
ctx.use_certificate_chain(t.first);
128+
129+
// use_private_key applies to the last inserted certificate,
130+
// see: https://linux.die.net/man/3/ssl_ctx_use_privatekey
131+
//
132+
ctx.use_private_key(t.second,
133+
corosio::tls_file_format::pem);
134+
}
135+
136+
//ctx.use_tmp_dh(asio::buffer(dh));
137+
}
138+
139+
} // beast2
140+
} // boost

example/server/certificate.hpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
3+
//
4+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6+
//
7+
// Official repository: https://github.com/cppalliance/beast2
8+
//
9+
10+
#ifndef BOOST_BEAST2_EXAMPLE_SERVER_CERTIFICATE_HPP
11+
#define BOOST_BEAST2_EXAMPLE_SERVER_CERTIFICATE_HPP
12+
13+
#include <boost/corosio/tls_context.hpp>
14+
#include <cstddef>
15+
#include <memory>
16+
17+
namespace boost {
18+
namespace beast2 {
19+
20+
/* Load a signed certificate into the TLS context, and configure
21+
the context for use with a server.
22+
23+
For this to work with the browser or operating system, it is
24+
necessary to import the certificate in the file "beast-test-CA.crt",
25+
which accompanies the library, into the local certificate store,
26+
browser, or operating system depending on your environment.
27+
*/
28+
void
29+
load_server_certificate(
30+
corosio::tls_context ctx);
31+
32+
} // beast2
33+
} // boost
34+
35+
#endif

0 commit comments

Comments
 (0)