public Websocket() { Credentials = FetchCredentials(); string requestUrl = Sigv4util.getSignedurl(Credentials); var factory = new MqttFactory(); mqttClient = factory.CreateMqttClient(); mqttClientOptions = new MqttClientOptionsBuilder(). WithWebSocketServer(requestUrl). WithKeepAlivePeriod(TimeSpan.FromMinutes(10)).Build(); }
public static string getSignedurl(WebsocketCredentials credentials) { string requestUrl; try { var requestDateTime = DateTime.UtcNow; string datetime = requestDateTime.ToString(ISO8601BasicFormat, CultureInfo.InvariantCulture); var date = requestDateTime.ToString(DateStringFormat, CultureInfo.InvariantCulture); string method = "GET"; string protocol = "wss"; string uri = "/mqtt"; string service = "iotdevicegateway"; string algorithm = "AWS4-HMAC-SHA256"; string credentialScope = date + "/" + credentials.region + "/" + service + "/" + "aws4_request"; string canonicalQuerystring = "X-Amz-Algorithm=" + algorithm; canonicalQuerystring += "&X-Amz-Credential=" + HttpHelper.UrlEncode(credentials.accessKey + '/' + credentialScope); canonicalQuerystring += "&X-Amz-Date=" + datetime; canonicalQuerystring += "&X-Amz-Expires=86400"; canonicalQuerystring += "&X-Amz-SignedHeaders=host"; string canonicalHeaders = "host:" + credentials.iotEndpoint + "\n"; var canonicalRequest = method + "\n" + uri + "\n" + canonicalQuerystring + "\n" + canonicalHeaders + "\n" + "host" + "\n" + EmptyBodySha256; byte[] hashValueCanonicalRequest = CanonicalRequestHashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(canonicalRequest)); var builder = new StringBuilder(); for (int i = 0; i < hashValueCanonicalRequest.Length; i++) { builder.Append(hashValueCanonicalRequest[i].ToString("x2")); } string byteString = builder.ToString(); var stringToSign = algorithm + "\n" + datetime + "\n" + credentialScope + "\n" + byteString; // compute the signing key var keyedHashAlgorithm = KeyedHashAlgorithm.Create(HmacSha256); keyedHashAlgorithm.Key = getSignatureKey(credentials.secretKey, date, credentials.region, service); var signingKey = keyedHashAlgorithm.Key; var signature = ComputeKeyedHash(HmacSha256, signingKey, Encoding.UTF8.GetBytes(stringToSign)); var signatureString = ToHexString(signature, true); canonicalQuerystring += "&X-Amz-Signature=" + signatureString; canonicalQuerystring += "&X-Amz-Security-Token=" + HttpHelper.UrlEncode(credentials.sessionToken); requestUrl = protocol + "://" + credentials.iotEndpoint + uri + "?" + canonicalQuerystring; } catch (Exception e) { throw new Sigv4UtilException("Unable to get signed url", e); } return(requestUrl); }