Пример #1
0
        public CertificateRequest RequestCertificate(string csrContent)
        {
            AssertInit();
            AssertRegistration();

            var requMsg = new NewCertRequest
            {
                Csr = csrContent
            };

            var resp = RequestHttpPost(new Uri(RootUrl,
                    Directory[AcmeServerDirectory.RES_NEW_CERT]), requMsg);

            if (resp.IsError)
                throw new AcmeWebException(resp.Error as WebException,
                        "Unexpected error", resp);

            if (resp.StatusCode != HttpStatusCode.Created)
                throw new AcmeProtocolException("Unexpected response status code", resp);

            var uri = resp.Headers[AcmeProtocol.HEADER_LOCATION];
            if (string.IsNullOrEmpty(uri))
                throw new AcmeProtocolException("Response is missing a certificate resource URI", resp);

            // This may be available immediately or it may need to be requeried for
            var certRequ = new CertificateRequest
            {
                StatusCode = resp.StatusCode,
                CsrContent = csrContent,
                Uri = uri,
                Links = resp.Links,
            };
            certRequ.SetCertificateContent(resp.RawContent);

            return certRequ;
        }
Пример #2
0
        public void RefreshCertificateRequest(CertificateRequest certRequ, bool useRootUrl = false)
        {
            AssertInit();
            AssertRegistration();

            var requUri = new Uri(certRequ.Uri);
            if (useRootUrl)
                requUri = new Uri(RootUrl, requUri.PathAndQuery);

            var acmeResp = RequestHttpGet(requUri);

            if (acmeResp.StatusCode != HttpStatusCode.OK && acmeResp.StatusCode != HttpStatusCode.Accepted)
                throw new AcmeProtocolException("Unexpected response status code", acmeResp);

            certRequ.StatusCode = acmeResp.StatusCode;
            certRequ.Links = acmeResp.Links;
            certRequ.SetCertificateContent(acmeResp.RawContent);
            certRequ.RetryAfter = null;

            var certContent = acmeResp.RawContent;
            var retryAfter = acmeResp.Headers[AcmeProtocol.HEADER_RETRY_AFTER];
            if (!string.IsNullOrEmpty(retryAfter))
            {
                // According to spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.37)
                // this could be a number of seconds or a date, so we have to parse appropriately
                if (Regex.IsMatch(retryAfter, "[0-9]+"))
                {
                    certRequ.RetryAfter = DateTime.Now.AddSeconds(int.Parse(retryAfter));
                }
                else
                {
                    certRequ.RetryAfter = DateTime.Parse(retryAfter);
                }
            }
        }