Using Boost-Beast (Asio) http client with SSL (HTTPS)
我是SSL和Boost-Beast库以及C ++的新手,但这是另一回事。
我对在Beast中使用HTTPS(SSL)有疑问。我将使用该库连接到REST服务,并将JSON发布到不控制证书,API等的服务器。
这是可行的。
问题是我不清楚它是如何工作的。在Beast随附的示例中,它被引用到文件
当我尝试该示例时,将其与JSON字符串POST到服务器一起使用,我们将其称为" exampleserver.com"。连接到端口80和443。即使我注释掉了它调用根证书功能
因此,我的问题是:
1)Beast库是从
我希望代码中没有任何硬编码的证书以进行检查。证书说
2)它是否仅在端口443上使用普通HTTP(无SSL)?不知道这是否可能...
Even though I commented out the line where it calls the root certificate funtion,"load_root_certificates(ctx);"
在这种情况下,openssl使用系统范围的默认证书存储区(例如,在linux / etc / ssl / certs上),因此将信任"常规"权限(就像您的浏览器一样)。
1) Did the Beast library get the certificate from"exampleserver.com" or did I already have it installed and thats why it worked?
是。
If so what happens when it expires?
它将无法验证。如果需要,请对其进行测试:https://expired.badssl.com/
该站点具有许多出色的SSL测试(https://badssl.com)
The certificate says"DigiCert Global Root CA -> DigiCert SHA2 Secure Server CA" is that a standard certificate maybe that comes with the browser?
浏览器的受信任证书无关(您未使用浏览器)。但是,您可以查看openssl的内容(请参见上文),也可以使用类似
1 | openssl s_client -connect exampleserver.com:443 -verify -showcerts |
哪个打印类似于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | verify depth is 0 CONNECTED(00000003) depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root verify return:1 depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority verify return:1 depth=1 C = US, ST = TX, L = Houston, O ="cPanel, Inc.", CN ="cPanel, Inc. Certification Authority" verify return:1 depth=0 CN = tradingfleet.com verify return:1 --- Certificate chain 0 s:/CN=tradingfleet.com i:/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority 1 s:/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root --- Server certificate -----BEGIN CERTIFICATE----- MIIFUjCCBDqgAwIBAgIQPI9I0oyjgNMrudesOYyqgDANBgkqhkiG9w0BAQsFADBy MQswCQYDVQQGEwJVUzELMAkGA1UECBMCVFgxEDAOBgNVBAcTB0hvdXN0b24xFTAT BgNVBAoTDGNQYW5lbCwgSW5jLjEtMCsGA1UEAxMkY1BhbmVsLCBJbmMuIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MDIxODAwMDAwMFoXDTE4MDUxOTIzNTk1 OVowGzEZMBcGA1UEAxMQdHJhZGluZ2ZsZWV0LmNvbTCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBANe5zu81biDwwIloBMFHWc2OvoiGTNBr2aya8auWrzRm rmbOfugZOaIAms79jnINCQ7jy0Qk2xwblgCifCg7y/UfSXvv7IWUWcEDywsAoyz/ sUc9myvQbot+kD1DaxVoyN85LnDehaYF5+myDznJISQe1ei01n/aIF8gwOz4k3Gn R07Zh0sDRBjIiRsAL6ZljrPRk47cul2+8pD0qNJHHN0QX6hz/KPOugTiivI1+ymo onSeeN29oh5oTtCHP2yj9+RNsCNcPAnbDawy0RAgFi2W5GyHiIo/NkUxBXN8tQxH 2xrPnY+MQJHUcKXJd//DTX6tWoQqo4xisN6Q9iZ3+R8CAwEAAaOCAjkwggI1MB8G A1UdIwQYMBaAFH4DWmVBa6d+CuG4nQjqHY4dasdlMB0GA1UdDgQWBBQKTFmhmBNx pS9uBbXjqE1ZjCOiFjAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNV HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwTwYDVR0gBEgwRjA6BgsrBgEEAbIx AQICNDArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQ UzAIBgZngQwBAgEwTAYDVR0fBEUwQzBBoD+gPYY7aHR0cDovL2NybC5jb21vZG9j YS5jb20vY1BhbmVsSW5jQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwfQYIKwYB BQUHAQEEcTBvMEcGCCsGAQUFBzAChjtodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9j UGFuZWxJbmNDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNydDAkBggrBgEFBQcwAYYY aHR0cDovL29jc3AuY29tb2RvY2EuY29tMIGXBgNVHREEgY8wgYyCEHRyYWRpbmdm bGVldC5jb22CF2NwYW5lbC50cmFkaW5nZmxlZXQuY29tghVtYWlsLnRyYWRpbmdm bGVldC5jb22CGHdlYmRpc2sudHJhZGluZ2ZsZWV0LmNvbYIYd2VibWFpbC50cmFk aW5nZmxlZXQuY29tghR3d3cudHJhZGluZ2ZsZWV0LmNvbTANBgkqhkiG9w0BAQsF AAOCAQEAPFIZv1oHXm79+uoLnP9Sya2qEghOn/uPpNtappgUSrh2Pb0MueX84C0P 4HRS4yHRO1TD9ZOfCuPsguzXhl+RUB7Asl2iAhwthoZGMLhv6uaUnAUHZbpdkJY3 r/quuWHXDGNoe2quAOxGLPDO7WMvrDh1hFi7x7AGshkRSZ4DREBnCS7iprKzKL6H BaNqtAlWgoXcSSg1RpnbU2o4bWIv8mZG0ATr7Cc8VSf04SjBLZnLTNeqo6Z+ALQ3 yrFsAytim6857FB231V5NEvLh+iZjSOuBG9xv+4Nw46bVz9z8QxB3czAodrDGXbB lgH1s5f486lRq45dRn/hGY+DZjJXgg== -----END CERTIFICATE----- subject=/CN=tradingfleet.com issuer=/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority --- No client certificate CA names sent Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 4988 bytes and written 431 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 Session-ID: 24CB439538212A23E0391887F856E369858AB6864B25DA5F1FD618550C41EB92 Session-ID-ctx: Master-Key: 1B8A3028923478527196B429D10F3584C5FA5DE4175C834CBBEF9EB19013FBFE58E7668CED9C0877E15F4F214A61F80C Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - ca 83 5a 76 c2 51 7b c7-68 15 12 a7 cb c9 f5 35 ..Zv.Q{.h......5 0010 - 0a dc c1 2a 90 fd 61 69-0a d9 89 09 f0 c4 b3 40 ...*..ai.......@ 0020 - 79 dc 97 8a c5 0d a1 67-85 5e b4 25 47 94 ed 23 y......g.^.%G..# 0030 - 42 df b2 99 25 ec b1 fa-d7 3e 3e 24 37 ef 67 ef B...%....>>$7.g. 0040 - 56 f4 d2 57 cd 47 48 bd-d7 86 b1 2f b5 76 d6 db V..W.GH..../.v.. 0050 - 12 9d 7a d3 94 b0 58 bf-c5 c4 3e 7d 05 98 75 1d ..z...X...>}..u. 0060 - 31 bc 9b 23 4f a7 ce 37-af 77 8a 96 89 20 20 64 1..#O..7.w... d 0070 - 3d bf de 25 b2 09 02 20-49 09 b5 57 a1 c3 75 ed =..%... I..W..u. 0080 - 97 ec 51 d2 46 f7 c6 b7-4a d8 b2 db 95 eb ac d6 ..Q.F...J....... 0090 - be 76 14 80 ca 08 dc b7-b6 cb e9 c9 cc 8b 45 bd .v............E. 00a0 - d7 1d a7 88 9b a4 91 33-aa 23 fe 23 65 b8 e1 d9 .......3.#.#e... 00b0 - 98 f6 55 1e 25 32 97 b5-22 ac d0 58 01 a6 42 60 ..U.%2.."..X..B` Start Time: 1522150150 Timeout : 300 (sec) Verify return code: 0 (ok) --- ^C |
2) Did it just use plain http over port 443 (no SSL)? Don know if this is possible at all...
不,不是。
仅在服务器配置错误的情况下才有可能,但是通常如果您的服务器通过浏览器连接https,则不可能简单地连接:
- https://askubuntu.com/questions/860511/is-it-possible-to-set-same-port-work-with-http-and-https
- 在怪异的配置上:Nodejs HTTP和HTTPS通过同一端口
可能您已经知道了。
我尝试了相同的野兽示例(Boost库1.70),并且必须对会话的ctor进行以下更改(我这样做是有可能在代码的其他位置进行更改的):
1 2 | ws_.next_layer().set_verify_mode(boost::asio::ssl::verify_peer); ws_.next_layer().set_verify_callback(std::bind(&session::verify_certificate, this, _1, _2)); |
并添加了一个方法(我从Asio客户端示例中复制了该方法):
1 2 3 4 5 6 7 8 9 | bool verify_certificate(bool pverified_ok, ssl::verify_context& ctx) { char subject_name[256]; X509 *cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256); std::cout <<"Verifying" << subject_name << std::endl; return pverified_ok; } |
此更改导致验证失败(由于我不想使用那些硬编码证书,因此我删除了它们)。回调有助于记录服务器证书已被实际验证。
就像Asio示例向ssl :: context添加CA证书一样,例如
1 2 | boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23); ctx.load_verify_file("ca.pem"); // CA certificate |
使验证通过。
您需要创建自签名的CA证书和由其签名的服务器证书,并将其放置在服务器代码中(同样来自Asio示例),例如
1 2 3 | context_.use_certificate_chain_file("..\\sample-server1.pem"); context_.use_private_key_file("..\\sample-server1-key.pem", boost::asio::ssl::context::pem); context_.use_tmp_dh_file("..\\dh2048.pem"); |