public static AuthorizationState Authorize(Target target) { var dnsIdentifier = target.Host; var webRootPath = target.WebRootPath; Console.WriteLine($"\nAuthorizing Identifier {dnsIdentifier} Using Challenge Type {AcmeProtocol.CHALLENGE_TYPE_HTTP}"); var authzState = client.AuthorizeIdentifier(dnsIdentifier); var challenge = client.GenerateAuthorizeChallengeAnswer(authzState, AcmeProtocol.CHALLENGE_TYPE_HTTP); var answerPath = Environment.ExpandEnvironmentVariables(Path.Combine(webRootPath, challenge.ChallengeAnswer.Key)); Console.WriteLine($" Writing challenge answer to {answerPath}"); var directory = Path.GetDirectoryName(answerPath); Directory.CreateDirectory(directory); File.WriteAllText(answerPath, challenge.ChallengeAnswer.Value); target.Plugin.BeforeAuthorize(target, answerPath); var answerUri = new Uri(new Uri("http://" + dnsIdentifier), challenge.ChallengeAnswer.Key); Console.WriteLine($" Answer should now be browsable at {answerUri}"); try { Console.WriteLine(" Submitting answer"); authzState.Challenges = new AuthorizeChallenge[] { challenge }; client.SubmitAuthorizeChallengeAnswer(authzState, AcmeProtocol.CHALLENGE_TYPE_HTTP, true); // have to loop to wait for server to stop being pending. // TODO: put timeout/retry limit in this loop while (authzState.Status == "pending") { Console.WriteLine(" Refreshing authorization"); Thread.Sleep(4000); // this has to be here to give ACME server a chance to think var newAuthzState = client.RefreshIdentifierAuthorization(authzState); if (newAuthzState.Status != "pending") { authzState = newAuthzState; } } Console.WriteLine($" Authorization Result: {authzState.Status}"); if (authzState.Status == "invalid") { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\n******************************************************************************"); Console.WriteLine($"The ACME server was probably unable to reach {answerUri}"); Console.WriteLine("\nCheck in a browser to see if the answer file is being served correctly."); target.Plugin.OnAuthorizeFail(target); Console.WriteLine("\n******************************************************************************"); Console.ResetColor(); } //if (authzState.Status == "valid") //{ // var authPath = Path.Combine(configPath, dnsIdentifier + ".auth"); // Console.WriteLine($" Saving authorization record to: {authPath}"); // using (var authStream = File.Create(authPath)) // authzState.Save(authStream); //} return(authzState); } finally { if (authzState.Status == "valid") { Console.WriteLine(" Deleting answer"); File.Delete(answerPath); } } }