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.

Committer:
Osamu Koizumi
Date:
Tue Apr 24 17:24:26 2018 +0900
Revision:
6:75b01b028cd4
Parent:
3:cf61a5596cf2
Child:
7:fc43e66fb54a
Updated TLSSocket library. Changed to use new operator to create an instance of TLSSocket, to reduce stack use.

Who changed what in which revision?

UserRevisionLine numberNew 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
Osamu Koizumi 3:cf61a5596cf2 5 #include "mbed-trace/mbed_trace.h"
Osamu Koizumi 3:cf61a5596cf2 6
coisme 0:f96053986356 7 const char* HOST_NAME = "os.mbed.com";
coisme 0:f96053986356 8 const int PORT = 443;
coisme 0:f96053986356 9 const char* HTTPS_PATH = "/";
coisme 0:f96053986356 10 const char* ROOT_CA_PEM = /* Root CA of os.mbed.com */
coisme 0:f96053986356 11 "-----BEGIN CERTIFICATE-----\n"
coisme 0:f96053986356 12 "MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\n"
coisme 0:f96053986356 13 "A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\n"
coisme 0:f96053986356 14 "b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\n"
coisme 0:f96053986356 15 "MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\n"
coisme 0:f96053986356 16 "YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\n"
coisme 0:f96053986356 17 "aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\n"
coisme 0:f96053986356 18 "jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\n"
coisme 0:f96053986356 19 "xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\n"
coisme 0:f96053986356 20 "1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\n"
coisme 0:f96053986356 21 "snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\n"
coisme 0:f96053986356 22 "U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\n"
coisme 0:f96053986356 23 "9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\n"
coisme 0:f96053986356 24 "BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\n"
coisme 0:f96053986356 25 "AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\n"
coisme 0:f96053986356 26 "yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\n"
coisme 0:f96053986356 27 "38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\n"
coisme 0:f96053986356 28 "AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\n"
coisme 0:f96053986356 29 "DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\n"
coisme 0:f96053986356 30 "HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n"
coisme 0:f96053986356 31 "-----END CERTIFICATE-----";
coisme 0:f96053986356 32
coisme 0:f96053986356 33
coisme 0:f96053986356 34 int main(int argc, char* argv[]) {
Osamu Koizumi 3:cf61a5596cf2 35 mbed_trace_init();
Osamu Koizumi 3:cf61a5596cf2 36
coisme 0:f96053986356 37 printf("HelloTSLSocket, HTTPS example of TLSSocket\r\n");
Osamu Koizumi 1:65339c530def 38 printf("\r\n");
coisme 0:f96053986356 39
Osamu Koizumi 1:65339c530def 40 // Open a network interface
coisme 0:f96053986356 41 NetworkInterface* network = NULL;
coisme 0:f96053986356 42 network = easy_connect(false); // If true, prints out connection details.
coisme 0:f96053986356 43 if (!network) {
coisme 0:f96053986356 44 printf("Unable to open network interface.\r\n");
coisme 0:f96053986356 45 return -1;
coisme 0:f96053986356 46 }
coisme 0:f96053986356 47
Osamu Koizumi 1:65339c530def 48 // Create a TLS socket
Osamu Koizumi 6:75b01b028cd4 49 TLSSocket* socket = new TLSSocket();
Osamu Koizumi 6:75b01b028cd4 50 if(socket->open(network) != 0) {
coisme 0:f96053986356 51 printf("Unable to open TLS socket.\r\n");
coisme 0:f96053986356 52 return -1;
coisme 0:f96053986356 53 }
Osamu Koizumi 1:65339c530def 54
Osamu Koizumi 1:65339c530def 55 // Connect to the server, including TLS handshake
Osamu Koizumi 6:75b01b028cd4 56 if(socket->connect(HOST_NAME, PORT, ROOT_CA_PEM) != 0) {
coisme 0:f96053986356 57 printf("Failed to connect to the server.");
coisme 0:f96053986356 58 return -1;
coisme 0:f96053986356 59 }
coisme 0:f96053986356 60
Osamu Koizumi 6:75b01b028cd4 61 const size_t buf_size = 1024;
coisme 0:f96053986356 62 char *buf = new char[buf_size];
coisme 0:f96053986356 63
Osamu Koizumi 1:65339c530def 64 // Send HTTP request
Osamu Koizumi 1:65339c530def 65 /* "Connection: close" header is specified to detect end of the body
Osamu Koizumi 1:65339c530def 66 * contents by connection close notification. If this is not specified,
Osamu Koizumi 1:65339c530def 67 * connection is kept, and need to detect end of the content in another
Osamu Koizumi 1:65339c530def 68 * way.
Osamu Koizumi 1:65339c530def 69 */
Osamu Koizumi 1:65339c530def 70 int len = snprintf(buf, buf_size,
Osamu Koizumi 1:65339c530def 71 "GET %s HTTP/1.1\n"
Osamu Koizumi 1:65339c530def 72 "Host: %s\n"
Osamu Koizumi 1:65339c530def 73 "Connection: close\n"
Osamu Koizumi 1:65339c530def 74 "\n", HTTPS_PATH, HOST_NAME);
Osamu Koizumi 1:65339c530def 75 printf("\r\n%s", buf);
coisme 0:f96053986356 76 int rc = 0;
Osamu Koizumi 6:75b01b028cd4 77 rc = socket->send(buf, len);
coisme 0:f96053986356 78 if(rc < 0) {
coisme 0:f96053986356 79 printf("send error.\r\n");
coisme 0:f96053986356 80 return -1;
coisme 0:f96053986356 81 }
Osamu Koizumi 1:65339c530def 82
Osamu Koizumi 6:75b01b028cd4 83 // Receive response from the server
Osamu Koizumi 6:75b01b028cd4 84 while((rc = socket->recv(buf, buf_size - 1)) > 0) {
coisme 0:f96053986356 85 buf[rc] = '\0';
coisme 0:f96053986356 86 printf("%s", buf);
coisme 0:f96053986356 87 }
coisme 0:f96053986356 88 if(rc < 0) {
coisme 0:f96053986356 89 printf("\r\n! Read failed. err code = %d\r\n", rc);
coisme 0:f96053986356 90 }
Osamu Koizumi 1:65339c530def 91
Osamu Koizumi 1:65339c530def 92 // Done
Osamu Koizumi 1:65339c530def 93 printf("HelloTSLSocket DONE.\r\n");
coisme 0:f96053986356 94 delete[] buf;
coisme 0:f96053986356 95
Osamu Koizumi 6:75b01b028cd4 96 socket->close();
Osamu Koizumi 6:75b01b028cd4 97 delete socket;
coisme 0:f96053986356 98 }