{"action":"created","issue":{"url":"https://api.github.com/repos/letsencrypt/boulder/issues/935","labels_url":"https://api.github.com/repos/letsencrypt/boulder/issues/935/labels{/name}","comments_url":"https://api.github.com/repos/letsencrypt/boulder/issues/935/comments","events_url":"https://api.github.com/repos/letsencrypt/boulder/issues/935/events","html_url":"https://github.com/letsencrypt/boulder/pull/935","id":110147922,"number":935,"title":"Expose an asynchronous issuance API","user":{"login":"bifurcation","id":75597,"avatar_url":"https://avatars.githubusercontent.com/u/75597?v=3","gravatar_id":"","url":"https://api.github.com/users/bifurcation","html_url":"https://github.com/bifurcation","followers_url":"https://api.github.com/users/bifurcation/followers","following_url":"https://api.github.com/users/bifurcation/following{/other_user}","gists_url":"https://api.github.com/users/bifurcation/gists{/gist_id}","starred_url":"https://api.github.com/users/bifurcation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bifurcation/subscriptions","organizations_url":"https://api.github.com/users/bifurcation/orgs","repos_url":"https://api.github.com/users/bifurcation/repos","events_url":"https://api.github.com/users/bifurcation/events{/privacy}","received_events_url":"https://api.github.com/users/bifurcation/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/letsencrypt/boulder/labels/priority-pr","name":"priority-pr","color":"e11d21"},{"url":"https://api.github.com/repos/letsencrypt/boulder/labels/spec-compliance","name":"spec-compliance","color":"eb6420"}],"state":"open","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/letsencrypt/boulder/milestones/6","html_url":"https://github.com/letsencrypt/boulder/milestones/General%20Availability","labels_url":"https://api.github.com/repos/letsencrypt/boulder/milestones/6/labels","id":1121569,"number":6,"title":"General Availability","description":"","creator":{"login":"bdaehlie","id":84762,"avatar_url":"https://avatars.githubusercontent.com/u/84762?v=3","gravatar_id":"","url":"https://api.github.com/users/bdaehlie","html_url":"https://github.com/bdaehlie","followers_url":"https://api.github.com/users/bdaehlie/followers","following_url":"https://api.github.com/users/bdaehlie/following{/other_user}","gists_url":"https://api.github.com/users/bdaehlie/gists{/gist_id}","starred_url":"https://api.github.com/users/bdaehlie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bdaehlie/subscriptions","organizations_url":"https://api.github.com/users/bdaehlie/orgs","repos_url":"https://api.github.com/users/bdaehlie/repos","events_url":"https://api.github.com/users/bdaehlie/events{/privacy}","received_events_url":"https://api.github.com/users/bdaehlie/received_events","type":"User","site_admin":false},"open_issues":35,"closed_issues":89,"state":"open","created_at":"2015-05-20T16:53:19Z","updated_at":"2015-10-07T03:58:31Z","due_on":"2015-11-20T08:00:00Z","closed_at":null},"comments":1,"created_at":"2015-10-07T03:57:05Z","updated_at":"2015-10-07T03:58:35Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/letsencrypt/boulder/pulls/935","html_url":"https://github.com/letsencrypt/boulder/pull/935","diff_url":"https://github.com/letsencrypt/boulder/pull/935.diff","patch_url":"https://github.com/letsencrypt/boulder/pull/935.patch"},"body":"**NOTE** This PR is provisional.  It may need a couple of rounds of review, but I wanted to go ahead and post it to get Travis started.\r\n\r\nThis is take 3, after learning from #590 and #876.  I think this one strikes a better balance than those two between disruption/risk and exposing the new stuff we need to expose.\r\n\r\nThis PR does everything short of actually making things synchronous.  It makes all the separations that will be necessary for actually being asynchronous, but issuance is still done synchronously for now.  Important concepts:\r\n\r\n* There is now a concept of a \"certificate request\", which is effectively a cached CSR from which certificates can be issued.\r\n* Internally, issuance is now in two steps: (1) Vet and cache the CSR, and (2) Issue a certificate from that CSR.\r\n* The WFE now has two new endpoints (in addition to the old ones)\r\n  * \"new certificate request\" - This represents the async flavor of the new-cert endpoint in the spec, returning 201 with no body in response to challenges\r\n  * \"certificate request\" - This is the \"logical\" cert endpoint, representing the latest cert under this CSR.  It returns:\r\n    * 200/OK - if there has been a cert issued under the CSR\r\n    * 202/Accepted - if issuance is still pending\r\n    * 4XX - if there was an error in issuance (precise code TBD)\r\n* The Link headers and directory still point to the legacy/sync \"new-cert\" endpoint, so clients will go there by default.  They can hard-wire to cert-req if they want to get the async experience before the cut-over (#934).\r\n\r\nThough the changes here might look big-ish, but they're mostly moving code from one place to another so that the break points are in the right place.  The only really new stuff is the CSR caching.\r\n\r\n"},"comment":{"url":"https://api.github.com/repos/letsencrypt/boulder/issues/comments/146071853","html_url":"https://github.com/letsencrypt/boulder/pull/935#issuecomment-146071853","issue_url":"https://api.github.com/repos/letsencrypt/boulder/issues/935","id":146071853,"user":{"login":"bifurcation","id":75597,"avatar_url":"https://avatars.githubusercontent.com/u/75597?v=3","gravatar_id":"","url":"https://api.github.com/users/bifurcation","html_url":"https://github.com/bifurcation","followers_url":"https://api.github.com/users/bifurcation/followers","following_url":"https://api.github.com/users/bifurcation/following{/other_user}","gists_url":"https://api.github.com/users/bifurcation/gists{/gist_id}","starred_url":"https://api.github.com/users/bifurcation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bifurcation/subscriptions","organizations_url":"https://api.github.com/users/bifurcation/orgs","repos_url":"https://api.github.com/users/bifurcation/repos","events_url":"https://api.github.com/users/bifurcation/events{/privacy}","received_events_url":"https://api.github.com/users/bifurcation/received_events","type":"User","site_admin":false},"created_at":"2015-10-07T03:58:35Z","updated_at":"2015-10-07T03:58:35Z","body":"Carrying over labels/milestone from #876 "}}