示例#1
0
        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");
            });
        }
示例#2
0
        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");
            });
        }
示例#3
0
        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");
            });
        }
示例#4
0
        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);
            }
        }
示例#5
0
        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);
            }
        }
示例#6
0
        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");
            });
        }