56 return !
error.empty();
80 const bool lookup_product_code_arg,
81 const int debug_level_arg)
82 :
cs(std::move(cs_arg)),
91 const std::string &role_for_credentials_arg,
92 const std::string &certs_dir_arg)
93 :
cs(std::move(cs_arg)),
107 http_config->frame =
frame;
108 http_config->connect_timeout = 15;
109 http_config->general_timeout = 30;
113 ts->host.host =
"169.254.169.254";
114 ts->host.port =
"80";
115 ts->http_config = http_config;
126 throw awspc_query_error(
"request pending");
141 t->req.method =
"PUT";
142 t->req.uri =
"/latest/api/token";
143 t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token-ttl-seconds: 60");
144 ts->transactions.push_back(std::move(t));
150 self->token_query_complete(ts);
156 catch (
const std::exception &e)
185 done(
"could not fetch AWS identity document: " + ident_trans.
format_status(lts));
192 done(
"could not fetch AWS identity document signature: " + sig_trans.
format_status(lts));
198 const std::string sig =
"-----BEGIN PKCS7-----\n"
200 +
"\n-----END PKCS7-----\n";
212 std::list<OpenSSLPKI::X509> certs;
214 certs.emplace_back(
awscert(),
"AWS Cert");
225 const std::string title =
"identity-document";
226 const Json::Value root =
json::parse(ident, title);
263 catch (
const std::exception &e)
287 t->req.method =
"GET";
288 t->req.uri =
"/latest/dynamic/instance-identity/document";
289 t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
290 ts->transactions.push_back(std::move(t));
296 t->req.method =
"GET";
297 t->req.uri =
"/latest/dynamic/instance-identity/pkcs7";
298 t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
299 ts->transactions.push_back(std::move(t));
306 t->req.method =
"GET";
307 t->req.uri =
"/latest/meta-data/product-codes";
308 t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
309 ts->transactions.push_back(std::move(t));
316 t->req.method =
"GET";
318 t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
319 ts->transactions.push_back(std::move(t));
325 self->local_query_complete(ts);
331 catch (
const std::exception &e)
348 SSLLib::SSLAPI::Config::Ptr ssl(
new SSLLib::SSLAPI::Config);
351 ssl->set_local_cert_enabled(
false);
354 ssl->set_flags(ssl_flags);
355 ssl->set_frame(
frame);
361 hc->ssl_factory = ssl->new_factory();
362 hc->user_agent =
"PG";
363 hc->connect_timeout = 30;
364 hc->general_timeout = 60;
368 "awspc1.openvpn.net",
369 "awspc2.openvpn.net"));
373 ts->host.host = hr->next_host();
374 ts->host.port =
"443";
375 ts->http_config = hc;
376 ts->error_recovery = hr;
378 ts->retry_duration = Time::Duration::seconds(5);
384 t->req.uri =
"/prod/AwsPC";
385 t->req.method =
"POST";
386 t->ci.type =
"application/json";
387 t->randomize_resolver_results =
true;
389 Json::Value root(Json::objectValue);
392 root[
"host"] = Json::Value(openvpn_io::ip::host_name());
394 root[
"productCode"] = Json::Value(pc);
395 root[
"nonce"] = Json::Value(
nonce());
396 const std::string jreq = root.toStyledString();
400 ts->transactions.push_back(std::move(t));
410 self->awspc_query_complete(ts);
421 const std::string title =
"awspc-reply";
434 done(
"expected application/json reply from awspc server");
443 << root.toStyledString());
450 done(et +
" : " + em);
457 done(
"awspc request/reply consistency");
475 catch (
const std::exception &e)
482 const std::string &key)
const
497 const std::string title =
"to-string-sig";
502 +
'/' + std::to_string(
json::get_int(reply,
"concurrentConnections", title));
507 unsigned char data[16];
516 "-----BEGIN CERTIFICATE-----\n"
517 "MIIC7TCCAq0CCQCWukjZ5V4aZzAJBgcqhkjOOAQDMFwxCzAJBgNVBAYTAlVTMRkw\n"
518 "FwYDVQQIExBXYXNoaW5ndG9uIFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYD\n"
519 "VQQKExdBbWF6b24gV2ViIFNlcnZpY2VzIExMQzAeFw0xMjAxMDUxMjU2MTJaFw0z\n"
520 "ODAxMDUxMjU2MTJaMFwxCzAJBgNVBAYTAlVTMRkwFwYDVQQIExBXYXNoaW5ndG9u\n"
521 "IFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYDVQQKExdBbWF6b24gV2ViIFNl\n"
522 "cnZpY2VzIExMQzCCAbcwggEsBgcqhkjOOAQBMIIBHwKBgQCjkvcS2bb1VQ4yt/5e\n"
523 "ih5OO6kK/n1Lzllr7D8ZwtQP8fOEpp5E2ng+D6Ud1Z1gYipr58Kj3nssSNpI6bX3\n"
524 "VyIQzK7wLclnd/YozqNNmgIyZecN7EglK9ITHJLP+x8FtUpt3QbyYXJdmVMegN6P\n"
525 "hviYt5JH/nYl4hh3Pa1HJdskgQIVALVJ3ER11+Ko4tP6nwvHwh6+ERYRAoGBAI1j\n"
526 "k+tkqMVHuAFcvAGKocTgsjJem6/5qomzJuKDmbJNu9Qxw3rAotXau8Qe+MBcJl/U\n"
527 "hhy1KHVpCGl9fueQ2s6IL0CaO/buycU1CiYQk40KNHCcHfNiZbdlx1E9rpUp7bnF\n"
528 "lRa2v1ntMX3caRVDdbtPEWmdxSCYsYFDk4mZrOLBA4GEAAKBgEbmeve5f8LIE/Gf\n"
529 "MNmP9CM5eovQOGx5ho8WqD+aTebs+k2tn92BBPqeZqpWRa5P/+jrdKml1qx4llHW\n"
530 "MXrs3IgIb6+hUIB+S8dz8/mmO0bpr76RoZVCXYab2CZedFut7qc3WUH9+EUAH5mw\n"
531 "vSeDCOUMYQR7R9LINYwouHIziqQYMAkGByqGSM44BAMDLwAwLAIUWXBlk40xTwSw\n"
532 "7HX32MxXYruse9ACFBNGmdX2ZBrVNGrN9N2f6ROk0k9K\n"
533 "-----END CERTIFICATE-----\n");
541 "-----BEGIN CERTIFICATE-----\n"
542 "MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\n"
543 "B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\n"
544 "MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\n"
545 "MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\n"
546 "b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\n"
547 "A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\n"
548 "hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\n"
549 "9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\n"
550 "+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\n"
551 "fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\n"
552 "NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\n"
553 "MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\n"
554 "BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\n"
555 "vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\n"
556 "5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\n"
557 "N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\n"
558 "LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\n"
559 "-----END CERTIFICATE-----\n");
566 "-----BEGIN CERTIFICATE-----\n"
567 "MIIDSDCCAjCgAwIBAgIQYadxADonNbu3mPeXR0yYVTANBgkqhkiG9w0BAQsFADAW\n"
568 "MRQwEgYDVQQDEwtBV1MgUEMgUm9vdDAeFw0xNjAzMDExOTU2NTZaFw0yNjAyMjcx\n"
569 "OTU2NTZaMBAxDjAMBgNVBAMTBWF3c3BjMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n"
570 "MIIBCgKCAQEA0ggZoYroOMwDHKCngVOdUKiF6y65LDWmbAwZVqwVI7WYpvOELV34\n"
571 "04ZYtSqPq6IoGFuH6zl0P5rCi674T0oBPSUTmlLwLks+1zrGznboApkr67Mf2dCd\n"
572 "snlyaNPuwrjWHJBa6Pi9dv/YMoJgDxOxk9mslAlcl5xOFgXbfSj1pAA0KVzwwbzz\n"
573 "dnznJL67wCnuiAeqBxbkyarfOL414tepsI24kHoAddAVDdhWQ2WkhrT/vK2IRdGZ\n"
574 "kU5hAAz/qPKkJxebw5uc+cL2TBii2r0Hvg7tEXI9eIEWeoghftsE5YEuaQHP4EVL\n"
575 "JU+21OQzz0lT9L2rrvffTR7cF89Nbn2KMQIDAQABo4GXMIGUMAkGA1UdEwQCMAAw\n"
576 "HQYDVR0OBBYEFAMy6uiElCGZVP/wwJeqvXL7QHTSMEYGA1UdIwQ/MD2AFLDKS6Dk\n"
577 "NtTpQoOPxJi+DRS+GD2CoRqkGDAWMRQwEgYDVQQDEwtBV1MgUEMgUm9vdIIJAOu5\n"
578 "NqrIe040MBMGA1UdJQQMMAoGCCsGAQUFBwMCMAsGA1UdDwQEAwIHgDANBgkqhkiG\n"
579 "9w0BAQsFAAOCAQEAsFhhC9wwybTS2yTYiStATbxHWqnHJRrbMBpqX8FJweS1MM/j\n"
580 "pwr1suTllwTHpqXpqgN6SDzdeG2ZKx8pvJr/dlmD9e+cHguIMTo6TcqPv1MPl3MZ\n"
581 "ugOmDPlgmFYwAWBwzujiGR9bgdGfzw+94KK06iO8MrFLtkz9EbeoJol68mi98CEz\n"
582 "kmOb2BM6tVzkvB9fIYyNkW66ZJs2gXwb6RZTyE9HMMGR67nWKYo9SxpB6f+6hlyU\n"
583 "q7ptxP2Rwmz0u1pRaZdfHmJFOJnPniB7UmMx/t3ftqYWYDXuobr3LVvg7+33WUk0\n"
584 "HfSdbAEkzzC82UTHj0xVH/uZZt8ORChRxuIWZQ==\n"
585 "-----END CERTIFICATE-----\n");
PCQuery(WS::ClientSet::Ptr cs_arg, const std::string &role_for_credentials_arg, const std::string &certs_dir_arg)
OPENVPN_EXCEPTION(awspc_query_error)
void token_query_complete(WS::ClientSet::TransactionSet <s)
const bool lookup_product_code
static std::string awspc_signing_cert()
static std::string awscert()
void done(std::string error)
bool awspc_req_verify_consistency(const Json::Value &reply, const std::string &key) const
PCQuery(WS::ClientSet::Ptr cs_arg, const bool lookup_product_code_arg, const int debug_level_arg)
void queue_pc_validation(const std::string &pc)
void local_query_complete(WS::ClientSet::TransactionSet <s)
std::string nonce() const
std::function< void(Info info)> completion
void awspc_query_complete(WS::ClientSet::TransactionSet &ats)
static std::string to_string_sig(const Json::Value &reply)
bool awspc_req_verify_consistency(const Json::Value &reply) const
void start(std::function< void(Info info)> completion_arg)
std::string role_for_credentials
static std::string awspc_web_cert()
WS::ClientSet::TransactionSet::Ptr prepare_transaction_set()
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
void rand_fill(T &obj)
Fill a data object with random bytes.
#define OPENVPN_LOG(args)
void verify(const OpenSSLPKI::X509 &cert, const std::string &sig, const std::string &data, const std::string &digest)
void verify_pkcs7(const std::list< OpenSSLPKI::X509 > &certs, const std::string &sig, const std::string &data)
int get_int(const Json::Value &root, const NAME &name, const TITLE &title)
bool exists(const Json::Value &root, const NAME &name)
std::string get_string_optional(const Json::Value &root, const NAME &name, const std::string &default_value, const TITLE &title)
Json::Value parse(const std::string &str, const TITLE &title)
std::string get_string(const Json::Value &root, const NAME &name, const TITLE &title)
Frame::Ptr frame_init_simple(const size_t payload)
std::string read_text(const std::string &filename, const std::uint64_t max_size=0)
bool enum_dir(const std::string &dirname, F func)
std::string render_hex(const unsigned char *data, size_t size, const bool caps=false)
BufferPtr buf_from_string(const std::string &str)
std::string to_string() const
int concurrentConnections
bool instance_data_defined() const
std::string to_string() const
bool request_status_success() const
std::string format_status(const TransactionSet &ts) const