|
| 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 |
0 commit comments