Https example program using TLSSocket library.
Hello-TLSSocket
TLSSocket library example program.
In this example, https connection to os.mbed.com is established by using TLSSocket. The program is tested on K64F.
Output from console
When set mbed-trace.enable true.
HelloTSLSocket, HTTPS example of TLSSocket [INFO][TLSx]: Connecting to os.mbed.com:443 [INFO][TLSx]: Connected. [INFO][TLSx]: Starting the TLS handshake... [INFO][TLSx]: TLS connection to os.mbed.com:443 established [DBG ][TLSx]: Server certificate: cert. version : 3 serial number : 03:56:D4:79:41:63:31:CA:E0:56:06:61 issuer name : C=BE, O=GlobalSign nv-sa, CN=GlobalSign Organization Validation CA - SHA256 - G2 subject name : C=GB, ST=Cambridgeshire, L=Cambridge, O=Arm Ltd, CN=*.mbed.com issued on : 2018-05-04 15:36:03 expires on : 2019-06-06 10:31:02 signed using : RSA with SHA-256 RSA key size : 2048 bits basic constraints : CA=false subject alt name : *.mbed.com, mbed.org, *.mbed.org, mbed.com key usage : Digital Signature, Key Encipherment ext key usage : TLS Web Server Authentication, TLS Web Client Authentication [INFO][TLSx]: Certificate verification passed GET / HTTP/1.1 Host: os.mbed.com Connection: close HTTP/1.1 200 OK Server: nginx/1.11.12 Date: Wed, 13 Jun 2018 08:26:02 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: close Vary: Accept-Language,Cookie,Accept-Encoding Content-Language: en-gb Set-Cookie: csrftoken=zM3AGfeZ6W4OQZsT6nCcxNBYxEEN73sf; expires=Wed, 12-Jun-2019 08:25:33 GMT; Max-Age=31449600; Path=/ Strict-Transport-Security: max-age=31536000; includeSubdomains eae <!DOCTYPE html> ... ... ... AJAX_req.onreadystatechange = handle_AJAX_Complete; AJAX_req.send(); } </script> </body> </html> 0 HelloTSLSocket DONE.
main.cpp@0:f96053986356, 2018-04-17 (annotated)
- Committer:
- coisme
- Date:
- Tue Apr 17 03:54:46 2018 +0000
- Revision:
- 0:f96053986356
- Child:
- 1:65339c530def
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
coisme | 0:f96053986356 | 1 | #include "mbed.h" |
coisme | 0:f96053986356 | 2 | #include "easy-connect.h" |
coisme | 0:f96053986356 | 3 | #include "TLSSocket.h" |
coisme | 0:f96053986356 | 4 | |
coisme | 0:f96053986356 | 5 | #if 0 |
coisme | 0:f96053986356 | 6 | const char* HOST_NAME = "os.mbed.com"; |
coisme | 0:f96053986356 | 7 | const int PORT = 443; |
coisme | 0:f96053986356 | 8 | const char* HTTPS_PATH = "/"; |
coisme | 0:f96053986356 | 9 | const char* ROOT_CA_PEM = /* Root CA of os.mbed.com */ |
coisme | 0:f96053986356 | 10 | "-----BEGIN CERTIFICATE-----\n" |
coisme | 0:f96053986356 | 11 | "MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\n" |
coisme | 0:f96053986356 | 12 | "A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\n" |
coisme | 0:f96053986356 | 13 | "b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\n" |
coisme | 0:f96053986356 | 14 | "MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\n" |
coisme | 0:f96053986356 | 15 | "YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\n" |
coisme | 0:f96053986356 | 16 | "aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\n" |
coisme | 0:f96053986356 | 17 | "jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\n" |
coisme | 0:f96053986356 | 18 | "xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\n" |
coisme | 0:f96053986356 | 19 | "1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\n" |
coisme | 0:f96053986356 | 20 | "snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\n" |
coisme | 0:f96053986356 | 21 | "U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\n" |
coisme | 0:f96053986356 | 22 | "9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\n" |
coisme | 0:f96053986356 | 23 | "BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\n" |
coisme | 0:f96053986356 | 24 | "AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\n" |
coisme | 0:f96053986356 | 25 | "yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\n" |
coisme | 0:f96053986356 | 26 | "38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\n" |
coisme | 0:f96053986356 | 27 | "AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\n" |
coisme | 0:f96053986356 | 28 | "DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\n" |
coisme | 0:f96053986356 | 29 | "HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n" |
coisme | 0:f96053986356 | 30 | "-----END CERTIFICATE-----"; |
coisme | 0:f96053986356 | 31 | #endif |
coisme | 0:f96053986356 | 32 | |
coisme | 0:f96053986356 | 33 | const char* HOST_NAME = "www.google.co.jp"; |
coisme | 0:f96053986356 | 34 | const int PORT = 443; |
coisme | 0:f96053986356 | 35 | const char* HTTPS_PATH = "/"; |
coisme | 0:f96053986356 | 36 | const char* ROOT_CA_PEM = /* Root CA of www.google.co.jp */ |
coisme | 0:f96053986356 | 37 | "-----BEGIN CERTIFICATE-----\n" |
coisme | 0:f96053986356 | 38 | "MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\n" |
coisme | 0:f96053986356 | 39 | "MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\n" |
coisme | 0:f96053986356 | 40 | "YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\n" |
coisme | 0:f96053986356 | 41 | "EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\n" |
coisme | 0:f96053986356 | 42 | "R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\n" |
coisme | 0:f96053986356 | 43 | "9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\n" |
coisme | 0:f96053986356 | 44 | "fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\n" |
coisme | 0:f96053986356 | 45 | "iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\n" |
coisme | 0:f96053986356 | 46 | "1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\n" |
coisme | 0:f96053986356 | 47 | "bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\n" |
coisme | 0:f96053986356 | 48 | "MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\n" |
coisme | 0:f96053986356 | 49 | "ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\n" |
coisme | 0:f96053986356 | 50 | "uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\n" |
coisme | 0:f96053986356 | 51 | "Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\n" |
coisme | 0:f96053986356 | 52 | "tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\n" |
coisme | 0:f96053986356 | 53 | "PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\n" |
coisme | 0:f96053986356 | 54 | "hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\n" |
coisme | 0:f96053986356 | 55 | "5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\n" |
coisme | 0:f96053986356 | 56 | "-----END CERTIFICATE-----\n"; |
coisme | 0:f96053986356 | 57 | |
coisme | 0:f96053986356 | 58 | int main(int argc, char* argv[]) { |
coisme | 0:f96053986356 | 59 | printf("HelloTSLSocket, HTTPS example of TLSSocket\r\n"); |
coisme | 0:f96053986356 | 60 | |
coisme | 0:f96053986356 | 61 | NetworkInterface* network = NULL; |
coisme | 0:f96053986356 | 62 | network = easy_connect(false); // If true, prints out connection details. |
coisme | 0:f96053986356 | 63 | if (!network) { |
coisme | 0:f96053986356 | 64 | printf("Unable to open network interface.\r\n"); |
coisme | 0:f96053986356 | 65 | return -1; |
coisme | 0:f96053986356 | 66 | } |
coisme | 0:f96053986356 | 67 | |
coisme | 0:f96053986356 | 68 | TLSSocket socket = TLSSocket(); |
coisme | 0:f96053986356 | 69 | if(socket.open(network) != 0) { |
coisme | 0:f96053986356 | 70 | printf("Unable to open TLS socket.\r\n"); |
coisme | 0:f96053986356 | 71 | return -1; |
coisme | 0:f96053986356 | 72 | } |
coisme | 0:f96053986356 | 73 | |
coisme | 0:f96053986356 | 74 | if(socket.connect(HOST_NAME, PORT, ROOT_CA_PEM) != 0) { |
coisme | 0:f96053986356 | 75 | printf("Failed to connect to the server."); |
coisme | 0:f96053986356 | 76 | return -1; |
coisme | 0:f96053986356 | 77 | } |
coisme | 0:f96053986356 | 78 | |
coisme | 0:f96053986356 | 79 | const size_t buf_size = 2048; |
coisme | 0:f96053986356 | 80 | char *buf = new char[buf_size]; |
coisme | 0:f96053986356 | 81 | |
coisme | 0:f96053986356 | 82 | int len = snprintf(buf, buf_size, "GET %s HTTP/1.1\nHost: %s\n\n", |
coisme | 0:f96053986356 | 83 | HTTPS_PATH, HOST_NAME); |
coisme | 0:f96053986356 | 84 | |
coisme | 0:f96053986356 | 85 | printf("%s", buf); |
coisme | 0:f96053986356 | 86 | int rc = 0; |
coisme | 0:f96053986356 | 87 | rc = socket.send(buf, len); |
coisme | 0:f96053986356 | 88 | if(rc < 0) { |
coisme | 0:f96053986356 | 89 | printf("send error.\r\n"); |
coisme | 0:f96053986356 | 90 | return -1; |
coisme | 0:f96053986356 | 91 | } |
coisme | 0:f96053986356 | 92 | |
coisme | 0:f96053986356 | 93 | while((rc = socket.recv(buf, buf_size - 1)) > 0) { |
coisme | 0:f96053986356 | 94 | buf[rc] = '\0'; |
coisme | 0:f96053986356 | 95 | printf("%s", buf); |
coisme | 0:f96053986356 | 96 | } |
coisme | 0:f96053986356 | 97 | |
coisme | 0:f96053986356 | 98 | if(rc < 0) { |
coisme | 0:f96053986356 | 99 | printf("\r\n! Read failed. err code = %d\r\n", rc); |
coisme | 0:f96053986356 | 100 | } |
coisme | 0:f96053986356 | 101 | printf("DONE.\r\n"); |
coisme | 0:f96053986356 | 102 | delete[] buf; |
coisme | 0:f96053986356 | 103 | |
coisme | 0:f96053986356 | 104 | socket.close(); |
coisme | 0:f96053986356 | 105 | } |