@@ -76,8 +76,27 @@ static int mTestDone = 0;
7676
7777#define AWSIOT_PUBLISH_MSG_SZ 400
7878
79- /* Demo Certificates */
79+ /* Demo Certificates
80+ *
81+ * Default: Amazon Root CA 1 + Starfield Services Root CA G2, the trust
82+ * anchors AWS IoT documents for ATS endpoints. Sources:
83+ * https://www.amazontrust.com/repository/AmazonRootCA1.pem
84+ * https://www.amazontrust.com/repository/SFSRootCAG2.pem
85+ *
86+ * Note: Starfield Services Root CA G2 has serialNumber=0, so wolfSSL's
87+ * default strict ASN parser drops it. Builds that need real chain
88+ * verification against AWS IoT must define WOLFSSL_NO_ASN_STRICT.
89+ *
90+ * Regression toggle: define WOLFMQTT_AWSIOT_LEGACY_VERISIGN_CA at build
91+ * time to restore the pre-fix VeriSign Class 3 G5 root. That CA was
92+ * deprecated by AWS IoT Core (see AWS server-authentication docs) and
93+ * no longer verifies any AWS IoT chain; the toggle exists so the test
94+ * can assert that strict verification rejects the old anchor.
95+ */
96+ #ifdef WOLFMQTT_AWSIOT_LEGACY_VERISIGN_CA
8097WOLFMQTT_EXAMPLE_CERT const char * root_ca =
98+ /* VeriSign Class 3 Public Primary Certification Authority - G5
99+ * (deprecated by AWS IoT Core; preserved only for regression testing). */
81100"-----BEGIN CERTIFICATE-----\n"
82101"MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\n"
83102"yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n"
@@ -106,6 +125,55 @@ WOLFMQTT_EXAMPLE_CERT const char* root_ca =
106125"4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\n"
107126"hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n"
108127"-----END CERTIFICATE-----" ;
128+ #else
129+ WOLFMQTT_EXAMPLE_CERT const char * root_ca =
130+ /* Amazon Root CA 1 */
131+ "-----BEGIN CERTIFICATE-----\n"
132+ "MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n"
133+ "ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n"
134+ "b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n"
135+ "MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\n"
136+ "b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\n"
137+ "ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n"
138+ "9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\n"
139+ "IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\n"
140+ "VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n"
141+ "93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\n"
142+ "jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
143+ "AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\n"
144+ "A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\n"
145+ "U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\n"
146+ "N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\n"
147+ "o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n"
148+ "5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\n"
149+ "rqXRfboQnoZsG4q5WTP468SQvvG5\n"
150+ "-----END CERTIFICATE-----\n"
151+ /* Starfield Services Root Certificate Authority - G2 */
152+ "-----BEGIN CERTIFICATE-----\n"
153+ "MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\n"
154+ "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\n"
155+ "HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\n"
156+ "ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\n"
157+ "MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\n"
158+ "VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\n"
159+ "ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\n"
160+ "dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\n"
161+ "hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\n"
162+ "OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\n"
163+ "8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\n"
164+ "Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\n"
165+ "hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\n"
166+ "6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\n"
167+ "DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\n"
168+ "AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\n"
169+ "bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\n"
170+ "ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\n"
171+ "qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\n"
172+ "iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\n"
173+ "0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\n"
174+ "sSi6\n"
175+ "-----END CERTIFICATE-----" ;
176+ #endif /* WOLFMQTT_AWSIOT_LEGACY_VERISIGN_CA */
109177
110178#if 0
111179static const char * device_pub_key =
@@ -214,9 +282,21 @@ static int mqtt_aws_tls_verify_cb(int preverify, WOLFSSL_X509_STORE_CTX* store)
214282 PRINTF (" Subject's domain name is %s" , store -> domain );
215283
216284 if (store -> error != 0 ) {
217- /* Allowing to continue */
218- /* Should check certificate and return 0 if not okay */
285+ #ifdef WOLFSSL_NO_ASN_STRICT
286+ /* With WOLFSSL_NO_ASN_STRICT the full AWS IoT trust bundle
287+ * (Amazon Root CA 1 + Starfield Services Root CA G2) loads and
288+ * a real chain must verify. Treat any error as a hard failure
289+ * so regressions in the trust bundle or the server chain are
290+ * caught by scripts/awsiot.test instead of being masked. */
291+ PRINTF (" Rejecting cert: verification must succeed under"
292+ " WOLFSSL_NO_ASN_STRICT" );
293+ return 0 ;
294+ #else
295+ /* Strict ASN parsing drops Starfield Services Root CA G2
296+ * (serialNumber=0), so chain verification can legitimately
297+ * fail here. Keep the demo running. */
219298 PRINTF (" Allowing cert anyways" );
299+ #endif
220300 }
221301
222302 return 1 ;
@@ -227,6 +307,10 @@ static int mqtt_aws_tls_cb(MqttClient* client)
227307{
228308 int rc = WOLFSSL_FAILURE ;
229309
310+ #ifdef DEBUG_WOLFSSL
311+ wolfSSL_Debugging_ON ();
312+ #endif
313+
230314 /* Use highest available and allow downgrade. If wolfSSL is built with
231315 * old TLS support, it is possible for a server to force a downgrade to
232316 * an insecure version. */
0 commit comments