private async void refreshAccountButton_Click(object sender, EventArgs e) { var url = ResolveCaServerEndpoint(); if (url == null) { return; } await InvokeWithWaitCursor(async() => { var signer = new PkiJwsTool(256); signer.Import(_account.JwsSigner); using (var acme = new AcmeProtocolClient(url, signer: signer, acct: _account.Details)) { var dir = await acme.GetDirectoryAsync(); acme.Directory = dir; await acme.GetNonceAsync(); var details = await acme.UpdateAccountAsync(); _account.Details = details; Repo.SaveAccount(_account); } RebindAccountControls(); SetStatus("Account refreshed and saved"); }); }
private async void createAccountButton_Click(object sender, EventArgs e) { if (!agreeTosCheckbox.Checked) { MessageBox.Show("You must agree to the Terms of Service.", "Terms of Service", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } var url = ResolveCaServerEndpoint(); if (url == null) { return; } var contacts = ResolveEmailContacts(); if (contacts == null) { return; } await InvokeWithWaitCursor(async() => { var signer = new PkiJwsTool(256); signer.Init(); using (var acme = new AcmeProtocolClient(url, signer: signer)) { var dir = await acme.GetDirectoryAsync(); acme.Directory = dir; await acme.GetNonceAsync(); var details = await acme.CreateAccountAsync( contacts, agreeTosCheckbox.Checked, throwOnExistingAccount: true); var acct = new DbAccount { AcmeServerEndpoint = url.ToString(), JwsSigner = signer.Export(), Details = details, }; Repo.SaveAccount(acct); _account = acct; } RebindAccountControls(); SetStatus("Account created and saved"); }); }
private async void submitDnsAnswerButton_Click(object sender, EventArgs e) { var url = ResolveCaServerEndpoint(); if (url == null) { return; } await InvokeWithWaitCursor(async() => { var signer = new PkiJwsTool(256); signer.Import(_account.JwsSigner); using (var acme = new AcmeProtocolClient(url, signer: signer, acct: _account.Details)) { var dir = await acme.GetDirectoryAsync(); acme.Directory = dir; await acme.GetNonceAsync(); var dnsChallenge = SelectedAuthorization.Details.Challenges.First( x => x.Type == Dns01ChallengeValidationDetails.Dns01ChallengeType); var updatedDnsChallenge = await acme.AnswerChallengeAsync(dnsChallenge.Url); var details = await acme.GetOrderDetailsAsync( _lastOrder.Details.OrderUrl ?? _lastOrder.FirstOrderUrl); _lastOrder.Details = details; Repo.Saveorder(_lastOrder); RebindOrderControls(); SetStatus("DNS Challenge Answered; Order refreshed and saved"); await RefreshOrderAuthorizations(acme); } Repo.Saveorder(_lastOrder); RebindOrderControls(); SetStatus("DNS Challenge Answered; Order details and Authorizations refreshed and saved"); await DecodeOrderAuthorizationChallenges(signer); Repo.Saveorder(_lastOrder); RebindOrderControls(); SetStatus("DNS Challenge Answered; Order details and Authorizations refreshed, Challenges decoded and saved"); }); }
private async void agreeTosLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { var url = ResolveCaServerEndpoint(); if (url == null) { return; } var signer = new PkiJwsTool(256); using (var acme = new AcmeProtocolClient(url, signer: signer)) { var dir = await acme.GetDirectoryAsync(); if (string.IsNullOrEmpty(dir.Meta.TermsOfService)) { MessageBox.Show("CA Server directory meta data contains no ToS link.", "Missing ToS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } System.Diagnostics.Process.Start(dir.Meta.TermsOfService); } }
async Task CreateAccount() { var acmeUrl = new Uri(Program.LetsEncryptV2StagingEndpoint); _http = new HttpClient(); _http.BaseAddress = acmeUrl; var sample = Encoding.UTF8.GetBytes("abcdefg"); // var ecKeys = PkiKeyPair.GenerateEcdsaKeyPair(256); // var ecPrvKey = ecKeys.PrivateKey.Export(PkiEncodingFormat.Pem); // var ecPubKey = ecKeys.PublicKey.Export(PkiEncodingFormat.Pem); // WriteLine( // "getting from: " + acmeUrl // + "\r\necPrv: " + Convert.ToBase64String(ecPrvKey) // + "\r\necPub: " + Convert.ToBase64String(ecPubKey) // ); // var signer = new ACMESharp.Crypto.JOSE.Impl.ESJwsTool(); // signer.Init(); // WriteLine($"ECKeys: {signer.Export()}"); var signer = new PkiJwsTool(256); signer.Init(); var signerExport = signer.Export(); signer = new PkiJwsTool(256); signer.Import(signerExport); WriteLine($"ECKeys: {signerExport}"); var sig1 = signer.Sign(sample); WriteLine($"Sig: {Convert.ToBase64String(sig1)}"); sig1 = signer.Sign(sample); WriteLine($"Sig: {Convert.ToBase64String(sig1)}"); sig1 = signer.Sign(sample); WriteLine($"Sig: {Convert.ToBase64String(sig1)}"); WriteLine($"Vfy: {signer.Verify(sample, sig1)}"); WriteLine($"JWK: {JsonConvert.SerializeObject(signer.ExportJwk())}"); WriteLine("Sig1Hex: " + BitConverter.ToString(sig1)); // var ecAlt = JsonConvert.SerializeObject(signer.KeyPair.ExportEcParameters()); // WriteLine($"ECAlt: {ecAlt}"); // var signer2 = new ACMESharp.Crypto.JOSE.Impl.ESJwsTool(); // signer2.HashSize = 256; // signer2.Init(); // signer2.Import(ecAlt); // WriteLine($"ECKeys2: {signer2.Export()}"); // var sig2 = signer2.Sign(sample); // WriteLine($"Sig2: {Convert.ToBase64String(sig2)}"); // sig2 = signer2.Sign(sample); // WriteLine($"Sig2: {Convert.ToBase64String(sig2)}"); // sig2 = signer2.Sign(sample); // WriteLine($"Sig2: {Convert.ToBase64String(sig2)}"); // WriteLine($"Vfy2: {signer2.Verify(sample, sig2)}"); // WriteLine($"JWK2: {JsonConvert.SerializeObject(signer2.ExportJwk())}"); // WriteLine("Sig2Hex: " + BitConverter.ToString(sig2)); var lineSeps = "\r\n".ToCharArray(); using (var acme = new AcmeProtocolClient(_http, signer: signer)) { acme.BeforeAcmeSign = (s, o) => WriteLine($"BEFORE_SIGN({s}, {JsonConvert.SerializeObject(o)})"); acme.BeforeHttpSend = (s, m) => WriteLine($"BEFORE_SEND({s}, {m.Content?.ReadAsStringAsync().Result}"); var dir = await acme.GetDirectoryAsync(); acme.Directory = dir; await acme.GetNonceAsync(); var c = _contacts.Split(lineSeps, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()); var acct = await acme.CreateAccountAsync(c, _agreeTos); var acctStr = JsonConvert.SerializeObject(acct, Formatting.Indented); Console.WriteLine("Got Account: " + acctStr); } signer = new PkiJwsTool(256); signer.Import(signerExport); using (var acme = new AcmeProtocolClient(_http, signer: signer)) { acme.BeforeAcmeSign = (s, o) => WriteLine($"BEFORE_SIGN({s}, {JsonConvert.SerializeObject(o)})"); acme.BeforeHttpSend = (s, m) => WriteLine($"BEFORE_SEND({s}, {m.Content?.ReadAsStringAsync().Result}"); var dir = await acme.GetDirectoryAsync(); acme.Directory = dir; await acme.GetNonceAsync(); var d = _dnsNames.Split(lineSeps, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()); var order = await acme.CreateOrderAsync(d); var orderStr = JsonConvert.SerializeObject(order, Formatting.Indented); Console.WriteLine("Got Order: " + orderStr); } }
private async void createOrderButton_Click(object sender, EventArgs e) { var url = ResolveCaServerEndpoint(); if (url == null) { return; } var ids = ResolveDnsIdentifiers(); if (ids == null) { return; } var dateRange = ResolveOrderDateRange(); if (dateRange == null) { return; } await InvokeWithWaitCursor(async() => { var signer = new PkiJwsTool(256); signer.Import(_account.JwsSigner); using (var acme = new AcmeProtocolClient(url, signer: signer, acct: _account.Details)) { var dir = await acme.GetDirectoryAsync(); acme.Directory = dir; await acme.GetNonceAsync(); var details = await acme.CreateOrderAsync(ids, dateRange.Value.notBefore, dateRange.Value.notAfter); var order = new DbOrder { FirstOrderUrl = details.OrderUrl, Details = details, }; Repo.Saveorder(order); _lastOrder = order; RebindOrderControls(); SetStatus("Order created and saved"); await RefreshOrderAuthorizations(acme); } Repo.Saveorder(_lastOrder); RebindOrderControls(); SetStatus("Order created and Authorization resolved and saved"); await DecodeOrderAuthorizationChallenges(signer); Repo.Saveorder(_lastOrder); RebindOrderControls(); SetStatus("Order created, Authorizations resolved and Challenges decoded and saved"); }); }