3636import software .amazon .awssdk .crt .mqtt .MqttMessage ;
3737import software .amazon .awssdk .crt .mqtt .QualityOfService ;
3838import software .amazon .awssdk .crt .mqtt .WebsocketHandshakeTransformArgs ;
39+ import software .amazon .awssdk .crt .internal .IoTDeviceSDKMetrics ;
3940
4041/**
4142 * A central class for building Mqtt connections without manually managing a large variety of native objects (some
@@ -60,6 +61,7 @@ public final class AwsIotMqttConnectionBuilder extends CrtResource {
6061 private boolean resetLazilyCreatedResources = true ;
6162 // Used to detect if we need to set the ALPN list for custom authorizer
6263 private boolean isUsingCustomAuthorizer = false ;
64+ private CertificateSource certificateSource = null ;
6365
6466 private void resetDefaultPort () {
6567 if (TlsContextOptions .isAlpnSupported ()) {
@@ -106,7 +108,9 @@ protected void releaseNativeHandle() {}
106108 */
107109 public static AwsIotMqttConnectionBuilder newMtlsBuilderFromPath (String certPath , String privateKeyPath ) {
108110 try (TlsContextOptions tlsContextOptions = TlsContextOptions .createWithMtlsFromPath (certPath , privateKeyPath )) {
109- return new AwsIotMqttConnectionBuilder (tlsContextOptions );
111+ AwsIotMqttConnectionBuilder builder = new AwsIotMqttConnectionBuilder (tlsContextOptions );
112+ builder .certificateSource = CertificateSource .CERTIFICATE_FILES ;
113+ return builder ;
110114 }
111115 }
112116
@@ -119,7 +123,9 @@ public static AwsIotMqttConnectionBuilder newMtlsBuilderFromPath(String certPath
119123 */
120124 public static AwsIotMqttConnectionBuilder newMtlsBuilder (String certificate , String privateKey ) {
121125 try (TlsContextOptions tlsContextOptions = TlsContextOptions .createWithMtls (certificate , privateKey )) {
122- return new AwsIotMqttConnectionBuilder (tlsContextOptions );
126+ AwsIotMqttConnectionBuilder builder = new AwsIotMqttConnectionBuilder (tlsContextOptions );
127+ builder .certificateSource = CertificateSource .CERTIFICATE_FILES ;
128+ return builder ;
123129 }
124130 }
125131
@@ -146,7 +152,9 @@ public static AwsIotMqttConnectionBuilder newMtlsBuilder(byte[] certificate, byt
146152 */
147153 public static AwsIotMqttConnectionBuilder newMtlsPkcs11Builder (TlsContextPkcs11Options pkcs11Options ) {
148154 try (TlsContextOptions tlsContextOptions = TlsContextOptions .createWithMtlsPkcs11 (pkcs11Options )) {
149- return new AwsIotMqttConnectionBuilder (tlsContextOptions );
155+ AwsIotMqttConnectionBuilder builder = new AwsIotMqttConnectionBuilder (tlsContextOptions );
156+ builder .certificateSource = CertificateSource .PKCS11 ;
157+ return builder ;
150158 }
151159 }
152160
@@ -158,7 +166,9 @@ public static AwsIotMqttConnectionBuilder newMtlsPkcs11Builder(TlsContextPkcs11O
158166 */
159167 public static AwsIotMqttConnectionBuilder newMtlsCustomKeyOperationsBuilder (TlsContextCustomKeyOperationOptions operationOptions ) {
160168 try (TlsContextOptions tlsContextOptions = TlsContextOptions .createWithMtlsCustomKeyOperations (operationOptions )) {
161- return new AwsIotMqttConnectionBuilder (tlsContextOptions );
169+ AwsIotMqttConnectionBuilder builder = new AwsIotMqttConnectionBuilder (tlsContextOptions );
170+ builder .certificateSource = CertificateSource .CERTIFICATE_FILES ;
171+ return builder ;
162172 }
163173 }
164174
@@ -176,7 +186,9 @@ public static AwsIotMqttConnectionBuilder newMtlsCustomKeyOperationsBuilder(TlsC
176186 public static AwsIotMqttConnectionBuilder newMtlsWindowsCertStorePathBuilder (String certificatePath ) {
177187 try (TlsContextOptions tlsContextOptions = TlsContextOptions
178188 .createWithMtlsWindowsCertStorePath (certificatePath )) {
179- return new AwsIotMqttConnectionBuilder (tlsContextOptions );
189+ AwsIotMqttConnectionBuilder builder = new AwsIotMqttConnectionBuilder (tlsContextOptions );
190+ builder .certificateSource = CertificateSource .WINDOWS_CERT_STORE ;
191+ return builder ;
180192 }
181193 }
182194
@@ -195,7 +207,9 @@ public static AwsIotMqttConnectionBuilder newJavaKeystoreBuilder(
195207 java .security .KeyStore keyStore , String certificateAlias , String certificatePassword ) throws CrtRuntimeException {
196208 try (TlsContextOptions tlsContextOptions = TlsContextOptions
197209 .createWithMtlsJavaKeystore (keyStore , certificateAlias , certificatePassword )) {
198- return new AwsIotMqttConnectionBuilder (tlsContextOptions );
210+ AwsIotMqttConnectionBuilder builder = new AwsIotMqttConnectionBuilder (tlsContextOptions );
211+ builder .certificateSource = CertificateSource .JAVA_KEYSTORE ;
212+ return builder ;
199213 }
200214 }
201215
@@ -211,7 +225,9 @@ public static AwsIotMqttConnectionBuilder newJavaKeystoreBuilder(
211225 public static AwsIotMqttConnectionBuilder newMtlsPkcs12Builder (
212226 String pkcs12Path , String pkcs12Password ) {
213227 try (TlsContextOptions tlsContextOptions = TlsContextOptions .createWithMtlsPkcs12 (pkcs12Path , pkcs12Password )) {
214- return new AwsIotMqttConnectionBuilder (tlsContextOptions );
228+ AwsIotMqttConnectionBuilder builder = new AwsIotMqttConnectionBuilder (tlsContextOptions );
229+ builder .certificateSource = CertificateSource .PKCS12_FILE ;
230+ return builder ;
215231 }
216232 }
217233
@@ -759,6 +775,10 @@ public MqttClientConnection build() {
759775
760776 resetLazilyCreatedResources = false ;
761777
778+ // Set SDK metrics for the CRT layer to embed in the CONNECT packet username
779+ IoTDeviceSDKMetrics sdkMetrics = IoTSdkMetrics .buildSdkMetrics (this .certificateSource );
780+ config .setMetrics (sdkMetrics );
781+
762782 // Connection create
763783 try (MqttConnectionConfig connectionConfig = config .clone ()) {
764784
0 commit comments